Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
160d97c19b
|
||
|
|
c7c23b7958
|
||
|
|
2d6a9ad1b3
|
||
|
|
18105d3ced
|
||
|
|
f2a1ab3a72
|
||
|
|
ec1399f3f3
|
||
|
|
1d667d4dc0 | ||
|
|
c60975d532 | ||
|
|
816d22019b | ||
|
|
ddca14ece2 | ||
|
|
f5e26741da | ||
|
|
c5ab15118d | ||
|
|
2e00b6e4e4 | ||
|
|
8b483c6a1a | ||
|
|
1339b6291b | ||
|
|
0b69a66b73 | ||
|
|
ccb870aec2 | ||
|
|
73221469a3 | ||
|
|
95fccdfc30 | ||
|
|
078133bc5a | ||
|
|
c2c4b1a89a | ||
|
|
f52e4e5096 | ||
|
|
292cb319c3 | ||
|
|
c16d40d3b7 | ||
|
|
9dd1a86b19 | ||
|
|
e9dea3bb8a | ||
|
|
b1f6ca7b95 | ||
|
|
06449c3ecb | ||
|
|
62f6cb363e | ||
|
|
062d88d9a6 | ||
|
|
9697a311cc | ||
|
|
f125830e2c | ||
|
|
4b5d6b7205 | ||
|
|
c92ff8e3c7 | ||
|
|
d974af4c00 | ||
|
|
50eb62c6dc | ||
|
|
ae0d6235f9 | ||
|
|
76e1273188 | ||
|
|
15c05ebecb | ||
|
|
6d6ca2326f | ||
|
|
5a96a6a9bc | ||
|
|
73e6fcf492 | ||
|
|
60bd0a908b | ||
|
|
0ee31f4005 | ||
|
|
9a99507b98 | ||
|
|
2b2ec1c6af | ||
|
|
e16ef30a07 | ||
|
|
f3e23345a5 | ||
|
|
61d7383408 | ||
|
|
54a6be04ca | ||
|
|
86fb5edec7 | ||
|
|
d5ab7e64aa | ||
|
|
421ccb322a | ||
|
|
648c379c28 | ||
|
|
8541e93c8d | ||
|
|
d94ab0f523 | ||
|
|
9ceb37eacf | ||
|
|
9bab143e63 | ||
|
|
2071d3a7d8 | ||
|
|
36a18e7621 | ||
|
|
41c35eaa37 | ||
|
|
090ed57255 | ||
|
|
905ef46b1f | ||
|
|
2022f0e3ec | ||
|
|
1a6fde78fd | ||
|
|
4dc82926f2 | ||
|
|
2c3566cad5 | ||
|
|
146f63fd96 | ||
|
|
12a496bf7b | ||
|
|
9c4f3b204b | ||
|
|
5a8666ca0d | ||
|
|
2e4eaf5c08 | ||
|
|
882984d2b3 | ||
|
|
3fde3865d5 | ||
|
|
aa3b0e806a | ||
|
|
14ca62de7a | ||
|
|
d9ffc2e697 | ||
|
|
0986382e72 | ||
|
|
caa0ceea23 | ||
|
|
0b6c1028a7 | ||
|
|
0a8c410387 | ||
|
|
80a19f1797 | ||
|
|
a2bfdaaacc | ||
|
|
97a288dbe0 | ||
|
|
4f5a7d01fd | ||
|
|
34a0e5a4cc | ||
|
|
066f9445b4 | ||
|
|
3bf9a3091b | ||
|
|
146f6ff5d7 | ||
|
|
7faab2b89f | ||
|
|
f4281ec6d9 | ||
|
|
f46de4a524 | ||
|
|
69e99c95bc | ||
|
|
3befcc2e69 | ||
|
|
e5a2337a14 | ||
|
|
8410d5062e | ||
|
|
defe24c202 | ||
|
|
b5713564f6 | ||
|
|
ec861d8314 | ||
|
|
def96e5862 | ||
|
|
45f4619995 | ||
|
|
16ca4b0233 | ||
|
|
43b5831e87 | ||
|
|
4952af75b0 | ||
|
|
41bab9b8c9 | ||
|
|
9fd024b4d8 | ||
|
|
8d05c67577 | ||
|
|
61a28eb333 | ||
|
|
9930b83e87 | ||
|
|
616b5d945c | ||
|
|
b81fc14777 | ||
|
|
7d252ec039 | ||
|
|
3c890a3e59 | ||
|
|
f08670ba14 | ||
|
|
62f86ab9d8 | ||
|
|
5cc4d12685 | ||
|
|
04c00c675f | ||
|
|
482dcc0ddf | ||
|
|
37f22ae0de | ||
|
|
940bbdf949 | ||
|
|
0f03a8c2bf | ||
|
|
b61b7f25b8 | ||
|
|
f887590fec | ||
|
|
f3473159ac | ||
|
|
248a5c2208 | ||
|
|
7e98a6727d | ||
|
|
4724ddee1f | ||
|
|
06c2fe0463 | ||
|
|
31c6e597ea | ||
|
|
0a70f8b412 | ||
|
|
a694afc240 | ||
|
|
c77e8d3c4a | ||
|
|
7511d4c27f | ||
|
|
66d0d632df | ||
|
|
76e77cfc2e | ||
|
|
91f8cddb3c | ||
|
|
254409f486 | ||
|
|
607abcbd86 | ||
|
|
b2126c3db6 | ||
|
|
3313bd38ca | ||
|
|
062f9f37f7 | ||
|
|
143cce1cb8 | ||
|
|
9ec68688d6 | ||
|
|
6670bf75f6 | ||
|
|
d2029bdf5b | ||
|
|
64c4abe645 | ||
|
|
c3b826c3a4 | ||
|
|
90a87ebb5b | ||
|
|
3937b36260 | ||
|
|
8557dfd53a | ||
|
|
aef29db995 | ||
|
|
8d762218b4 | ||
|
|
63be1a965b | ||
|
|
0837376d00 | ||
|
|
1fbb4d67bb | ||
|
|
dd83ad69a9 | ||
|
|
ff73cc86fb | ||
|
|
c93438754f | ||
|
|
3b542acc47 | ||
|
|
473b455373 | ||
|
|
4ecdd4d803 | ||
|
|
9a67ff2fc1 | ||
|
|
eebe754c92 | ||
|
|
f285f2ff58 | ||
|
|
cf28882540 | ||
|
|
fc08babdaf | ||
|
|
666fc8f702 | ||
|
|
d2a28ca315 | ||
|
|
67e867a72e | ||
|
|
abe4e5b340 | ||
|
|
a5fdaf1f1c | ||
|
|
3b7b85e835 | ||
|
|
6119c57d46 | ||
|
|
6279b3b926 | ||
|
|
50b4e2bd07 | ||
|
|
252a8a8554 | ||
|
|
83fd6ad0c0 | ||
|
|
420f8f095b | ||
|
|
8a3ee3588d | ||
|
|
62e5e5e23e | ||
|
|
a456a4c9df | ||
|
|
9a9c1f50ee | ||
|
|
7ad8333f2e | ||
|
|
ec99102a78 | ||
|
|
36c7da623b | ||
|
|
7bb148eea9 | ||
|
|
ee039545be | ||
|
|
e15651ac9c | ||
|
|
f92e276a0d | ||
|
|
a51ef7bccc | ||
|
|
bf8a295d64 | ||
|
|
d2bbf6bb0e | ||
|
|
60cc5fbd4b | ||
|
|
dae851297b | ||
|
|
fa9eef757a | ||
|
|
84c36c5c68 | ||
|
|
4a71023452 | ||
|
|
359230bfb3 | ||
|
|
19fa38e441 | ||
|
|
e6105e19a5 | ||
|
|
e8b9f2aafc | ||
|
|
bcdd6e42ec | ||
|
|
b14dc3bcc3 | ||
|
|
798a9fb453 | ||
|
|
c81c08271b | ||
|
|
0957599bdb | ||
|
|
4ec2f6730b | ||
|
|
701439d6bc | ||
|
|
cade4a9051 | ||
|
|
d4bec36fa7 | ||
|
|
b83073f588 | ||
|
|
f36a80ad8b | ||
|
|
e2f16b8e2e | ||
|
|
8470b347a4 | ||
|
|
24f1cf7e17 | ||
|
|
aac0aa43d0 | ||
|
|
2c5db364ba | ||
|
|
bbf77d7b84 | ||
|
|
3250187fbb | ||
|
|
e3168c8231 | ||
|
|
6d98c56e7a | ||
|
|
bf986c079f | ||
|
|
f0d21fa985 |
@@ -1,19 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/ui authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
const base = require('@polkadot/dev/config/eslint.cjs');
|
||||
|
||||
module.exports = {
|
||||
...base,
|
||||
ignorePatterns: [
|
||||
...base.ignorePatterns,
|
||||
'jest/**/*',
|
||||
'**/*.d.ts'
|
||||
],
|
||||
parserOptions: {
|
||||
...base.parserOptions,
|
||||
project: [
|
||||
'./tsconfig.eslint.json'
|
||||
]
|
||||
}
|
||||
};
|
||||
@@ -11,6 +11,6 @@ jobs:
|
||||
steps:
|
||||
- uses: jacogr/action-approve@795afd1dd096a2071d7ec98740661af4e853b7da
|
||||
with:
|
||||
authors: jacogr
|
||||
authors: jacogr, TarikGul
|
||||
labels: -auto
|
||||
token: ${{ secrets.GH_PAT_BOT }}
|
||||
|
||||
@@ -13,13 +13,13 @@ jobs:
|
||||
- uses: dessant/lock-threads@c1b35aecc5cdb1a34539d14196df55838bb2f836
|
||||
with:
|
||||
github-token: ${{ secrets.GH_PAT_BOT }}
|
||||
issue-lock-inactive-days: '7'
|
||||
issue-lock-comment: >
|
||||
issue-inactive-days: '7'
|
||||
issue-comment: >
|
||||
This thread has been automatically locked since there has not been
|
||||
any recent activity after it was closed. Please open a new issue
|
||||
if you think you have a related problem or query.
|
||||
pr-lock-inactive-days: '2'
|
||||
pr-lock-comment: >
|
||||
pr-inactive-days: '2'
|
||||
pr-comment: >
|
||||
This pull request has been automatically locked since there
|
||||
has not been any recent activity after it was closed.
|
||||
Please open a new issue for related bugs.
|
||||
|
||||
@@ -11,11 +11,11 @@ jobs:
|
||||
env:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
- name: ${{ matrix.step }}
|
||||
run: |
|
||||
yarn install --immutable | grep -v 'YN0013'
|
||||
yarn install --immutable
|
||||
yarn ${{ matrix.step }}
|
||||
|
||||
@@ -18,14 +18,14 @@ jobs:
|
||||
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT_BOT }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GH_PAT_BOT }}
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
- name: ${{ matrix.step }}
|
||||
run: |
|
||||
yarn install --immutable | grep -v 'YN0013'
|
||||
yarn install --immutable
|
||||
yarn ${{ matrix.step }}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-shared authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module.exports = require('@polkadot/dev/config/prettier.cjs');
|
||||
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"eslint.enable": true,
|
||||
"eslint.experimental.useFlatConfig": true
|
||||
}
|
||||
Vendored
-363
File diff suppressed because one or more lines are too long
-550
File diff suppressed because one or more lines are too long
Vendored
-785
File diff suppressed because one or more lines are too long
+934
File diff suppressed because one or more lines are too long
+16
-6
@@ -1,13 +1,23 @@
|
||||
compressionLevel: mixed
|
||||
|
||||
enableGlobalCache: false
|
||||
|
||||
enableImmutableInstalls: false
|
||||
|
||||
enableProgressBars: false
|
||||
|
||||
logFilters:
|
||||
- code: YN0013
|
||||
level: discard
|
||||
|
||||
nodeLinker: node-modules
|
||||
|
||||
plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
||||
spec: "@yarnpkg/plugin-interactive-tools"
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-version.cjs
|
||||
spec: "@yarnpkg/plugin-version"
|
||||
yarnPath: .yarn/releases/yarn-4.5.1.cjs
|
||||
|
||||
yarnPath: .yarn/releases/yarn-3.2.0.cjs
|
||||
# @quantus packages come from the Gitea registry — safe as a whole-scope route
|
||||
# because we own every name in it. The forked @polkadot packages cannot be routed
|
||||
# the same way (most of that scope is unforked and lives on npm), so they are
|
||||
# pinned to tarball URLs in package.json resolutions instead.
|
||||
npmScopes:
|
||||
quantus:
|
||||
npmRegistryServer: "https://git.lair.cafe/api/packages/quantus/npm/"
|
||||
|
||||
+303
@@ -1,5 +1,308 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 3.16.7 Mar 25, 2026
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump common to 14.0.3 ([#860](https://github.com/polkadot-js/ui/pull/860))
|
||||
- Set headers for 2026 ([#859](https://github.com/polkadot-js/ui/pull/859))
|
||||
|
||||
|
||||
## 3.16.6 Dec 10, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot-js dependencies ([#855](https://github.com/polkadot-js/ui/pull/855))
|
||||
|
||||
|
||||
## 3.16.5 Dec 10, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot-js dependencies ([#855](https://github.com/polkadot-js/ui/pull/855))
|
||||
|
||||
|
||||
## 3.16.4 Nov 25, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot-js dependencies ([#853](https://github.com/polkadot-js/ui/pull/853))
|
||||
|
||||
|
||||
## 3.16.3 Nov 12, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot-js dependencies ([#850](https://github.com/polkadot-js/ui/pull/850))
|
||||
|
||||
|
||||
## 3.16.2 Oct 22, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot-js dependencies ([#848](https://github.com/polkadot-js/ui/pull/848))
|
||||
|
||||
|
||||
## 3.16.1 Aug 27, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- 3.15.5 ([#846](https://github.com/polkadot-js/ui/pull/846))
|
||||
- Upgraded polkadot deps ([#845](https://github.com/polkadot-js/ui/pull/845))
|
||||
|
||||
|
||||
## 3.15.4 Aug 13, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot deps ([#843](https://github.com/polkadot-js/ui/pull/843))
|
||||
|
||||
|
||||
## 3.15.3 July 30, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Update Beachball.tsx to remove duplication in strict mode ([#840](https://github.com/polkadot-js/ui/pull/840))
|
||||
- Bump polkadot deps ([#841](https://github.com/polkadot-js/ui/pull/841))
|
||||
|
||||
|
||||
## 3.15.2 July 2, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot deps ([#838](https://github.com/polkadot-js/ui/pull/838))
|
||||
|
||||
|
||||
## 3.15.1 Jun 18, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgraded polkadot deps ([#831](https://github.com/polkadot-js/ui/pull/831))
|
||||
|
||||
|
||||
## 3.14.1 May 23, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Add the type field to external keypair accounts ([#833](https://github.com/polkadot-js/ui/pull/833))
|
||||
- Upgrade polkadot-js/common to 13.5.1 ([#834](https://github.com/polkadot-js/ui/pull/834))
|
||||
|
||||
|
||||
## 3.13.1 Apr 16, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Add key validation for FileStore ([#830](https://github.com/polkadot-js/ui/pull/830))
|
||||
- Upgraded polkadot deps ([#831](https://github.com/polkadot-js/ui/pull/831))
|
||||
|
||||
|
||||
## 3.12.2 Feb 18, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump dev to v0.83.2 ([#827](https://github.com/polkadot-js/ui/pull/827))
|
||||
- Bump common to v13.4.3 ([#828](https://github.com/polkadot-js/ui/pull/828))
|
||||
|
||||
|
||||
## 3.12.1 Jan 8, 2025
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade common to 13.3.1 ([#824](https://github.com/polkadot-js/ui/pull/824))
|
||||
- Bump dev w/ ts ([#823](https://github.com/polkadot-js/ui/pull/823))
|
||||
- Update headers to 2025 ([#822](https://github.com/polkadot-js/ui/pull/822))
|
||||
|
||||
|
||||
## 3.11.3 Nov 12, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade polkadot/common to 13.2.3 ([817](https://github.com/polkadot-js/ui/pull/#))
|
||||
- Bump dev to 0.82.1 w/ tslib ([#816](https://github.com/polkadot-js/ui/pull/816))
|
||||
|
||||
|
||||
## 3.11.2 Oct 30, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade polkadot/common to 13.2.2 ([#814](https://github.com/polkadot-js/ui/pull/814))
|
||||
|
||||
|
||||
## 3.11.1 Oct 23, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade polkadot/common to 13.2.1 ([#811](https://github.com/polkadot-js/ui/pull/811))
|
||||
- Bump yarn to 4.5.1 ([#812](https://github.com/polkadot-js/ui/pull/812))
|
||||
- Bump dev 0.81.2 ([#810](https://github.com/polkadot-js/ui/pull/810))
|
||||
- Correctly exports CJS and ESM
|
||||
|
||||
|
||||
## 3.10.1 Sep 20, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade polkadot/common to 13.1.1 ([#808](https://github.com/polkadot-js/ui/pull/808))
|
||||
- Bump yarn to 4.4.0 ([#806](https://github.com/polkadot-js/ui/pull/806))
|
||||
|
||||
|
||||
## 3.9.1 Aug 13, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade @polkadot/dev to 0.79.3 ([#803](https://github.com/polkadot-js/ui/pull/803))
|
||||
- Add chainSpecific option for ledger ([#804](https://github.com/polkadot-js/ui/pull/804))
|
||||
|
||||
|
||||
## 3.8.3 July 31, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix Qr Scanner (Thanks to https://github.com/ryanleecode)
|
||||
|
||||
|
||||
## 3.8.2 July 22, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix ledgerApp bug, and remove legacy
|
||||
|
||||
|
||||
## 3.8.1 July 22, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Add new ledger app settings
|
||||
|
||||
|
||||
## 3.7.1 July 13, 2024
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade polkadot/common 13.0.2
|
||||
- Bump yarn to 4.3.1
|
||||
|
||||
|
||||
## 3.6.6 Apr 17, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add compatibility layer for H160 addresses (Thanks to https://github.com/vikiival)
|
||||
|
||||
Changes:
|
||||
|
||||
- Update ci checkout and setup_node to v4
|
||||
- Bump yarn to 4.1.1
|
||||
|
||||
|
||||
## 3.6.5 Feb 28, 2024
|
||||
|
||||
Changes
|
||||
|
||||
- Bump to `@polkadot/util` 12.6.2
|
||||
- Bump to `react-native-svg` 14.1.0
|
||||
- Adjust `Vue` peerDependency, >= 2.7 for defineComponent
|
||||
|
||||
|
||||
## 3.6.4 Nov 18, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 12.6.1
|
||||
|
||||
|
||||
## 3.6.3 Sep 15, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 12.5.1
|
||||
|
||||
|
||||
## 3.6.2 Aug 23, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 12.4.2
|
||||
|
||||
|
||||
## 3.6.1 Aug 21, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Update to latest React `styled-components`
|
||||
- Bump to `@polkadot/util` 12.4.1
|
||||
|
||||
|
||||
## 3.5.1 Jun 11, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust object index access for stricter tsconfig settings
|
||||
- Bump to `@polkadot/util` 12.3.1
|
||||
|
||||
|
||||
## 3.4.2 Jun 5, 2023
|
||||
|
||||
- Bump to `@polkadot/util` 12.2.2
|
||||
|
||||
|
||||
## 3.4.1 May 13, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `module` to `package.json` export map (ESM-only)
|
||||
- Bump to `@polkadot/util` 12.2.1
|
||||
|
||||
|
||||
## 3.3.1 May 7, 2023
|
||||
|
||||
Contributed:
|
||||
|
||||
- Adjust `vue-identicon` to be Vue 3 compatible (Thanks to https://github.com/Gavin-Gong)
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 12.1.2
|
||||
|
||||
|
||||
## 3.2.2 Apr 29, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Add missing `react-is` peer dependency for `styled-components`
|
||||
- Adjust compilation output for `__internal__` class fields
|
||||
- Bump to `@polkadot/util` 12.1.1
|
||||
|
||||
|
||||
## 3.2.1 Apr 22, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 12.0.1
|
||||
|
||||
|
||||
## 3.1.4 Apr 1, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump to `@polkadot/util` 11.1.3
|
||||
|
||||
|
||||
## 3.1.3 Mar 25, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Align `eventemitter` version with `@polkadot/api`
|
||||
|
||||
|
||||
## 3.1.2 Mar 25, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Cater for Ethereum-compatible multisig addresses
|
||||
- Bump to `@polkadot/util` 11.1.2
|
||||
|
||||
|
||||
## 3.1.1 Mar 19, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
+9
-2
@@ -1,4 +1,6 @@
|
||||
696 Jaco 3.1.1 (#739)
|
||||
735 Jaco Adjust Vue peerDependency, >= 2.7 for defineComponent (#782)
|
||||
41 Tarik Gul 3.16.7 (#861)
|
||||
22 Arjun Porwal 3.16.6 (#857)
|
||||
7 YJ fix #224: decrease frame size to 1024, set multipart bool (#225)
|
||||
4 Antoine Estienne Refactor logic to better use prefix (#491)
|
||||
4 kwingram25 fix ff api url issue (#289)
|
||||
@@ -8,6 +10,8 @@
|
||||
2 Drew Stone Add Edgeware testnet and mainnet updated endpoints (#274)
|
||||
2 Hanwen Cheng allow qr to scan seed qr (#330)
|
||||
2 Nikos Kontakis Fix undefined process error that may appear when using ui (#524)
|
||||
2 Valentin Fernandez 3.12.2
|
||||
2 Viki Val Add compatibility layer for H160 addresses (#789)
|
||||
2 Vlad Proshchavaiev Add Subsocial to ss58 defaults (#358)
|
||||
2 Xiliang Chen Update UNfrastructure node label (#160)
|
||||
2 雪霁 Batch export patch up (#455)
|
||||
@@ -21,16 +25,19 @@
|
||||
1 Derek Colley Remove redundant `div` wrappers in vue-identicon (#643)
|
||||
1 Harry Liu Update README.md (#166)
|
||||
1 Jake Naviasky Add Edgeware chain prefix to settings. (#317)
|
||||
1 Jeeyong Um Fix outdated links in README.md (#772)
|
||||
1 Logan Saether Propose W3F node (#188)
|
||||
1 Lovesh Harchandani Allow Ledger support for Dock (#425)
|
||||
1 Luke Schoen Fix typo in heading (#114)
|
||||
1 Nantian fix bigint type (#510)
|
||||
1 Nikhil Ranjan Updated to valid javascript (#271)
|
||||
1 Niklas P Update Beachball.tsx to remove duplication in strict mode (#840)
|
||||
1 omahs Fix: typos (#709)
|
||||
1 Ryan Lee fix: qr-code (#801)
|
||||
1 Shawn Tabrizi Add a new `notification` setting (#498)
|
||||
1 Viki Val :bug: identicon has isAlternative both as data and prop (#668)
|
||||
1 Wei Tang Add Kulupu to the network selection list (#254)
|
||||
1 WoeOm add darwinia ss58 (#379)
|
||||
1 yuhui1208 [Stores] make FileStroe read key safely (#338)
|
||||
1 Yuri Add webpack 5 support (#557)
|
||||
1 Zen feat: adapt Vue 3.x (#755)
|
||||
1 菩提 fix some bugs (#260)
|
||||
@@ -13,6 +13,6 @@ The following UI components are currently available -
|
||||
|
||||
Additionally some shared libraries, that are not dependent on any framework -
|
||||
|
||||
- [ui-keyring](packages/ui-keyring/) A browser-specific wrapper around the base [@polkadot/util-keyring](https://github.com/polkadot-js/util/) library
|
||||
- [ui-keyring](packages/ui-keyring/) A browser-specific wrapper around the base [@polkadot/keyring](https://github.com/polkadot-js/common/) library
|
||||
- [ui-settings](packages/ui-settings/) A browser local storage wrapper for app settings & configuration
|
||||
- [ui-shared](packages/ui-shared) Shared logic that is used across UI components, e.g. for icon generation
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// Copyright 2017-2026 @polkadot/ui-shared authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import baseConfig from '@polkadot/dev/config/eslint';
|
||||
|
||||
export default [
|
||||
...baseConfig
|
||||
];
|
||||
+13
-10
@@ -2,11 +2,11 @@
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18.14"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui#readme",
|
||||
"license": "Apache-2.0",
|
||||
"packageManager": "yarn@3.2.0",
|
||||
"packageManager": "yarn@4.5.1",
|
||||
"private": true,
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -14,10 +14,10 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7",
|
||||
"versions": {
|
||||
"git": "3.1.1",
|
||||
"npm": "3.1.1"
|
||||
"git": "3.16.7",
|
||||
"npm": "3.16.7"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
@@ -33,15 +33,18 @@
|
||||
"test:one": "polkadot-dev-run-test --env browser"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/dev": "^0.72.15",
|
||||
"@polkadot/x-bundle": "^11.1.1",
|
||||
"@types/node": "^18.15.3",
|
||||
"@polkadot/dev": "^0.83.3",
|
||||
"@polkadot/x-bundle": "^14.0.3",
|
||||
"@types/node": "^22.10.5",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-is": "^18.2.0",
|
||||
"react-native": "^0.71.4"
|
||||
"react-native": "^0.73.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^5.0.2"
|
||||
"@polkadot/keyring": "https://git.lair.cafe/api/packages/quantus/npm/%40polkadot%2Fkeyring/-/14.0.3-quantus.3/keyring-14.0.3-quantus.3.tgz",
|
||||
"@polkadot/networks": "https://git.lair.cafe/api/packages/quantus/npm/%40polkadot%2Fnetworks/-/14.0.3-quantus.3/networks-14.0.3-quantus.3.tgz",
|
||||
"@polkadot/util-crypto": "https://git.lair.cafe/api/packages/quantus/npm/%40polkadot%2Futil-crypto/-/14.0.3-quantus.3/util-crypto-14.0.3-quantus.3.tgz",
|
||||
"typescript": "5.5.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"description": "Renders an SVG picture representing an address",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/react-identicon#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,29 +14,27 @@
|
||||
"url": "https://github.com/polkadot-js/ui.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/keyring": "^11.1.1",
|
||||
"@polkadot/ui-settings": "3.1.1",
|
||||
"@polkadot/ui-shared": "3.1.1",
|
||||
"@polkadot/util": "^11.1.1",
|
||||
"@polkadot/util-crypto": "^11.1.1",
|
||||
"@polkadot/keyring": "^14.0.3",
|
||||
"@polkadot/ui-settings": "3.16.7",
|
||||
"@polkadot/ui-shared": "3.16.7",
|
||||
"@polkadot/util": "^14.0.3",
|
||||
"@polkadot/util-crypto": "^14.0.3",
|
||||
"ethereum-blockies-base64": "^1.0.2",
|
||||
"jdenticon": "3.2.0",
|
||||
"react-copy-to-clipboard": "^5.1.0",
|
||||
"styled-components": "^5.3.9",
|
||||
"tslib": "^2.5.0"
|
||||
"styled-components": "^6.1.1",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-copy-to-clipboard": "^5.0.4",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"@types/styled-components": "^5.1.26",
|
||||
"styled-components": "^5.3.9",
|
||||
"@types/react-copy-to-clipboard": "^5.0.7",
|
||||
"@types/react-dom": "^18.2.18",
|
||||
"xmlserializer": "^0.6.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -45,7 +43,6 @@
|
||||
"@polkadot/util-crypto": "*",
|
||||
"react": "*",
|
||||
"react-dom": "*",
|
||||
"react-is": "*",
|
||||
"styled-components": "*"
|
||||
"react-is": "*"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
@@ -6,23 +6,13 @@ import type { IdentityProps as Props, Props as ComponentProps } from './types.js
|
||||
|
||||
import React from 'react';
|
||||
import CopyToClipboard from 'react-copy-to-clipboard';
|
||||
import styledComponents, { StyledInterface } from 'styled-components';
|
||||
|
||||
import { ICON_DEFAULT_HOST, settings } from '@polkadot/ui-settings';
|
||||
import { isHex, isU8a, u8aToHex } from '@polkadot/util';
|
||||
import { decodeAddress, encodeAddress, ethereumEncode } from '@polkadot/util-crypto';
|
||||
|
||||
import { Beachball, Empty, Ethereum, Jdenticon, Polkadot } from './icons/index.js';
|
||||
|
||||
// In styled-components v6, there is a named export which can be used
|
||||
// directly, i.e. "import { styled } from ..." with no more magic. Until
|
||||
// such time the cjs vs esm import here is problematic, so we hack around
|
||||
// the various shapes below
|
||||
const styled = (
|
||||
(styledComponents as unknown as { styled: StyledInterface }).styled ||
|
||||
(styledComponents as unknown as { default: StyledInterface }).default ||
|
||||
styledComponents as unknown as StyledInterface
|
||||
);
|
||||
import { styled } from './styled.js';
|
||||
|
||||
const Fallback = Beachball;
|
||||
|
||||
@@ -99,7 +89,7 @@ class BaseIcon extends React.PureComponent<Props, State> {
|
||||
}
|
||||
|
||||
private getWrapped ({ address, publicKey }: State, { Custom }: Props): React.ReactNode {
|
||||
const { className = '', isAlternative, isHighlight, size = DEFAULT_SIZE, style, theme = settings.icon } = this.props;
|
||||
const { className = '', isAlternative, isHighlight, size = DEFAULT_SIZE, style = {}, theme = settings.icon } = this.props;
|
||||
const Component = !address
|
||||
? Empty
|
||||
: Custom || Components[theme === 'default' ? ICON_DEFAULT_HOST : theme] || Fallback;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './icons/index.js';
|
||||
|
||||
export { Identicon } from './Identicon.js';
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { packageInfo as settingsInfo } from '@polkadot/ui-settings/packageInfo';
|
||||
import { packageInfo as sharedInfo } from '@polkadot/ui-shared/packageInfo';
|
||||
|
||||
export default [settingsInfo, sharedInfo];
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import others from './detectOther.js';
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, others);
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Props } from '../types.js';
|
||||
@@ -7,12 +7,15 @@ import React, { useCallback } from 'react';
|
||||
|
||||
import { beachballIcon } from '@polkadot/ui-shared';
|
||||
|
||||
function Identicon ({ address, className = '', size, style }: Props): React.ReactElement<Props> {
|
||||
function Identicon ({ address, className = '', size, style = {} }: Props): React.ReactElement<Props> {
|
||||
const updateElem = useCallback(
|
||||
(node: HTMLDivElement): void => {
|
||||
node && node.appendChild(
|
||||
beachballIcon(address, { isAlternative: false, size })
|
||||
);
|
||||
if (node) {
|
||||
node.innerHTML = '';
|
||||
node.appendChild(
|
||||
beachballIcon(address, { isAlternative: false, size })
|
||||
);
|
||||
}
|
||||
},
|
||||
[address, size]
|
||||
);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Props } from '../types.js';
|
||||
|
||||
import React from 'react';
|
||||
|
||||
function Identicon ({ className = '', size, style }: Props): React.ReactElement<Props> {
|
||||
function Identicon ({ className = '', size, style = {} }: Props): React.ReactElement<Props> {
|
||||
return (
|
||||
<svg
|
||||
className={className}
|
||||
|
||||
@@ -1,27 +1,18 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Props } from '../types.js';
|
||||
|
||||
import makeBlockie from 'ethereum-blockies-base64';
|
||||
import React, { useMemo } from 'react';
|
||||
import styledComponents, { StyledInterface } from 'styled-components';
|
||||
|
||||
// In styled-components v6, there is a named export which can be used
|
||||
// directly, i.e. "import { styled } from ..." with no more magic. Until
|
||||
// such time the cjs vs esm import here is problematic, so we hack around
|
||||
// the various shapes below
|
||||
const styled = (
|
||||
(styledComponents as unknown as { styled: StyledInterface }).styled ||
|
||||
(styledComponents as unknown as { default: StyledInterface }).default ||
|
||||
styledComponents as unknown as StyledInterface
|
||||
);
|
||||
import { styled } from '../styled.js';
|
||||
|
||||
interface ImgProps {
|
||||
size: number;
|
||||
}
|
||||
|
||||
function Identicon ({ address, className = '', size, style }: Props): React.ReactElement<Props> {
|
||||
function Identicon ({ address, className = '', size, style = {} }: Props): React.ReactElement<Props> {
|
||||
const imgSrc = useMemo(
|
||||
() => makeBlockie(address),
|
||||
[address]
|
||||
@@ -37,7 +28,7 @@ function Identicon ({ address, className = '', size, style }: Props): React.Reac
|
||||
);
|
||||
}
|
||||
|
||||
const StyledImg = styled.img(({ size }: ImgProps) => `
|
||||
const StyledImg = styled.img<ImgProps>(({ size }) => `
|
||||
display: block;
|
||||
height: ${size}px;
|
||||
width: ${size}px;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Props } from '../types.js';
|
||||
@@ -6,7 +6,7 @@ import type { Props } from '../types.js';
|
||||
import * as jdenticon from 'jdenticon';
|
||||
import React, { useMemo } from 'react';
|
||||
|
||||
function Identicon ({ className = '', publicKey, size, style }: Props): React.ReactElement<Props> {
|
||||
function Identicon ({ className = '', publicKey, size, style = {} }: Props): React.ReactElement<Props> {
|
||||
const html = useMemo(
|
||||
() => ({ __html: jdenticon.toSvg(publicKey.substring(2), size) }),
|
||||
[publicKey, size]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2018-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Copyright 2018 Paritytech via paritytech/oo7/polkadot-identicon
|
||||
@@ -35,7 +35,7 @@ function renderCircle ({ cx, cy, fill, r }: Circle, key: number): React.ReactNod
|
||||
);
|
||||
}
|
||||
|
||||
function Identicon ({ address, className = '', isAlternative = false, size, style }: Props): React.ReactElement<Props> {
|
||||
function Identicon ({ address, className = '', isAlternative = false, size, style = {} }: Props): React.ReactElement<Props> {
|
||||
const circles = useMemo(
|
||||
() => polkadotIcon(address, { isAlternative }),
|
||||
[address, isAlternative]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { Beachball } from './Beachball.js';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
import { Identicon } from './bundle.js';
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
// (packageInfo imports will be kept as-is, user-editable)
|
||||
|
||||
import { packageInfo as settingsInfo } from '@polkadot/ui-settings/packageInfo';
|
||||
import { packageInfo as sharedInfo } from '@polkadot/ui-shared/packageInfo';
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, [settingsInfo, sharedInfo]);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/react-identicon', path: 'auto', type: 'auto', version: '3.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/react-identicon', path: 'auto', type: 'auto', version: '3.16.7' };
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { styled } from 'styled-components';
|
||||
@@ -1,10 +1,9 @@
|
||||
// Copyright 2018-2023 @polkadot/react-identicon authors & contributors
|
||||
// Copyright 2018-2026 @polkadot/react-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type React from 'react';
|
||||
import type { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
|
||||
import React from 'react';
|
||||
|
||||
export interface BaseProps {
|
||||
className?: string;
|
||||
style?: React.CSSProperties;
|
||||
@@ -12,11 +11,9 @@ export interface BaseProps {
|
||||
|
||||
export interface Props extends BaseProps {
|
||||
address: string;
|
||||
isAlternative?: boolean;
|
||||
className?: string;
|
||||
isAlternative?: boolean | undefined;
|
||||
publicKey: string;
|
||||
size: number;
|
||||
style?: React.CSSProperties;
|
||||
}
|
||||
|
||||
export interface IdentityProps extends BaseProps {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"description": "Generates and reads QR codes",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/react-qr#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,30 +14,27 @@
|
||||
"url": "https://github.com/polkadot-js/ui.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/ui-settings": "3.1.1",
|
||||
"@polkadot/util": "^11.1.1",
|
||||
"@polkadot/util-crypto": "^11.1.1",
|
||||
"@polkadot/ui-settings": "3.16.7",
|
||||
"@polkadot/util": "^14.0.3",
|
||||
"@polkadot/util-crypto": "^14.0.3",
|
||||
"@zxing/browser": "^0.1.5",
|
||||
"@zxing/library": "^0.21.2",
|
||||
"qrcode-generator": "^1.4.4",
|
||||
"react-qr-reader": "^2.2.1",
|
||||
"styled-components": "^5.3.9",
|
||||
"tslib": "^2.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-qr-reader": "^2.1.4",
|
||||
"@types/styled-components": "^5.1.26"
|
||||
"styled-components": "^6.1.1",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "*",
|
||||
"@polkadot/util-crypto": "*",
|
||||
"react": "*",
|
||||
"react-dom": "*",
|
||||
"styled-components": "*"
|
||||
"react-is": "*"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,21 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import styledComponents, { StyledInterface } from 'styled-components';
|
||||
|
||||
import { objectSpread } from '@polkadot/util';
|
||||
import { xxhashAsHex } from '@polkadot/util-crypto';
|
||||
|
||||
import { qrcode } from './qrcode.js';
|
||||
import { styled } from './styled.js';
|
||||
import { createFrames, createImgSize } from './util.js';
|
||||
|
||||
// In styled-components v6, there is a named export which can be used
|
||||
// directly, i.e. "import { styled } from ..." with no more magic. Until
|
||||
// such time the cjs vs esm import here is problematic, so we hack around
|
||||
// the various shapes below
|
||||
const styled = (
|
||||
(styledComponents as unknown as { styled: StyledInterface }).styled ||
|
||||
(styledComponents as unknown as { default: StyledInterface }).default ||
|
||||
styledComponents as unknown as StyledInterface
|
||||
);
|
||||
|
||||
interface Props {
|
||||
className?: string;
|
||||
size?: string | number;
|
||||
className?: string | undefined;
|
||||
size?: string | number | undefined;
|
||||
skipEncoding?: boolean;
|
||||
style?: React.CSSProperties;
|
||||
timerDelay?: number;
|
||||
style?: React.CSSProperties | undefined;
|
||||
timerDelay?: number | undefined;
|
||||
value: Uint8Array;
|
||||
}
|
||||
|
||||
@@ -55,7 +45,7 @@ function getDataUrl (value: Uint8Array): string {
|
||||
return qr.createDataURL(16, 0);
|
||||
}
|
||||
|
||||
function Display ({ className, size, skipEncoding, style, timerDelay = DEFAULT_FRAME_DELAY, value }: Props): React.ReactElement<Props> | null {
|
||||
function Display ({ className = '', size, skipEncoding, style = {}, timerDelay = DEFAULT_FRAME_DELAY, value }: Props): React.ReactElement<Props> | null {
|
||||
const [{ image }, setFrameState] = useState<FrameState>({ frameIdx: 0, frames: [], image: null, valueHash: null });
|
||||
const timerRef = useRef<TimerState>({ timerDelay, timerId: null });
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import React, { useMemo } from 'react';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import React, { useMemo } from 'react';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { NetworkSpecsStruct } from '@polkadot/ui-settings/types';
|
||||
|
||||
@@ -1,29 +1,19 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import React, { useCallback, useMemo } from 'react';
|
||||
import Reader from 'react-qr-reader';
|
||||
import styledComponents, { StyledInterface } from 'styled-components';
|
||||
import { BrowserQRCodeReader, type IScannerControls } from '@zxing/browser';
|
||||
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
||||
|
||||
import { styled } from './styled.js';
|
||||
import { createImgSize } from './util.js';
|
||||
|
||||
// In styled-components v6, there is a named export which can be used
|
||||
// directly, i.e. "import { styled } from ..." with no more magic. Until
|
||||
// such time the cjs vs esm import here is problematic, so we hack around
|
||||
// the various shapes below
|
||||
const styled = (
|
||||
(styledComponents as unknown as { styled: StyledInterface }).styled ||
|
||||
(styledComponents as unknown as { default: StyledInterface }).default ||
|
||||
styledComponents as unknown as StyledInterface
|
||||
);
|
||||
|
||||
interface Props {
|
||||
className?: string;
|
||||
className?: string | undefined;
|
||||
delay?: number;
|
||||
onError?: (error: Error) => void;
|
||||
onError?: undefined | ((error: Error) => void);
|
||||
onScan: (data: string) => void;
|
||||
size?: string | number;
|
||||
style?: React.CSSProperties;
|
||||
size?: string | number | undefined;
|
||||
style?: React.CSSProperties | undefined;
|
||||
}
|
||||
|
||||
const DEFAULT_DELAY = 150;
|
||||
@@ -32,7 +22,10 @@ const DEFAULT_ERROR = (error: Error): void => {
|
||||
console.error('@polkadot/react-qr:Scan', error.message);
|
||||
};
|
||||
|
||||
function Scan ({ className, delay = DEFAULT_DELAY, onError = DEFAULT_ERROR, onScan, size, style }: Props): React.ReactElement<Props> {
|
||||
function Scan ({ className = '', delay = DEFAULT_DELAY, onError = DEFAULT_ERROR, onScan, size, style = {} }: Props): React.ReactElement<Props> {
|
||||
const videoRef = useRef<HTMLVideoElement>(null);
|
||||
const controlsRef = useRef<IScannerControls | null>(null);
|
||||
|
||||
const containerStyle = useMemo(
|
||||
() => createImgSize(size),
|
||||
[size]
|
||||
@@ -43,21 +36,52 @@ function Scan ({ className, delay = DEFAULT_DELAY, onError = DEFAULT_ERROR, onSc
|
||||
[onError]
|
||||
);
|
||||
|
||||
const _onScan = useCallback(
|
||||
(data: string | null) => data && onScan(data),
|
||||
[onScan]
|
||||
);
|
||||
useEffect(() => {
|
||||
const codeReader = new BrowserQRCodeReader();
|
||||
|
||||
const startScanning = async () => {
|
||||
try {
|
||||
const videoInputDevices = await BrowserQRCodeReader.listVideoInputDevices();
|
||||
const selectedDeviceId = videoInputDevices[0].deviceId;
|
||||
|
||||
controlsRef.current = await codeReader.decodeFromVideoDevice(
|
||||
selectedDeviceId,
|
||||
videoRef.current ?? undefined,
|
||||
(result, error) => {
|
||||
if (result) {
|
||||
onScan(result.getText());
|
||||
}
|
||||
|
||||
if (error && !(error instanceof Error)) {
|
||||
_onError(new Error(error));
|
||||
}
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
_onError(error instanceof Error ? error : new Error('Unknown error occurred'));
|
||||
}
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
const timeoutId = setTimeout(startScanning, delay);
|
||||
|
||||
return () => {
|
||||
clearTimeout(timeoutId);
|
||||
|
||||
if (controlsRef.current) {
|
||||
controlsRef.current.stop();
|
||||
}
|
||||
};
|
||||
}, [onScan, _onError, delay]);
|
||||
|
||||
return (
|
||||
<StyledDiv
|
||||
className={className}
|
||||
style={containerStyle}
|
||||
>
|
||||
<Reader
|
||||
<video
|
||||
className='ui--qr-Scan'
|
||||
delay={delay}
|
||||
onError={_onError}
|
||||
onScan={_onScan}
|
||||
ref={videoRef}
|
||||
style={style}
|
||||
/>
|
||||
</StyledDiv>
|
||||
@@ -70,10 +94,6 @@ const StyledDiv = styled.div`
|
||||
height: 100%;
|
||||
transform: matrix(-1, 0, 0, 1, 0, 0);
|
||||
width: 100%;
|
||||
|
||||
video {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import React, { useCallback } from 'react';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
import { decodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
import { ADDRESS_PREFIX, SEED_PREFIX } from './constants.js';
|
||||
@@ -12,8 +13,8 @@ import { QrScan } from './Scan.js';
|
||||
interface ScanType {
|
||||
isAddress: boolean;
|
||||
content: string;
|
||||
genesisHash: string;
|
||||
name?: string;
|
||||
genesisHash: HexString | null;
|
||||
name?: string | undefined;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
@@ -30,20 +31,25 @@ function ScanAddress ({ className, isEthereum, onError, onScan, size, style }: P
|
||||
(data: string | null): void => {
|
||||
if (data) {
|
||||
try {
|
||||
let prefix: string, content: string, genesisHash: string, name: string[];
|
||||
let prefix: string;
|
||||
let content: string;
|
||||
let genesisHash: string | null;
|
||||
let name: string[];
|
||||
|
||||
if (!isEthereum) {
|
||||
[prefix, content, genesisHash, ...name] = data.split(':');
|
||||
} else {
|
||||
[prefix, content, ...name] = data.split(':');
|
||||
genesisHash = '';
|
||||
genesisHash = null;
|
||||
content = content.substring(0, 42);
|
||||
}
|
||||
|
||||
const expectedPrefix = (isEthereum ? 'ethereum' : ADDRESS_PREFIX);
|
||||
const isValidPrefix = (prefix === expectedPrefix) || (prefix === SEED_PREFIX);
|
||||
|
||||
assert(isValidPrefix, `Invalid prefix received, expected '${expectedPrefix} or ${SEED_PREFIX}' , found '${prefix}'`);
|
||||
if (!isValidPrefix) {
|
||||
throw new Error(`Invalid prefix received, expected '${expectedPrefix} or ${SEED_PREFIX}' , found '${prefix}'`);
|
||||
}
|
||||
|
||||
const isAddress = prefix === expectedPrefix;
|
||||
|
||||
@@ -51,7 +57,7 @@ function ScanAddress ({ className, isEthereum, onError, onScan, size, style }: P
|
||||
decodeAddress(content);
|
||||
}
|
||||
|
||||
onScan({ content, genesisHash, isAddress, name: name?.length ? name.join(':') : undefined });
|
||||
onScan({ content, genesisHash: genesisHash as HexString, isAddress, name: name?.length ? name.join(':') : undefined });
|
||||
} catch (error) {
|
||||
onError && onError(error as Error);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { QrDisplayAddress } from './DisplayAddress.js';
|
||||
export { QrDisplayPayload } from './DisplayPayload.js';
|
||||
export { QrScanAddress } from './ScanAddress.js';
|
||||
export { QrScanSignature } from './ScanSignature.js';
|
||||
export { QrNetworkSpecs } from './NetworkSpecs.js';
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
export { QrScanAddress } from './ScanAddress.js';
|
||||
export { QrScanSignature } from './ScanSignature.js';
|
||||
|
||||
@@ -1,24 +1,12 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
const ADDRESS_PREFIX = 'substrate';
|
||||
const SEED_PREFIX = 'secret';
|
||||
const FRAME_SIZE = 1024;
|
||||
const SUBSTRATE_ID = new Uint8Array([0x53]);
|
||||
const CRYPTO_SR25519 = new Uint8Array([0x01]);
|
||||
const CMD_SIGN_TX = new Uint8Array([0]);
|
||||
const CMD_SIGN_TX_HASH = new Uint8Array([1]);
|
||||
const CMD_SIGN_IMMORTAL_TX = new Uint8Array([2]);
|
||||
const CMD_SIGN_MSG = new Uint8Array([3]);
|
||||
|
||||
export {
|
||||
ADDRESS_PREFIX,
|
||||
CMD_SIGN_TX,
|
||||
CMD_SIGN_TX_HASH,
|
||||
CMD_SIGN_IMMORTAL_TX,
|
||||
CMD_SIGN_MSG,
|
||||
CRYPTO_SR25519,
|
||||
FRAME_SIZE,
|
||||
SEED_PREFIX,
|
||||
SUBSTRATE_ID
|
||||
};
|
||||
export const ADDRESS_PREFIX = 'substrate';
|
||||
export const SEED_PREFIX = 'secret';
|
||||
export const FRAME_SIZE = 1024;
|
||||
export const SUBSTRATE_ID = new Uint8Array([0x53]);
|
||||
export const CRYPTO_SR25519 = new Uint8Array([0x01]);
|
||||
export const CMD_SIGN_TX = new Uint8Array([0]);
|
||||
export const CMD_SIGN_TX_HASH = new Uint8Array([1]);
|
||||
export const CMD_SIGN_IMMORTAL_TX = new Uint8Array([2]);
|
||||
export const CMD_SIGN_MSG = new Uint8Array([3]);
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Empty template, auto-generated by @polkadot/dev
|
||||
|
||||
export default [];
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
export * from './bundle.js';
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
// (packageInfo imports will be kept as-is, user-editable)
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import others from './detectOther.js';
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, others);
|
||||
detectPackage(packageInfo, null, []);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/react-qr', path: 'auto', type: 'auto', version: '3.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/react-qr', path: 'auto', type: 'auto', version: '3.16.7' };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import _qrcode from 'qrcode-generator';
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { styled } from 'styled-components';
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/react-qr authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/react-qr authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isString, u8aConcat, u8aToU8a } from '@polkadot/util';
|
||||
@@ -13,9 +13,10 @@ export function encodeNumber (value: number): Uint8Array {
|
||||
}
|
||||
|
||||
export function encodeString (value: string): Uint8Array {
|
||||
const u8a = new Uint8Array(value.length);
|
||||
const count = value.length;
|
||||
const u8a = new Uint8Array(count);
|
||||
|
||||
for (let i = 0; i < value.length; i++) {
|
||||
for (let i = 0; i < count; i++) {
|
||||
u8a[i] = value.charCodeAt(i);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"exclude": [
|
||||
"**/*.spec.ts"
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../ui-settings/tsconfig.build.json" }
|
||||
]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src",
|
||||
"emitDeclarationOnly": false,
|
||||
"noEmit": true
|
||||
},
|
||||
"include": [
|
||||
"**/*.spec.ts"
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../react-qr/tsconfig.build.json" }
|
||||
]
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"description": "Renders an SVG picture representing an address",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/reactnative-identicon#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,21 +14,21 @@
|
||||
"url": "https://github.com/polkadot-js/ui.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/ui-shared": "3.1.1",
|
||||
"@polkadot/util": "^11.1.1",
|
||||
"@polkadot/util-crypto": "^11.1.1",
|
||||
"react-native-svg": "^12.5.1",
|
||||
"tslib": "^2.5.0"
|
||||
"@polkadot/ui-shared": "3.16.7",
|
||||
"@polkadot/util": "^14.0.3",
|
||||
"@polkadot/util-crypto": "^14.0.3",
|
||||
"react-native-svg": "^14.1.0",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-native": "^0.71.3"
|
||||
"@types/react-native": "^0.72.8"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "*",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './icons/index.js';
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { packageInfo as sharedInfo } from '@polkadot/ui-shared/packageInfo';
|
||||
|
||||
export default [sharedInfo];
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import others from './detectOther.js';
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, others);
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Props } from '../types.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2018-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Circle as CircleType } from '@polkadot/ui-shared/icons/types';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { default as Empty } from './Empty.js';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
import Identicon from './Identicon.js';
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
// (packageInfo imports will be kept as-is, user-editable)
|
||||
|
||||
import { packageInfo as sharedInfo } from '@polkadot/ui-shared/packageInfo';
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, [sharedInfo]);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/reactnative-identicon', path: 'auto', type: 'auto', version: '3.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/reactnative-identicon', path: 'auto', type: 'auto', version: '3.16.7' };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018-2023 @polkadot/reactnative-identicon authors & contributors
|
||||
// Copyright 2018-2026 @polkadot/reactnative-identicon authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export interface Props {
|
||||
|
||||
@@ -123,7 +123,7 @@ class MyReactComponent extends React.PureComponent<State> {
|
||||
- What are 'external' accounts, i.e. when to set the `isExternal` meta key to true?
|
||||
- An external account is one where the keys are not managed by keyring, e.g. in Parity Signer or Ledger Nano.
|
||||
- SS58 Encode / Decode?
|
||||
- SS58 is a simple address format designed for Substrate based chains. You can read about its specification in more detail in the [Parity Wiki](https://wiki.parity.io/External-Address-Format-(SS58)).
|
||||
- SS58 is a simple address format designed for Substrate based chains. You can read about its specification in more detail in the [Substrate Documentation](https://docs.substrate.io/reference/address-formats/).
|
||||
|
||||
**If you have any unanswered/undocumented questions, please raise an issue [here](https://github.com/polkadot-js/ui/issues).**
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/ui-keyring#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -13,25 +13,26 @@
|
||||
"url": "https://github.com/polkadot-js/ui.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7-quantus.3",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/keyring": "^11.1.1",
|
||||
"@polkadot/ui-settings": "3.1.1",
|
||||
"@polkadot/util": "^11.1.1",
|
||||
"@polkadot/util-crypto": "^11.1.1",
|
||||
"mkdirp": "^2.1.5",
|
||||
"rxjs": "^7.8.0",
|
||||
"@polkadot/keyring": "14.0.3-quantus.3",
|
||||
"@polkadot/ui-settings": "3.16.7",
|
||||
"@polkadot/util": "^14.0.3",
|
||||
"@polkadot/util-crypto": "14.0.3-quantus.3",
|
||||
"mkdirp": "^3.0.1",
|
||||
"rxjs": "^7.8.1",
|
||||
"store": "^2.0.12",
|
||||
"tslib": "^2.5.0"
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mkdirp": "^1.0.2",
|
||||
"@types/store": "^2.0.2"
|
||||
"@quantus/crypto": "^0.3.0",
|
||||
"@types/mkdirp": "^2.0.0",
|
||||
"@types/store": "^2.0.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/keyring": "*",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringInstance, KeyringPair } from '@polkadot/keyring/types';
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
import type { AddressSubject } from './observable/types.js';
|
||||
import type { KeyringOptions, KeyringStore } from './types.js';
|
||||
@@ -22,18 +23,21 @@ export class Base {
|
||||
|
||||
#contracts: AddressSubject;
|
||||
|
||||
#isEthereum: boolean;
|
||||
|
||||
#keyring?: KeyringInstance;
|
||||
|
||||
protected _store: KeyringStore;
|
||||
|
||||
protected _genesisHash?: string;
|
||||
protected _genesisHash?: HexString | undefined;
|
||||
|
||||
protected _genesisHashAdd: string[] = [];
|
||||
protected _genesisHashAdd: HexString[] = [];
|
||||
|
||||
constructor () {
|
||||
this.#accounts = accounts;
|
||||
this.#addresses = addresses;
|
||||
this.#contracts = contracts;
|
||||
this.#isEthereum = false;
|
||||
this._store = new BrowserStore();
|
||||
}
|
||||
|
||||
@@ -49,6 +53,10 @@ export class Base {
|
||||
return this.#contracts;
|
||||
}
|
||||
|
||||
public get isEthereum (): boolean {
|
||||
return this.#isEthereum;
|
||||
}
|
||||
|
||||
public get keyring (): KeyringInstance {
|
||||
if (this.#keyring) {
|
||||
return this.#keyring;
|
||||
@@ -57,11 +65,11 @@ export class Base {
|
||||
throw new Error('Keyring should be initialised via \'loadAll\' before use');
|
||||
}
|
||||
|
||||
public get genesisHash (): string | undefined {
|
||||
public get genesisHash (): HexString | undefined {
|
||||
return this._genesisHash;
|
||||
}
|
||||
|
||||
public get genesisHashes (): string[] {
|
||||
public get genesisHashes (): HexString[] {
|
||||
return this._genesisHash
|
||||
? [this._genesisHash, ...this._genesisHashAdd]
|
||||
: [...this._genesisHashAdd];
|
||||
@@ -117,10 +125,14 @@ export class Base {
|
||||
this.setDevMode(options.isDevelopment);
|
||||
}
|
||||
|
||||
// Never Ethereum: the keyring holds only ML-DSA keys (quantus/common#6). Kept
|
||||
// as a property so callers written against upstream still read a boolean.
|
||||
this.#isEthereum = false;
|
||||
|
||||
this.#keyring = keyring;
|
||||
this._genesisHash = options.genesisHash && (
|
||||
isString(options.genesisHash)
|
||||
? options.genesisHash.toString()
|
||||
? options.genesisHash.toString() as HexString
|
||||
: options.genesisHash.toHex()
|
||||
);
|
||||
this._genesisHashAdd = options.genesisHashAdd || [];
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
import type { KeyringPair$Json } from '@polkadot/keyring/types';
|
||||
|
||||
import { contextForSpec } from '@quantus/crypto';
|
||||
|
||||
import { Keyring as BaseKeyring } from '@polkadot/keyring';
|
||||
import { dilithiumVerify } from '@polkadot/util-crypto';
|
||||
|
||||
import { Keyring } from './Keyring.js';
|
||||
|
||||
// crystal_alice, from the chain's dev genesis — a raw 32-byte seed straight into
|
||||
// ML-DSA-87 keygen. The address is what `quantus developer create-test-wallets`
|
||||
// prints, i.e. an independent implementation.
|
||||
const ALICE = 'qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7';
|
||||
const PASSWORD = 'not a good password';
|
||||
const MESSAGE = new Uint8Array([0x75, 0x69]);
|
||||
|
||||
function backup (): KeyringPair$Json {
|
||||
const base = new BaseKeyring({ ss58Format: 189, type: 'dilithium87' });
|
||||
|
||||
return base
|
||||
.addFromSeed(new Uint8Array(32), { name: 'crystal_alice' }, 'dilithium87')
|
||||
.toJson(PASSWORD);
|
||||
}
|
||||
|
||||
// `loadAll` initialises `@polkadot/ui-settings`, which is a module singleton, so
|
||||
// it may be called once per *process* — not per instance. One keyring for the
|
||||
// whole file, loaded once.
|
||||
const uiKeyring = new Keyring();
|
||||
|
||||
uiKeyring.loadAll({ ss58Format: 189, store: undefined, type: 'dilithium87' });
|
||||
|
||||
describe('ui-keyring restoreAccount', (): void => {
|
||||
// Before the fix this constructed a pair whose "public key" was
|
||||
// decodeAddress(json.address) — i.e. a Poseidon2 hash of the public key, passed
|
||||
// off as the key itself. It did not throw; it produced a pair that was simply
|
||||
// wrong.
|
||||
it('restores an ML-DSA account to the right address', (): void => {
|
||||
const pair = uiKeyring.restoreAccount(backup(), PASSWORD);
|
||||
|
||||
expect(pair.address).toEqual(ALICE);
|
||||
expect(pair.publicKey.length).toEqual(2592);
|
||||
expect(pair.addressRaw.length).toEqual(32);
|
||||
});
|
||||
|
||||
it('restores an account that can sign for its own address', (): void => {
|
||||
const pair = uiKeyring.restoreAccount(backup(), PASSWORD);
|
||||
|
||||
pair.decodePkcs8(PASSWORD);
|
||||
|
||||
const context = contextForSpec(148);
|
||||
const signature = pair.sign(MESSAGE, { context });
|
||||
|
||||
expect(dilithiumVerify(MESSAGE, signature, pair.addressRaw, 'dilithium87', context)).toEqual(true);
|
||||
});
|
||||
|
||||
it('fails on a wrong password without half-restoring', (): void => {
|
||||
expect(() => uiKeyring.restoreAccount(backup(), 'wrong')).toThrow();
|
||||
});
|
||||
|
||||
// The address field sits outside the encrypted blob. For the curve schemes a
|
||||
// tampered one cannot decode at all; here it decodes cleanly and would yield an
|
||||
// account displaying an address its key does not control.
|
||||
it('rejects JSON whose address does not match its key', (): void => {
|
||||
const base = new BaseKeyring({ ss58Format: 189, type: 'dilithium87' });
|
||||
const other = base.addFromSeed(new Uint8Array(32).fill(3), {}, 'dilithium87');
|
||||
|
||||
expect(() => uiKeyring.restoreAccount({ ...backup(), address: other.address }, PASSWORD)).toThrow(/does not match the address/);
|
||||
});
|
||||
|
||||
// quantus/common#6: a backup of a quantum-unsafe key is refused with the
|
||||
// reason, not decoded. This is the JSON a polkadot{.js} export of an ed25519
|
||||
// account carries.
|
||||
it('refuses a polkadot{.js} backup of a quantum-unsafe key, saying why', (): void => {
|
||||
const json = {
|
||||
address: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
|
||||
encoded: '0x00',
|
||||
encoding: { content: ['pkcs8', 'sr25519'], type: ['scrypt', 'xsalsa20-poly1305'], version: '3' },
|
||||
meta: { name: 'polkadot account' }
|
||||
} as unknown as KeyringPair$Json;
|
||||
|
||||
expect(() => uiKeyring.restoreAccount(json, PASSWORD)).toThrow(/sr25519 keys are not quantum-safe and cannot be held here/);
|
||||
});
|
||||
|
||||
it('refuses a file that does not record its key type', (): void => {
|
||||
const json = { ...backup(), encoding: { content: 'pkcs8', type: 'none', version: '0' } } as unknown as KeyringPair$Json;
|
||||
|
||||
expect(() => uiKeyring.restoreAccount(json, PASSWORD)).toThrow(/does not record its key type/);
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '@polkadot/keyring/types';
|
||||
@@ -8,10 +8,9 @@ import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { AddressSubject, SingleAddress } from './observable/types.js';
|
||||
import type { CreateResult, KeyringAddress, KeyringAddressType, KeyringItemType, KeyringJson, KeyringJson$Meta, KeyringOptions, KeyringPairs$Json, KeyringStruct } from './types.js';
|
||||
|
||||
import { createPair } from '@polkadot/keyring';
|
||||
import { chains } from '@polkadot/ui-settings';
|
||||
import { bnToBn, hexToU8a, isFunction, isHex, isString, objectSpread, stringify, stringToU8a, u8aSorted, u8aToString } from '@polkadot/util';
|
||||
import { base64Decode, createKeyMulti, jsonDecrypt, jsonEncrypt } from '@polkadot/util-crypto';
|
||||
import { createKeyMulti, jsonDecrypt, jsonEncrypt } from '@polkadot/util-crypto';
|
||||
|
||||
import { env } from './observable/env.js';
|
||||
import { KeyringOption } from './options/index.js';
|
||||
@@ -21,7 +20,7 @@ import { accountKey, accountRegex, addressKey, addressRegex, contractKey, contra
|
||||
const RECENT_EXPIRY = 24 * 60 * 60;
|
||||
|
||||
// No accounts (or test accounts) should be loaded until after the chain determination.
|
||||
// Chain determination occurs outside of Keyring. Loading `keyring.loadAll({ type: 'ed25519' | 'sr25519' })` is triggered
|
||||
// Chain determination occurs outside of Keyring. Loading `keyring.loadAll({ type: 'dilithium65' | 'dilithium87' })` is triggered
|
||||
// from the API after the chain is received
|
||||
export class Keyring extends Base implements KeyringStruct {
|
||||
public readonly keyringOption = new KeyringOption();
|
||||
@@ -33,7 +32,7 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
};
|
||||
|
||||
public addExternal (address: string | Uint8Array, meta: KeyringPair$Meta = {}): CreateResult {
|
||||
const pair = this.keyring.addFromAddress(address, objectSpread<KeyringJson$Meta>({}, meta, { isExternal: true }), null);
|
||||
const pair = this.keyring.addFromAddress(address, objectSpread<KeyringJson$Meta>({}, meta, { isExternal: true }), null, meta?.type);
|
||||
|
||||
return {
|
||||
json: this.saveAccount(pair),
|
||||
@@ -46,10 +45,20 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
}
|
||||
|
||||
public addMultisig (addresses: (string | Uint8Array)[], threshold: bigint | BN | number, meta: KeyringPair$Meta = {}): CreateResult {
|
||||
const address = createKeyMulti(addresses, threshold);
|
||||
let address = createKeyMulti(addresses, threshold);
|
||||
|
||||
// For Ethereum chains, the first 20 bytes of the hash indicates the actual address
|
||||
// Testcases via creation and on-chain events:
|
||||
// - input: 0x7a1671a0224c8927b08f978027d586ab6868de0d31bb5bc956b625ced2ab18c4
|
||||
// - output: 0x7a1671a0224c8927b08f978027d586ab6868de0d
|
||||
if (this.isEthereum) {
|
||||
address = address.slice(0, 20);
|
||||
}
|
||||
|
||||
// we could use `sortAddresses`, but rather use internal encode/decode so we are 100%
|
||||
const who = u8aSorted(addresses.map((who) => this.decodeAddress(who))).map((who) => this.encodeAddress(who));
|
||||
const who = u8aSorted(
|
||||
addresses.map((who) => this.decodeAddress(who))
|
||||
).map((who) => this.encodeAddress(who));
|
||||
|
||||
return this.addExternal(address, objectSpread<KeyringPair$Meta>({}, meta, { isMultisig: true, threshold: bnToBn(threshold).toNumber(), who }));
|
||||
}
|
||||
@@ -142,8 +151,14 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
|
||||
return Object
|
||||
.keys(available)
|
||||
.map((address): KeyringAddress => this.getAddress(address, 'account') as KeyringAddress)
|
||||
.filter((account) => env.isDevelopment() || account.meta.isTesting !== true);
|
||||
.map((address) => this.getAddress(address, 'account'))
|
||||
.filter((account): account is KeyringAddress =>
|
||||
!!account &&
|
||||
(
|
||||
env.isDevelopment() ||
|
||||
account.meta.isTesting !== true
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public getAddress (_address: string | Uint8Array, type: KeyringItemType | null = null): KeyringAddress | undefined {
|
||||
@@ -170,7 +185,8 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
|
||||
return Object
|
||||
.keys(available)
|
||||
.map((address): KeyringAddress => this.getAddress(address) as KeyringAddress);
|
||||
.map((address) => this.getAddress(address))
|
||||
.filter((account): account is KeyringAddress => !!account);
|
||||
}
|
||||
|
||||
public getContract (address: string | Uint8Array): KeyringAddress | undefined {
|
||||
@@ -185,11 +201,12 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
.filter(([, { json: { meta: { contract } } }]): boolean =>
|
||||
!!contract && contract.genesisHash === this.genesisHash
|
||||
)
|
||||
.map(([address]) => this.getContract(address) as KeyringAddress);
|
||||
.map(([address]) => this.getContract(address))
|
||||
.filter((account): account is KeyringAddress => !!account);
|
||||
}
|
||||
|
||||
private rewriteKey (json: KeyringJson, key: string, hexAddr: string, creator: (addr: string) => string): void {
|
||||
if (hexAddr.substring(0, 2) === '0x') {
|
||||
if (hexAddr.startsWith('0x')) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -242,7 +259,7 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
const [, hexAddr] = key.split(':');
|
||||
|
||||
// move genesisHash to top-level (TODO Remove from contracts section?)
|
||||
json.meta.genesisHash = json.meta.genesisHash || (json.meta.contract && json.meta.contract.genesisHash);
|
||||
json.meta.genesisHash = json.meta.genesisHash || (json.meta.contract?.genesisHash);
|
||||
|
||||
this.contracts.add(this._store, address, json);
|
||||
this.rewriteKey(json, key, hexAddr, contractKey);
|
||||
@@ -259,7 +276,7 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
}
|
||||
|
||||
private allowGenesis (json?: KeyringJson | { meta: KeyringJson$Meta } | null): boolean {
|
||||
if (json && json.meta && this.genesisHash) {
|
||||
if (json?.meta && this.genesisHash) {
|
||||
const hashes: (string | null | undefined)[] = Object.values(chains).find((hashes): boolean =>
|
||||
hashes.includes(this.genesisHash || '')
|
||||
) || [this.genesisHash];
|
||||
@@ -309,15 +326,18 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
}
|
||||
|
||||
public restoreAccount (json: KeyringPair$Json, password: string): KeyringPair {
|
||||
const cryptoType = Array.isArray(json.encoding.content) ? json.encoding.content[1] : 'ed25519';
|
||||
const encType = Array.isArray(json.encoding.type) ? json.encoding.type : [json.encoding.type];
|
||||
const pair = createPair(
|
||||
{ toSS58: this.encodeAddress, type: cryptoType as KeypairType },
|
||||
{ publicKey: this.decodeAddress(json.address, true) },
|
||||
json.meta,
|
||||
isHex(json.encoded) ? hexToU8a(json.encoded) : base64Decode(json.encoded),
|
||||
encType
|
||||
);
|
||||
// Version-0 JSON predates recording the key type, so it cannot be an ML-DSA
|
||||
// account. Upstream guessed ed25519; this keyring cannot hold one.
|
||||
if (!Array.isArray(json.encoding.content)) {
|
||||
throw new Error('This account file does not record its key type, so it is not an ML-DSA account and cannot be restored here');
|
||||
}
|
||||
|
||||
// Through the keyring rather than createPair directly, so a restore gets the
|
||||
// same refusal as every other entry point: a polkadot{.js} backup of an
|
||||
// sr25519 or ed25519 account is told it is not quantum-safe, not decoded.
|
||||
// createFromJson also carries the address as an account id until the real
|
||||
// public key is decrypted, and checks the two agree when it is.
|
||||
const pair = this.keyring.createFromJson(json, true);
|
||||
|
||||
// unlock, save account and then lock (locking cleans secretKey, so needs to be last)
|
||||
pair.decodePkcs8(password);
|
||||
@@ -360,7 +380,7 @@ export class Keyring extends Base implements KeyringStruct {
|
||||
public saveAddress (address: string, meta: KeyringPair$Meta, type: KeyringAddressType = 'address'): KeyringPair$Json {
|
||||
const available = this.addresses.subject.getValue();
|
||||
|
||||
const json = (available[address] && available[address].json) || {
|
||||
const json = available[address]?.json || {
|
||||
address,
|
||||
meta: {
|
||||
isRecent: undefined,
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { Keyring } from './Keyring.js';
|
||||
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
const keyring = new Keyring();
|
||||
export const keyring = new Keyring();
|
||||
|
||||
export { Keyring, keyring };
|
||||
export { Keyring };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { decodeAddress } from '@polkadot/keyring';
|
||||
@@ -15,26 +15,20 @@ function toHex (address: string): string {
|
||||
);
|
||||
}
|
||||
|
||||
const accountKey = (address: string): string =>
|
||||
`${ACCOUNT_PREFIX}${toHex(address)}`;
|
||||
export function accountKey (address: string): string {
|
||||
return `${ACCOUNT_PREFIX}${toHex(address)}`;
|
||||
}
|
||||
|
||||
const addressKey = (address: string): string =>
|
||||
`${ADDRESS_PREFIX}${toHex(address)}`;
|
||||
export function addressKey (address: string): string {
|
||||
return `${ADDRESS_PREFIX}${toHex(address)}`;
|
||||
}
|
||||
|
||||
const contractKey = (address: string): string =>
|
||||
`${CONTRACT_PREFIX}${toHex(address)}`;
|
||||
export function contractKey (address: string): string {
|
||||
return `${CONTRACT_PREFIX}${toHex(address)}`;
|
||||
}
|
||||
|
||||
const accountRegex = new RegExp(`^${ACCOUNT_PREFIX}0x[0-9a-f]*`, '');
|
||||
export const accountRegex = new RegExp(`^${ACCOUNT_PREFIX}0x[0-9a-f]*`, '');
|
||||
|
||||
const addressRegex = new RegExp(`^${ADDRESS_PREFIX}0x[0-9a-f]*`, '');
|
||||
export const addressRegex = new RegExp(`^${ADDRESS_PREFIX}0x[0-9a-f]*`, '');
|
||||
|
||||
const contractRegex = new RegExp(`^${CONTRACT_PREFIX}0x[0-9a-f]*`, '');
|
||||
|
||||
export {
|
||||
accountKey,
|
||||
accountRegex,
|
||||
addressKey,
|
||||
addressRegex,
|
||||
contractKey,
|
||||
contractRegex
|
||||
};
|
||||
export const contractRegex = new RegExp(`^${CONTRACT_PREFIX}0x[0-9a-f]*`, '');
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { packageInfo as settingsInfo } from '@polkadot/ui-settings/packageInfo';
|
||||
|
||||
export default [settingsInfo];
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import others from './detectOther.js';
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, others);
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
import { keyring } from './bundle.js';
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Be able to import json in TS
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { accountKey } from '../defaults.js';
|
||||
import { genericSubject } from './genericSubject.js';
|
||||
|
||||
export const accounts = genericSubject(accountKey, true);
|
||||
export const accounts = /*#__PURE__*/ genericSubject(accountKey, true);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { addressKey } from '../defaults.js';
|
||||
import { genericSubject } from './genericSubject.js';
|
||||
|
||||
export const addresses = genericSubject(addressKey);
|
||||
export const addresses = /*#__PURE__*/ genericSubject(addressKey);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { contractKey } from '../defaults.js';
|
||||
import { genericSubject } from './genericSubject.js';
|
||||
|
||||
export const contracts = genericSubject(contractKey);
|
||||
export const contracts = /*#__PURE__*/ genericSubject(contractKey);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { SubjectInfo } from './types.js';
|
||||
@@ -15,7 +15,7 @@ interface Result {
|
||||
contracts: SubjectInfo;
|
||||
}
|
||||
|
||||
export const obervableAll = combineLatest([
|
||||
export const obervableAll = /*#__PURE__*/ combineLatest([
|
||||
accounts.subject,
|
||||
addresses.subject,
|
||||
contracts.subject
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { BehaviorSubject } from 'rxjs';
|
||||
@@ -9,12 +9,10 @@ import type { KeyringJson, KeyringStore } from '../types.js';
|
||||
export interface SingleAddress {
|
||||
json: KeyringJson;
|
||||
option: KeyringSectionOption;
|
||||
type?: KeypairType;
|
||||
type?: KeypairType | undefined;
|
||||
}
|
||||
|
||||
export interface SubjectInfo {
|
||||
[index: string]: SingleAddress;
|
||||
}
|
||||
export type SubjectInfo = Record<string, SingleAddress>;
|
||||
|
||||
export interface AddressSubject {
|
||||
add: (store: KeyringStore, address: string, json: KeyringJson, type?: KeypairType) => SingleAddress;
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
import type { KeyringStruct } from '../types.js';
|
||||
|
||||
import { KeyringOption } from './index.js';
|
||||
|
||||
const keyringOption = new KeyringOption();
|
||||
|
||||
describe('KeyringOption', (): void => {
|
||||
it('should not allow initOptions to be called more than once', (): void => {
|
||||
const state: Partial<KeyringStruct> = {};
|
||||
|
||||
// first call
|
||||
keyringOption.init(state as KeyringStruct);
|
||||
|
||||
// second call
|
||||
expect(
|
||||
() => keyringOption.init(state as KeyringStruct)
|
||||
).toThrow('Unable to initialise options more than once');
|
||||
});
|
||||
});
|
||||
@@ -1,14 +1,13 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Subscription } from 'rxjs';
|
||||
import type { SingleAddress } from '../observable/types.js';
|
||||
import type { KeyringStruct } from '../types.js';
|
||||
import type { KeyringOptionInstance, KeyringOptions, KeyringSectionOption, KeyringSectionOptions } from './types.js';
|
||||
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { obervableAll } from '../observable/index.js';
|
||||
|
||||
let hasCalledInitOptions = false;
|
||||
@@ -36,7 +35,9 @@ const sortByCreated = (a: SingleAddress, b: SingleAddress): number => {
|
||||
};
|
||||
|
||||
export class KeyringOption implements KeyringOptionInstance {
|
||||
public readonly optionsSubject: BehaviorSubject<KeyringOptions> = new BehaviorSubject(this.emptyOptions());
|
||||
#allSub: Subscription | null = null;
|
||||
|
||||
public readonly optionsSubject = new BehaviorSubject<KeyringOptions>(this.emptyOptions());
|
||||
|
||||
public createOptionHeader (name: string): KeyringSectionOption {
|
||||
return {
|
||||
@@ -47,9 +48,11 @@ export class KeyringOption implements KeyringOptionInstance {
|
||||
}
|
||||
|
||||
public init (keyring: KeyringStruct): void {
|
||||
assert(!hasCalledInitOptions, 'Unable to initialise options more than once');
|
||||
if (hasCalledInitOptions) {
|
||||
throw new Error('Unable to initialise options more than once');
|
||||
}
|
||||
|
||||
obervableAll.subscribe((): void => {
|
||||
this.#allSub = obervableAll.subscribe((): void => {
|
||||
const opts = this.emptyOptions();
|
||||
|
||||
this.addAccounts(keyring, opts);
|
||||
@@ -68,7 +71,13 @@ export class KeyringOption implements KeyringOptionInstance {
|
||||
hasCalledInitOptions = true;
|
||||
}
|
||||
|
||||
private linkItems (items: { [index: string]: KeyringSectionOptions }): KeyringSectionOptions {
|
||||
public clear (): void {
|
||||
if (this.#allSub) {
|
||||
this.#allSub.unsubscribe();
|
||||
}
|
||||
}
|
||||
|
||||
private linkItems (items: Record<string, KeyringSectionOptions>): KeyringSectionOptions {
|
||||
return Object.keys(items).reduce((result, header): KeyringSectionOptions => {
|
||||
const options = items[header];
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringSectionOption } from './types.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringItemType, KeyringStruct } from '../types.js';
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
// (packageInfo imports will be kept as-is, user-editable)
|
||||
|
||||
import { packageInfo as settingsInfo } from '@polkadot/ui-settings/packageInfo';
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, [settingsInfo]);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/ui-keyring', path: 'auto', type: 'auto', version: '3.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/ui-keyring', path: 'auto', type: 'auto', version: '3.16.7-quantus.3' };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringJson, KeyringStore } from '../types.js';
|
||||
|
||||
@@ -1,26 +1,46 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringJson, KeyringStore } from '../types.js';
|
||||
|
||||
import mkdirp from 'mkdirp';
|
||||
import { mkdirpSync } from 'mkdirp';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
// NOTE untested and unused by any known apps, probably broken in various mysterious ways
|
||||
export class FileStore implements KeyringStore {
|
||||
#path: string;
|
||||
|
||||
constructor (path: string) {
|
||||
if (!fs.existsSync(path)) {
|
||||
mkdirp.sync(path);
|
||||
mkdirpSync(path);
|
||||
}
|
||||
|
||||
this.#path = path;
|
||||
}
|
||||
|
||||
private validateKey (key: string): boolean {
|
||||
// Make sure the key has a .json extension
|
||||
if (!key.endsWith('.json')) {
|
||||
console.error('Non-JSON file requested: ', key);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove '.json'
|
||||
const keyWithoutExtension = key.slice(0, -5);
|
||||
// Only allow alphanumeric characters, hyphens, and underscores in the base filename
|
||||
const safeKeyRegex = /^[a-zA-Z0-9_-]+$/;
|
||||
|
||||
if (!safeKeyRegex.test(keyWithoutExtension)) {
|
||||
console.error('Invalid key format detected: ', key);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public all (fn: (key: string, value: KeyringJson) => void): void {
|
||||
fs
|
||||
.readdirSync(this.#path)
|
||||
@@ -35,7 +55,9 @@ export class FileStore implements KeyringStore {
|
||||
public get (key: string, fn: (value: KeyringJson) => void): void {
|
||||
const value = this._readKey(key);
|
||||
|
||||
assert(value?.address, `Invalid JSON found for ${key}`);
|
||||
if (!value?.address) {
|
||||
throw new Error(`Invalid JSON found for ${key}`);
|
||||
}
|
||||
|
||||
fn(value);
|
||||
}
|
||||
@@ -51,6 +73,10 @@ export class FileStore implements KeyringStore {
|
||||
}
|
||||
|
||||
private _getPath (key: string): string {
|
||||
if (!this.validateKey(key)) {
|
||||
throw new Error('Invalid key format');
|
||||
}
|
||||
|
||||
return path.join(this.#path, key);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { BrowserStore } from './Browser.js';
|
||||
|
||||
@@ -1,30 +1,15 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-keyring authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringInstance as BaseKeyringInstance, KeyringOptions as KeyringOptionsBase, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '@polkadot/keyring/types';
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { EncryptedJson } from '@polkadot/util-crypto/json/types';
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { AddressSubject, SingleAddress } from './observable/types.js';
|
||||
|
||||
export interface ContractMeta {
|
||||
abi: string;
|
||||
genesisHash?: string | null;
|
||||
}
|
||||
export type ContractMeta = NonNullable<KeyringPair$Meta['contract']>;
|
||||
|
||||
export interface KeyringJson$Meta {
|
||||
contract?: ContractMeta;
|
||||
genesisHash?: string | null;
|
||||
hardwareType?: 'ledger';
|
||||
isHardware?: boolean;
|
||||
isInjected?: boolean;
|
||||
isRecent?: boolean;
|
||||
isTesting?: boolean;
|
||||
name?: string;
|
||||
whenCreated?: number;
|
||||
whenEdited?: number;
|
||||
whenUsed?: number;
|
||||
[index: string]: unknown;
|
||||
}
|
||||
export type KeyringJson$Meta = KeyringPair$Meta;
|
||||
|
||||
export interface KeyringJson {
|
||||
address: string;
|
||||
@@ -44,8 +29,8 @@ export interface KeyringStore {
|
||||
|
||||
export interface KeyringOptions extends KeyringOptionsBase {
|
||||
filter?: (json: KeyringJson) => boolean;
|
||||
genesisHash?: string | { toHex: () => string };
|
||||
genesisHashAdd?: string[];
|
||||
genesisHash?: HexString | { toHex: () => HexString };
|
||||
genesisHashAdd?: HexString[];
|
||||
isDevelopment?: boolean;
|
||||
store?: KeyringStore;
|
||||
}
|
||||
@@ -70,7 +55,7 @@ export interface KeyringStruct {
|
||||
readonly addresses: AddressSubject;
|
||||
readonly contracts: AddressSubject;
|
||||
readonly keyring: BaseKeyringInstance | undefined;
|
||||
readonly genesisHash?: string;
|
||||
readonly genesisHash?: string | undefined;
|
||||
|
||||
addExternal: (publicKey: Uint8Array, meta?: KeyringPair$Meta) => CreateResult;
|
||||
addPair: (pair: KeyringPair, password: string) => CreateResult;
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"exclude": [
|
||||
"**/*.spec.ts"
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../ui-settings/tsconfig.build.json" }
|
||||
]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src",
|
||||
"emitDeclarationOnly": false,
|
||||
"noEmit": true
|
||||
},
|
||||
"include": [
|
||||
"**/*.spec.ts"
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../ui-keyring/tsconfig.build.json" }
|
||||
]
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/ui/issues",
|
||||
"description": "Manages app settings",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/ui-settings#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,21 +14,21 @@
|
||||
"url": "https://github.com/polkadot-js/ui.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "3.1.1",
|
||||
"version": "3.16.7",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/networks": "^11.1.1",
|
||||
"@polkadot/util": "^11.1.1",
|
||||
"eventemitter3": "^4.0.7",
|
||||
"@polkadot/networks": "^14.0.3",
|
||||
"@polkadot/util": "^14.0.3",
|
||||
"eventemitter3": "^5.0.1",
|
||||
"store": "^2.0.12",
|
||||
"tslib": "^2.5.0"
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/store": "^2.0.2"
|
||||
"@types/store": "^2.0.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/networks": "*",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-settings authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-settings authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Endpoint, EndpointType, Option, SettingsStruct } from './types.js';
|
||||
|
||||
import EventEmitter from 'eventemitter3';
|
||||
import { EventEmitter } from 'eventemitter3';
|
||||
import store from 'store';
|
||||
|
||||
import { hasProcess, isUndefined } from '@polkadot/util';
|
||||
|
||||
import { CAMERA, CAMERA_DEFAULT, CRYPTOS, CRYPTOS_ETH, CRYPTOS_LEDGER, ENDPOINT_DEFAULT, ENDPOINTS, ICON_DEFAULT, ICONS, LANGUAGE_DEFAULT, LEDGER_CONN, LEDGER_CONN_DEFAULT, LOCKING, LOCKING_DEFAULT, METADATA_UP, METADATA_UP_DEFAULT, NOTIFICATION_DEFAULT, PREFIX_DEFAULT, PREFIXES, STORAGE, STORAGE_DEFAULT, UIMODE_DEFAULT, UIMODES, UITHEME_DEFAULT, UITHEMES } from './defaults/index.js';
|
||||
import { CAMERA, CAMERA_DEFAULT, CRYPTOS, CRYPTOS_ETH, CRYPTOS_LEDGER, ENDPOINT_DEFAULT, ENDPOINTS, ICON_DEFAULT, ICONS, LANGUAGE_DEFAULT, LEDGER_APP, LEDGER_APP_DEFAULT, LEDGER_CONN, LEDGER_CONN_DEFAULT, LOCKING, LOCKING_DEFAULT, METADATA_UP, METADATA_UP_DEFAULT, NOTIFICATION_DEFAULT, PREFIX_DEFAULT, PREFIXES, STORAGE, STORAGE_DEFAULT, UIMODE_DEFAULT, UIMODES, UITHEME_DEFAULT, UITHEMES } from './defaults/index.js';
|
||||
|
||||
type ChangeCallback = (settings: SettingsStruct) => void;
|
||||
type OnTypes = 'change';
|
||||
@@ -35,6 +35,8 @@ export class Settings implements SettingsStruct {
|
||||
|
||||
#icon: string;
|
||||
|
||||
#ledgerApp: string;
|
||||
|
||||
#ledgerConn: string;
|
||||
|
||||
#locking: string;
|
||||
@@ -57,9 +59,10 @@ export class Settings implements SettingsStruct {
|
||||
this.#emitter = new EventEmitter();
|
||||
|
||||
// will become deprecated for supporting substrate connect light clients. apiType structure should be used instead
|
||||
this.#apiUrl = (typeof settings.apiUrl === 'string' && settings.apiUrl) || (hasProcess && process.env && process.env.WS_URL) || (ENDPOINT_DEFAULT.value as string);
|
||||
this.#apiUrl = (typeof settings.apiUrl === 'string' && settings.apiUrl) || (hasProcess && process.env?.['WS_URL']) || (ENDPOINT_DEFAULT.value as string);
|
||||
this.#apiType = { param: this.#apiUrl, type: 'json-rpc' as EndpointType };
|
||||
this.#camera = withDefault(CAMERA, settings.camera, CAMERA_DEFAULT);
|
||||
this.#ledgerApp = withDefault(LEDGER_APP, settings.ledgerApp, LEDGER_APP_DEFAULT);
|
||||
this.#ledgerConn = withDefault(LEDGER_CONN, settings.ledgerConn, LEDGER_CONN_DEFAULT);
|
||||
this.#i18nLang = settings.i18nLang || LANGUAGE_DEFAULT;
|
||||
this.#icon = settings.icon || ICON_DEFAULT;
|
||||
@@ -96,6 +99,10 @@ export class Settings implements SettingsStruct {
|
||||
return this.#notification;
|
||||
}
|
||||
|
||||
public get ledgerApp (): string {
|
||||
return this.#ledgerApp;
|
||||
}
|
||||
|
||||
public get ledgerConn (): string {
|
||||
return this.#ledgerConn;
|
||||
}
|
||||
@@ -144,6 +151,10 @@ export class Settings implements SettingsStruct {
|
||||
return ICONS;
|
||||
}
|
||||
|
||||
public get availableLedgerApp (): Option[] {
|
||||
return LEDGER_APP;
|
||||
}
|
||||
|
||||
public get availableLedgerConn (): Option[] {
|
||||
return LEDGER_CONN;
|
||||
}
|
||||
@@ -183,6 +194,7 @@ export class Settings implements SettingsStruct {
|
||||
camera: this.#camera,
|
||||
i18nLang: this.#i18nLang,
|
||||
icon: this.#icon,
|
||||
ledgerApp: this.#ledgerApp,
|
||||
ledgerConn: this.#ledgerConn,
|
||||
locking: this.#locking,
|
||||
metadataUp: this.#metadataUp,
|
||||
@@ -199,6 +211,7 @@ export class Settings implements SettingsStruct {
|
||||
this.#apiUrl = settings.apiUrl || this.#apiUrl;
|
||||
this.#camera = settings.camera || this.#camera;
|
||||
this.#ledgerConn = settings.ledgerConn || this.#ledgerConn;
|
||||
this.#ledgerApp = settings.ledgerApp || this.#ledgerApp;
|
||||
this.#i18nLang = settings.i18nLang || this.#i18nLang;
|
||||
this.#icon = settings.icon || this.#icon;
|
||||
this.#locking = settings.locking || this.#locking;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-settings authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-settings authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { Settings, settings } from './Settings.js';
|
||||
|
||||
export { ENDPOINT_DEFAULT, ICON_DEFAULT, ICON_DEFAULT_HOST, LANGUAGE_DEFAULT, LOCKING_DEFAULT, PREFIX_DEFAULT, UIMODE_DEFAULT, UITHEME_DEFAULT } from './defaults/index.js';
|
||||
export { chains } from './defaults/chains.js';
|
||||
export { ENDPOINT_DEFAULT, ICON_DEFAULT, ICON_DEFAULT_HOST, LANGUAGE_DEFAULT, LOCKING_DEFAULT, PREFIX_DEFAULT, UIMODE_DEFAULT, UITHEME_DEFAULT } from './defaults/index.js';
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
export { settings, Settings };
|
||||
export { Settings, settings };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/ui-settings authors & contributors
|
||||
// Copyright 2017-2026 @polkadot/ui-settings authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { selectableNetworks } from '@polkadot/networks';
|
||||
@@ -6,8 +6,6 @@ import { objectSpread } from '@polkadot/util';
|
||||
|
||||
type ChainDef = string[];
|
||||
|
||||
const chains: Record <string, ChainDef> = selectableNetworks
|
||||
export const chains: Record <string, ChainDef> = /*#__PURE__*/ selectableNetworks
|
||||
.filter((n) => n.genesisHash.length)
|
||||
.reduce((chains, { genesisHash, network }) => objectSpread(chains, { [network]: genesisHash }), {});
|
||||
|
||||
export { chains };
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user