Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20d3af56ec | ||
|
|
367633a612 | ||
|
|
b127f678e9 | ||
|
|
3404ad2945 | ||
|
|
4059615d66 | ||
|
|
be9739ee9f | ||
|
|
6ec09907a2 | ||
|
|
677a778833 | ||
|
|
fa90f0a747 | ||
|
|
e721c4f508 | ||
|
|
7f5bd09322 | ||
|
|
5d6244fc0b | ||
|
|
58f12c4257 | ||
|
|
038d20b5e7 | ||
|
|
c9d8c52567 | ||
|
|
3b85773636 | ||
|
|
269740b775 | ||
|
|
fc732b8c44 | ||
|
|
2c4deb3f9d | ||
|
|
ebcb6857ad | ||
|
|
0ff31d7980 | ||
|
|
d897f25546 | ||
|
|
3c431d5a01 | ||
|
|
55ae71125d | ||
|
|
fcd8cee7f6 | ||
|
|
8aa4e60c4c | ||
|
|
85665dfa20 | ||
|
|
5f8f3e6309 | ||
|
|
166845e367 | ||
|
|
7c7233efd1 | ||
|
|
cb7f0da916 | ||
|
|
7d654c236f | ||
|
|
6b4d9aac29 | ||
|
|
4f863ddc29 | ||
|
|
a4a85a3a5d | ||
|
|
2a6669c25d | ||
|
|
cb4c9fd90a | ||
|
|
28beb44374 | ||
|
|
4a4847b032 | ||
|
|
506c20a900 | ||
|
|
736656f34f | ||
|
|
31274916f9 | ||
|
|
6e1afdc2f8 | ||
|
|
fd26d223be | ||
|
|
86d8c81c27 | ||
|
|
2de22cbb31 | ||
|
|
c1b8098b9e | ||
|
|
ee0ed25a83 | ||
|
|
7ef452bdf0 | ||
|
|
eb41ab5bed | ||
|
|
6947b1e4d9 | ||
|
|
527b4f0eeb | ||
|
|
44f7443d13 | ||
|
|
2b800577a5 | ||
|
|
c9ca01e96b | ||
|
|
ca93f3337f | ||
|
|
557a681fe9 | ||
|
|
97b1fdf089 | ||
|
|
9971684972 | ||
|
|
04ab9dd77d | ||
|
|
b2bf9f4d53 | ||
|
|
4d629fd8ce | ||
|
|
37fa211fdb | ||
|
|
a4a9a3dead | ||
|
|
e025195a9b | ||
|
|
744e4c72d5 | ||
|
|
f23f0944a8 | ||
|
|
6e28612f34 | ||
|
|
57b0601f9b | ||
|
|
ee9d76639c | ||
|
|
db25938ad7 | ||
|
|
175b0ef307 | ||
|
|
944c50d015 | ||
|
|
191db8ea10 | ||
|
|
095db555ba | ||
|
|
a23989ca9d | ||
|
|
a82ebdf6f9 | ||
|
|
e6fbf01aa1 | ||
|
|
00876f0b64 | ||
|
|
22aab4a4e6 | ||
|
|
6971012f4a | ||
|
|
fc217b66ce | ||
|
|
fb42e8f7ee | ||
|
|
b4e3ed0a42 | ||
|
|
e1218157a3 | ||
|
|
2dc171639d | ||
|
|
4da1e8ba62 | ||
|
|
d498ad4424 | ||
|
|
9a9650261b | ||
|
|
6dfff0d40c | ||
|
|
0770bed5fd | ||
|
|
6fde7bc5a0 | ||
|
|
f55e88c116 | ||
|
|
abd4cfdd1f | ||
|
|
f261ea2924 | ||
|
|
f14d2681b1 | ||
|
|
b9be030f12 | ||
|
|
bc103d9479 | ||
|
|
c76c754741 | ||
|
|
bd21e730b3 | ||
|
|
a2cfdb8ca7 | ||
|
|
4857de9f38 | ||
|
|
d525b8c92d | ||
|
|
2afbce2652 | ||
|
|
3c7525649e | ||
|
|
6ebcc2dd6d | ||
|
|
120438d7e6 | ||
|
|
f5f1bc6f4f | ||
|
|
28d5302fd6 | ||
|
|
773cc29b11 | ||
|
|
a20c7eb2e5 | ||
|
|
487d0d9a57 | ||
|
|
a910e9ce6f | ||
|
|
1062de7aa8 | ||
|
|
4cabc67b24 | ||
|
|
13bc84e30b | ||
|
|
67fe7738d8 | ||
|
|
13c6b4e553 | ||
|
|
9306f9db92 | ||
|
|
62a30f258e | ||
|
|
81609aba59 | ||
|
|
301d73d13f | ||
|
|
92abf4463d | ||
|
|
b018f78b77 | ||
|
|
608117f04a | ||
|
|
2ac00565b0 | ||
|
|
673a59af58 | ||
|
|
aa394fe7cd | ||
|
|
ee7f2cc7f5 | ||
|
|
da6efc821e | ||
|
|
a3b884d437 | ||
|
|
560c054750 | ||
|
|
09621d0010 | ||
|
|
37a81d9594 | ||
|
|
62182bae03 | ||
|
|
2ee03a5f81 | ||
|
|
7a5a88a135 | ||
|
|
f4e0e2111f | ||
|
|
aac902011e | ||
|
|
a030330808 | ||
|
|
d108beafd4 | ||
|
|
90e20ed4d2 | ||
|
|
723ec10fa1 | ||
|
|
cf9082e03a | ||
|
|
3dce4fe04a | ||
|
|
55ebc4f0d9 | ||
|
|
ce2122e9fa | ||
|
|
0fb55fe633 | ||
|
|
adca13bc8c | ||
|
|
b939c3593c | ||
|
|
aa70b81a89 | ||
|
|
f3e1d6beda | ||
|
|
754bc4dc21 | ||
|
|
a8df82dfe0 | ||
|
|
4ff56f5cfe | ||
|
|
1fd9f04458 | ||
|
|
a28306f487 | ||
|
|
19941bcb61 | ||
|
|
2cb85866ab | ||
|
|
8556de1fa2 | ||
|
|
143d070d21 | ||
|
|
2a53b1121e | ||
|
|
0733137f79 | ||
|
|
cc918660cb | ||
|
|
3527f8c7d9 | ||
|
|
41caf2fd6d | ||
|
|
d407513dd1 | ||
|
|
bd76349552 | ||
|
|
0ec894b732 | ||
|
|
be4cb52dd3 | ||
|
|
456eaeeb94 | ||
|
|
0ec50b6159 | ||
|
|
98336fd2e5 | ||
|
|
7b3bbd3ef2 | ||
|
|
49afd1fe09 | ||
|
|
0df17104d5 | ||
|
|
db8434559e | ||
|
|
eaf9d97ae3 | ||
|
|
3e6d86b768 | ||
|
|
8aab41648e | ||
|
|
4a535c08c7 | ||
|
|
715486d54e | ||
|
|
1073dc14aa | ||
|
|
5cca95e855 | ||
|
|
942b623273 | ||
|
|
eea99656ad | ||
|
|
04b6df9ac5 | ||
|
|
d5132b56de |
@@ -11,6 +11,6 @@ jobs:
|
||||
steps:
|
||||
- uses: jacogr/action-approve@795afd1dd096a2071d7ec98740661af4e853b7da
|
||||
with:
|
||||
authors: jacogr
|
||||
authors: jacogr, TarikGul
|
||||
labels: -auto
|
||||
token: ${{ secrets.GH_PAT_BOT }}
|
||||
|
||||
@@ -12,13 +12,14 @@ jobs:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
- uses: denoland/setup-deno@v1
|
||||
with:
|
||||
deno-version: vx.x.x
|
||||
# Deno v2 throws errors with specific types therefore we set it to the last version before v2
|
||||
deno-version: v1.42.x
|
||||
- name: ${{ matrix.step }}
|
||||
if: always()
|
||||
run: |
|
||||
|
||||
@@ -18,11 +18,11 @@ 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 }}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/dev authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module.exports = require('@polkadot/dev/config/prettier.cjs');
|
||||
|
||||
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
+5
-8
@@ -1,18 +1,15 @@
|
||||
compressionLevel: mixed
|
||||
|
||||
enableGlobalCache: false
|
||||
|
||||
enableImmutableInstalls: false
|
||||
|
||||
enableProgressBars: false
|
||||
|
||||
logFilters:
|
||||
# Discard any "cannot be found in cache" messages
|
||||
- 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-3.2.0.cjs
|
||||
yarnPath: .yarn/releases/yarn-4.5.1.cjs
|
||||
|
||||
+153
@@ -1,5 +1,158 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 13.2.3 Nov 11, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Vara support to the Generic Ledger App ([#1958](https://github.com/polkadot-js/common/pull/1958)) (Thanks to https://github.com/breathx)
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump Dev to 0.82.1 ([#1959](https://github.com/polkadot-js/common/pull/1959))
|
||||
|
||||
|
||||
## 13.2.2 Oct 28, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Polimec support to the Generic Ledger App ([#1945](https://github.com/polkadot-js/common/pull/1945)) (Thanks to https://github.com/lrazovic)
|
||||
- Add Frequency to the Generic Ledger App ([#1955](https://github.com/polkadot-js/common/pull/1955)) (Thanks to https://github.com/wilwade)
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump yarn to 4.5.1 ([#1953](https://github.com/polkadot-js/common/pull/1953))
|
||||
|
||||
|
||||
## 13.2.1 Oct 21, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add bittensor to genericLedgerApps (Thanks to https://github.com/camfairchild) ([#1941](https://github.com/polkadot-js/common/pull/1941))
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix Deno CI Build ([#1947](https://github.com/polkadot-js/common/pull/1947))
|
||||
- Bump yarn to 4.5.0 ([#1946](https://github.com/polkadot-js/common/pull/1946))
|
||||
- Update Ledger Deps ([#1948](https://github.com/polkadot-js/common/pull/1948))
|
||||
- Update WS and deps ([#1949](https://github.com/polkadot-js/common/pull/1949))
|
||||
- Bump polkadot/wasm to 7.4.1 ([#1950](https://github.com/polkadot-js/common/pull/1950))
|
||||
- Bump dev to 0.81.2 ([#1951](https://github.com/polkadot-js/common/pull/1951))
|
||||
- Allows for CJS target in build
|
||||
|
||||
|
||||
## 13.1.1 Sep 16, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
HydraDx - Hydration Rebrand Thanks to (https://github.com/jak-pan) ([#1923](https://github.com/polkadot-js/common/pull/1923))
|
||||
|
||||
Changes:
|
||||
|
||||
- Update all deps that have patch releases ([#1934](https://github.com/polkadot-js/common/pull/1934))
|
||||
- Bump yarn to 4.4.1 ([#1940](https://github.com/polkadot-js/common/pull/1940))
|
||||
- Update ss58-registry to 1.50.0 ([#1937](https://github.com/polkadot-js/common/pull/1937))
|
||||
- Update dev and typescript ([#1936](https://github.com/polkadot-js/common/pull/1936))
|
||||
- Add Encointer and Integritee to Ledger, and adjust tests ([#1939](https://github.com/polkadot-js/common/pull/1939))
|
||||
- This PR added the addition of `genericLedgerApps` and `prevLedgerRecord` objects. They both combine into `ledgerApps` in `hw-ledger/defaults`.
|
||||
|
||||
|
||||
## 13.0.2 July 12, 2024
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add peaq support for ledger (Thanks to https://github.com/lavish0000)
|
||||
|
||||
|
||||
## 13.0.1 July 12, 2024
|
||||
|
||||
Breaking Changes:
|
||||
|
||||
- Add Support for latest Ledger App
|
||||
- This deprecates `class Ledger` in favor of `class LedgerGeneric`
|
||||
- More info in the following PR ([#1925](https://github.com/polkadot-js/common/pull/1925))
|
||||
|
||||
Changes:
|
||||
|
||||
- Bump dev to 0.79.1
|
||||
- Comments around pair encode/decode 1-3
|
||||
- Bump ws, react-native, ss58Registry
|
||||
- Bump yarn to 4.3.1
|
||||
- Update CI to checkout and setup_node v4
|
||||
|
||||
|
||||
## 12.6.2 Dec 18, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Update to latest `@polkadot/wasm-crypto`
|
||||
- Upgrade dependencies to latest versions
|
||||
|
||||
|
||||
## 12.6.1 Nov 18, 2023
|
||||
|
||||
Contributed:
|
||||
|
||||
- Ledger support for Quartz (Thanks to https://github.com/CertainLach)
|
||||
- Add flag to disable same-version esm/cjs warnings (Thanks to https://github.com/forgetso)
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust logger check for `process.env`
|
||||
- Adjust `isRiscV` helper to check for `PVM\0` bytes
|
||||
- Drop support for Node 16 (EOL 11 Sep 2023)
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 12.5.1 Sep 15, 2023
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add `isRiskV` helper (Thanks to https://github.com/peetzweg)
|
||||
- Ledger support for Enjin & Matrixchain (Thanks to https://github.com/leonardocustodio)
|
||||
|
||||
Changes:
|
||||
|
||||
- Expand interface type comments (assists in-editor helpers)
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 12.4.2 Aug 23, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix `u8aTo{BigInt, Bn, Number}` for non-negative `i{8, 16, 32...}` inputs
|
||||
- Extend `u8aToBuffer` with `hasBuffer` check
|
||||
- Adjust util tests (extract input/output arrays)
|
||||
|
||||
|
||||
## 12.4.1 Aug 17, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Add support for Ledger `signRaw`, as exposed by lower-level
|
||||
- Update code to use `?.` shortcuts where appropriate
|
||||
- Adjust `u8aToBuffer` & `isBuffer` typings to not require `Buffer`
|
||||
- Use `stringify/import.meta.url` helpers in specs
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 12.3.2 Jun 12, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `SubstrateNetwork` typing with `HexString` genesisHash
|
||||
- Re-export `Constructor<T>` type (deprecated, replaced with `Class<T>`)
|
||||
|
||||
|
||||
## 12.3.1 Jun 11, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
- Only allow padding characters in base64 strings
|
||||
- Expand typings for keyring meta with known keys
|
||||
- Adjust object index access for stricter tsconfig settings
|
||||
|
||||
|
||||
## 12.2.2 Jun 4, 2023
|
||||
|
||||
Changes:
|
||||
|
||||
+13
-4
@@ -1,13 +1,15 @@
|
||||
1622 Jaco 12.2.2 (#1839)
|
||||
12 Carlo Sala feat(networks): support ledger for pendulum (#1739)
|
||||
1674 Jaco Bump deps (#1912)
|
||||
31 Tarik Gul 13.2.3 (#1960)
|
||||
13 Carlo Sala feat(networks): add zeitgeist Ledger support (#1840)
|
||||
9 Antoine Estienne Add eth uri keyring test (#1291)
|
||||
6 Amaury Martiny Add tests from Rust (#283)
|
||||
5 Jakub Pánik Add HydraDX parachain to genesis (#1583)
|
||||
6 Jakub Pánik HydraDX -> Hydration rebrand (#1923)
|
||||
5 kwingram25 Add BN consts and timeToString (#610)
|
||||
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
||||
4 pan add bifrost kusama (#1626)
|
||||
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
||||
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
||||
2 Cameron Fairchild Add bittensor details (#1783)
|
||||
2 Gav Wood Fix stake:unstake (#182)
|
||||
2 Hyungsuk Kang Add cross client Encryption/Decryption (#496)
|
||||
2 Jared Norris Add Sora network (#1306)
|
||||
@@ -23,8 +25,9 @@
|
||||
1 amphineko chore: fix typo in versionDetect messages (#941)
|
||||
1 Axel Chalon Simplify @polkadot/keyring KeyringPair (#419)
|
||||
1 Brad Larson [FIX] Adjust error message (#646)
|
||||
1 Cameron Fairchild Add bittensor details (#1783)
|
||||
1 Carlos Medeiros add hydradx to knownLedger (#1647)
|
||||
1 Chris Get rid of warnings for dual esm and cjs packages of the same version (#1890)
|
||||
1 Dmitrii Novikov Add `Vara` support to Generic Ledger App (#1958)
|
||||
1 Eliott Teissonniere add nodle ledger specs (#1089)
|
||||
1 Guilane DENGUIR feat(VTB): Added support for VTB blockchain (#1651)
|
||||
1 h4x3rotab Throws an error when signing with a locked keypair (#578)
|
||||
@@ -36,13 +39,17 @@
|
||||
1 JesseAbram added check if valid address to docs (#440)
|
||||
1 joe petrowski Add example for multisig address creation (#590)
|
||||
1 kaelnew add ledger support for stafi (#1569)
|
||||
1 Leonardo Custodio Ledger support (#1879)
|
||||
1 Leonardo Razovic feat: add Polimec (#1945)
|
||||
1 Lezek123 logger - wildcard include/exclude with DEBUG env (#932)
|
||||
1 Lovish Arora Add peaq support for ledger (#1928)
|
||||
1 Mario Neises remove redudant export (#257)
|
||||
1 Miguel Hervas Add CFG Ledger Support (#1057)
|
||||
1 Mikhail Fedosov feat: add 3dpass network (#1769)
|
||||
1 Mohsan Riaz Add Ternoa for ledger hardware support (#1711)
|
||||
1 nahuseyoum Reserving 65 for Aventus based on the new extended range (#871)
|
||||
1 Nantian add acala ledger config (#1485)
|
||||
1 peetzweg/ adds `isRiscV` guard function similar to isWasm (#1878)
|
||||
1 qwer951123 Add acala genesis (#1161)
|
||||
1 Raoul Millais Fix yarn add instructions in x-global README (#873)
|
||||
1 Raymond Zhong Add Edgeware ledger app (#1006)
|
||||
@@ -54,6 +61,8 @@
|
||||
1 Tomokazu Kozuma fix comment (#1119)
|
||||
1 Tore19 Add stafi genesis hash (#1096)
|
||||
1 Wei Tang ss58: add Kulupu prefix to the list (#595)
|
||||
1 Wil Wade Add Frequency to the Generic Ledger App (#1955)
|
||||
1 WoeOm Handing high precision scenes (#450)
|
||||
1 xx network Add xxnetwork genesis hash and ledger app (#1463)
|
||||
1 Yaroslav Bolyukin Add quartz support for ledger, update unique slip-0044 identifier (#1882)
|
||||
1 Yuri Extra check for process for browser bundles (#923)
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/dev authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import baseConfig from '@polkadot/dev/config/eslint';
|
||||
|
||||
+7
-7
@@ -6,7 +6,7 @@
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common#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": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"versions": {
|
||||
"git": "12.2.2",
|
||||
"npm": "12.2.2"
|
||||
"git": "13.2.3",
|
||||
"npm": "13.2.3"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
@@ -37,10 +37,10 @@
|
||||
"test:one": "polkadot-dev-run-test --env browser"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/dev": "^0.75.16",
|
||||
"@types/node": "^20.2.5"
|
||||
"@polkadot/dev": "^0.82.1",
|
||||
"@types/node": "^22.7.5"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^5.1.3"
|
||||
"typescript": "^5.5.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/hw-ledger-transports#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,18 +14,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@ledgerhq/hw-transport": "^6.28.4",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.15",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.15",
|
||||
"@polkadot/util": "12.2.2",
|
||||
"tslib": "^2.5.3"
|
||||
"@ledgerhq/hw-transport": "^6.31.4",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.29.4",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.29.4",
|
||||
"@polkadot/util": "13.2.3",
|
||||
"tslib": "^2.8.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.28.12"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.31.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import LedgerHid from '@ledgerhq/hw-transport-webhid';
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export default [];
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { createDefs } from './util.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './empty.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import LedgerHid from '@ledgerhq/hw-transport-node-hid-singleton';
|
||||
|
||||
+3
-3
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger-transports authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger-transports 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/hw-ledger-transports authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger-transports authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '12.2.2' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '13.2.3' };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './empty.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// CJS, so we use import * syntax
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Transport, TransportDef, TransportType } from './types.js';
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/hw-ledger#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -13,16 +13,16 @@
|
||||
"url": "https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/hw-ledger-transports": "12.2.2",
|
||||
"@polkadot/util": "12.2.2",
|
||||
"@zondax/ledger-substrate": "^0.40.7",
|
||||
"tslib": "^2.5.3"
|
||||
"@polkadot/hw-ledger-transports": "13.2.3",
|
||||
"@polkadot/util": "13.2.3",
|
||||
"@zondax/ledger-substrate": "1.0.0",
|
||||
"tslib": "^2.8.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
import type { TransportDef, TransportType } from '@polkadot/hw-ledger-transports/types';
|
||||
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerVersion } from './types.js';
|
||||
|
||||
import { newSubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { hexAddPrefix, u8aToBuffer, u8aWrapBytes } from '@polkadot/util';
|
||||
|
||||
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants.js';
|
||||
import { ledgerApps } from './defaults.js';
|
||||
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
type Chain = keyof typeof ledgerApps;
|
||||
|
||||
type WrappedResult = Awaited<ReturnType<SubstrateApp['getAddress' | 'getVersion' | 'sign']>>;
|
||||
|
||||
/** @internal Wraps a SubstrateApp call, checking the result for any errors which result in a rejection */
|
||||
async function wrapError <T extends WrappedResult> (promise: Promise<T>): Promise<T> {
|
||||
const result = await promise;
|
||||
|
||||
if (result.return_code !== LEDGER_SUCCESS_CODE) {
|
||||
throw new Error(result.error_message);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/** @internal Wraps a sign/signRaw call and returns the associated signature */
|
||||
function sign (method: 'sign' | 'signRaw', message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): (app: SubstrateApp) => Promise<LedgerSignature> {
|
||||
return async (app: SubstrateApp): Promise<LedgerSignature> => {
|
||||
const { signature } = await wrapError(app[method](account + accountOffset, change, addressIndex + addressOffset, u8aToBuffer(message)));
|
||||
|
||||
return {
|
||||
signature: hexAddPrefix(signature.toString('hex'))
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Ledger
|
||||
*
|
||||
* @description
|
||||
* Legacy wrapper for a ledger app -
|
||||
* - it connects automatically on use, creating an underlying interface as required
|
||||
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate)
|
||||
* @deprecated Use LedgerGeneric for up to date integration with ledger
|
||||
*/
|
||||
export class Ledger {
|
||||
readonly #ledgerName: string;
|
||||
readonly #transportDef: TransportDef;
|
||||
|
||||
#app: SubstrateApp | null = null;
|
||||
|
||||
constructor (transport: TransportType, chain: Chain) {
|
||||
const ledgerName = ledgerApps[chain];
|
||||
const transportDef = transports.find(({ type }) => type === transport);
|
||||
|
||||
if (!ledgerName) {
|
||||
throw new Error(`Unsupported Ledger chain ${chain}`);
|
||||
} else if (!transportDef) {
|
||||
throw new Error(`Unsupported Ledger transport ${transport}`);
|
||||
}
|
||||
|
||||
this.#ledgerName = ledgerName;
|
||||
this.#transportDef = transportDef;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the address associated with a specific account & address offset. Optionally
|
||||
* asks for on-device confirmation
|
||||
*/
|
||||
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
|
||||
return this.withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
|
||||
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
||||
|
||||
return {
|
||||
address,
|
||||
publicKey: hexAddPrefix(pubKey)
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version of the Ledger application on the device
|
||||
*/
|
||||
public async getVersion (): Promise<LedgerVersion> {
|
||||
return this.withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
|
||||
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
|
||||
|
||||
return {
|
||||
isLocked,
|
||||
isTestMode,
|
||||
version: [major, minor, patch]
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Signs a transaction on the Ledger device
|
||||
*/
|
||||
public async sign (message: Uint8Array, accountOffset?: number, addressOffset?: number, options?: Partial<AccountOptions>): Promise<LedgerSignature> {
|
||||
return this.withApp(sign('sign', message, accountOffset, addressOffset, options));
|
||||
}
|
||||
|
||||
/**
|
||||
* Signs a message (non-transactional) on the Ledger device
|
||||
*/
|
||||
public async signRaw (message: Uint8Array, accountOffset?: number, addressOffset?: number, options?: Partial<AccountOptions>): Promise<LedgerSignature> {
|
||||
return this.withApp(sign('signRaw', u8aWrapBytes(message), accountOffset, addressOffset, options));
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* Returns a created SubstrateApp to perform operations against. Generally
|
||||
* this is only used internally, to ensure consistent bahavior.
|
||||
*/
|
||||
async withApp <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> {
|
||||
try {
|
||||
if (!this.#app) {
|
||||
const transport = await this.#transportDef.create();
|
||||
|
||||
// We need this override for the actual type passing - the Deno environment
|
||||
// is quite a bit stricter and it yields invalids between the two (specifically
|
||||
// since we mangle the imports from .default in the types for CJS/ESM and between
|
||||
// esm.sh versions this yields problematic outputs)
|
||||
//
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
||||
this.#app = newSubstrateApp(transport as any, this.#ledgerName);
|
||||
}
|
||||
|
||||
return await fn(this.#app);
|
||||
} catch (error) {
|
||||
this.#app = null;
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { TransportDef, TransportType } from '@polkadot/hw-ledger-transports/types';
|
||||
import type { AccountOptionsGeneric, LedgerAddress, LedgerSignature, LedgerVersion } from './types.js';
|
||||
|
||||
import { PolkadotGenericApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { hexAddPrefix, u8aToBuffer, u8aWrapBytes } from '@polkadot/util';
|
||||
|
||||
import { ledgerApps } from './defaults.js';
|
||||
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
type Chain = keyof typeof ledgerApps;
|
||||
|
||||
type WrappedResult = Awaited<ReturnType<PolkadotGenericApp['getAddress' | 'getVersion' | 'sign' | 'signWithMetadata']>>;
|
||||
|
||||
// FIXME This type is a copy of the `class ResponseError`
|
||||
// imported from `@zondax/ledger-js`. Happens because ledger-js includes
|
||||
// circular dependencies. This is a hack to avoid versioning issues
|
||||
// with Deno.
|
||||
interface ResponseError {
|
||||
errorMessage: string
|
||||
returnCode: number
|
||||
}
|
||||
|
||||
/** @internal Wraps a PolkadotGenericApp call, checking the result for any errors which result in a rejection */
|
||||
async function wrapError <T extends WrappedResult> (promise: Promise<T>): Promise<T> {
|
||||
let result: T;
|
||||
|
||||
try {
|
||||
result = await promise;
|
||||
} catch (e: unknown) {
|
||||
// We check to see if the propogated error is the newer ResponseError type.
|
||||
// The response code use to be part of the result, but with the latest breaking changes from 0.42.x
|
||||
// the interface and it's types have completely changed.
|
||||
if ((e as ResponseError).returnCode) {
|
||||
throw new Error(`${(e as ResponseError).returnCode}: ${(e as ResponseError).errorMessage}`);
|
||||
}
|
||||
|
||||
throw new Error((e as Error).message);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/** @internal Wraps a sign/signRaw call and returns the associated signature */
|
||||
function sign (method: 'sign' | 'signRaw', message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
|
||||
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
|
||||
|
||||
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
|
||||
const { signature } = await wrapError(app[method](bip42Path, u8aToBuffer(message)));
|
||||
|
||||
return {
|
||||
signature: hexAddPrefix(signature.toString('hex'))
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/** @internal Wraps a signWithMetadata call and returns the associated signature */
|
||||
function signWithMetadata (message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0, { metadata }: Partial<AccountOptionsGeneric> = {}): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
|
||||
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
|
||||
|
||||
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
|
||||
if (!metadata) {
|
||||
throw new Error('The metadata option must be present when using signWithMetadata');
|
||||
}
|
||||
|
||||
const bufferMsg = Buffer.from(message);
|
||||
|
||||
const { signature } = await wrapError(app.signWithMetadata(bip42Path, bufferMsg, metadata));
|
||||
|
||||
return {
|
||||
signature: hexAddPrefix(signature.toString('hex'))
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Ledger
|
||||
*
|
||||
* @description
|
||||
* A very basic wrapper for a ledger app -
|
||||
* - it connects automatically on use, creating an underlying interface as required
|
||||
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate-js)
|
||||
*/
|
||||
export class LedgerGeneric {
|
||||
readonly #transportDef: TransportDef;
|
||||
readonly #slip44: number;
|
||||
/**
|
||||
* The chainId is represented by the chains token in all lowercase. Example: Polkadot -> dot
|
||||
*/
|
||||
readonly #chainId?: string;
|
||||
/**
|
||||
* The metaUrl is seen as a server url that the underlying `PolkadotGenericApp` will use to
|
||||
* retrieve the signature given a tx blob, and a chainId. It is important to note that if you would like to avoid
|
||||
* having any network calls made, use `signWithMetadata`, and avoid `sign`.
|
||||
*/
|
||||
readonly #metaUrl?: string;
|
||||
|
||||
#app: PolkadotGenericApp | null = null;
|
||||
|
||||
constructor (transport: TransportType, chain: Chain, slip44: number, chainId?: string, metaUrl?: string) {
|
||||
const ledgerName = ledgerApps[chain];
|
||||
const transportDef = transports.find(({ type }) => type === transport);
|
||||
|
||||
if (!ledgerName) {
|
||||
throw new Error(`Unsupported Ledger chain ${chain}`);
|
||||
} else if (!transportDef) {
|
||||
throw new Error(`Unsupported Ledger transport ${transport}`);
|
||||
}
|
||||
|
||||
this.#metaUrl = metaUrl;
|
||||
this.#chainId = chainId;
|
||||
this.#slip44 = slip44;
|
||||
this.#transportDef = transportDef;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the address associated with a specific account & address offset. Optionally
|
||||
* asks for on-device confirmation
|
||||
*/
|
||||
public async getAddress (ss58Prefix: number, confirm = false, accountIndex = 0, addressOffset = 0): Promise<LedgerAddress> {
|
||||
const bip42Path = `m/44'/${this.#slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
|
||||
|
||||
return this.withApp(async (app: PolkadotGenericApp): Promise<LedgerAddress> => {
|
||||
const { address, pubKey } = await wrapError(app.getAddress(bip42Path, ss58Prefix, confirm));
|
||||
|
||||
return {
|
||||
address,
|
||||
publicKey: hexAddPrefix(pubKey)
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the version of the Ledger application on the device
|
||||
*/
|
||||
public async getVersion (): Promise<LedgerVersion> {
|
||||
return this.withApp(async (app: PolkadotGenericApp): Promise<LedgerVersion> => {
|
||||
const { deviceLocked: isLocked, major, minor, patch, testMode: isTestMode } = await wrapError(app.getVersion());
|
||||
|
||||
return {
|
||||
isLocked: !!isLocked,
|
||||
isTestMode: !!isTestMode,
|
||||
version: [major || 0, minor || 0, patch || 0]
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Signs a transaction on the Ledger device. This requires the LedgerGeneric class to be instantiated with `chainId`, and `metaUrl`
|
||||
*/
|
||||
public async sign (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
|
||||
return this.withApp(sign('sign', message, this.#slip44, accountIndex, addressOffset));
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Signs a message (non-transactional) on the Ledger device
|
||||
*/
|
||||
public async signRaw (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
|
||||
return this.withApp(sign('signRaw', u8aWrapBytes(message), this.#slip44, accountIndex, addressOffset));
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Signs a transaction on the ledger device provided some metadata.
|
||||
*/
|
||||
public async signWithMetadata (message: Uint8Array, accountIndex?: number, addressOffset?: number, options?: Partial<AccountOptionsGeneric>): Promise<LedgerSignature> {
|
||||
return this.withApp(signWithMetadata(message, this.#slip44, accountIndex, addressOffset, options));
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* Returns a created PolkadotGenericApp to perform operations against. Generally
|
||||
* this is only used internally, to ensure consistent bahavior.
|
||||
*/
|
||||
async withApp <T> (fn: (app: PolkadotGenericApp) => Promise<T>): Promise<T> {
|
||||
try {
|
||||
if (!this.#app) {
|
||||
const transport = await this.#transportDef.create();
|
||||
|
||||
// We need this override for the actual type passing - the Deno environment
|
||||
// is quite a bit stricter and it yields invalids between the two (specifically
|
||||
// since we mangle the imports from .default in the types for CJS/ESM and between
|
||||
// esm.sh versions this yields problematic outputs)
|
||||
//
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
||||
this.#app = new PolkadotGenericApp(transport as any, this.#chainId, this.#metaUrl);
|
||||
}
|
||||
|
||||
return await fn(this.#app);
|
||||
} catch (error) {
|
||||
this.#app = null;
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,126 +1,8 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
import type { TransportDef, TransportType } from '@polkadot/hw-ledger-transports/types';
|
||||
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerVersion } from './types.js';
|
||||
|
||||
import { newSubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { hexAddPrefix, u8aToBuffer } from '@polkadot/util';
|
||||
|
||||
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants.js';
|
||||
import { ledgerApps } from './defaults.js';
|
||||
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
type Chain = keyof typeof ledgerApps;
|
||||
|
||||
type WrappedResult = Awaited<ReturnType<SubstrateApp['getAddress' | 'getVersion' | 'sign']>>;
|
||||
|
||||
/** @internal Wraps a SubstrateApp call, checking the result for any errors which result in a rejection */
|
||||
async function wrapError <T extends WrappedResult> (promise: Promise<T>): Promise<T> {
|
||||
const result = await promise;
|
||||
|
||||
if (result.return_code !== LEDGER_SUCCESS_CODE) {
|
||||
throw new Error(result.error_message);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Ledger
|
||||
*
|
||||
* @description
|
||||
* A very basic wrapper for a ledger app -
|
||||
* - it connects automatically on use, creating an underlying interface as required
|
||||
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate)
|
||||
*/
|
||||
export class Ledger {
|
||||
readonly #ledgerName: string;
|
||||
readonly #transportDef: TransportDef;
|
||||
|
||||
#app: SubstrateApp | null = null;
|
||||
|
||||
constructor (transport: TransportType, chain: Chain) {
|
||||
const ledgerName = ledgerApps[chain];
|
||||
const transportDef = transports.find(({ type }) => type === transport);
|
||||
|
||||
if (!ledgerName) {
|
||||
throw new Error(`Unsupported Ledger chain ${chain}`);
|
||||
} else if (!transportDef) {
|
||||
throw new Error(`Unsupported Ledger transport ${transport}`);
|
||||
}
|
||||
|
||||
this.#ledgerName = ledgerName;
|
||||
this.#transportDef = transportDef;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the address associated with a specific account & address offset. Optionally
|
||||
* asks for on-device confirmation
|
||||
*/
|
||||
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
|
||||
return this.withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
|
||||
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
||||
|
||||
return {
|
||||
address,
|
||||
publicKey: hexAddPrefix(pubKey)
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version of the Ledger application on the device
|
||||
*/
|
||||
public async getVersion (): Promise<LedgerVersion> {
|
||||
return this.withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
|
||||
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
|
||||
|
||||
return {
|
||||
isLocked,
|
||||
isTestMode,
|
||||
version: [major, minor, patch]
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Signs a transaction on the Ledger device
|
||||
*/
|
||||
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
|
||||
return this.withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
|
||||
const buffer = u8aToBuffer(message);
|
||||
const { signature } = await wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
|
||||
|
||||
return {
|
||||
signature: hexAddPrefix(signature.toString('hex'))
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* Returns a created SubstrateApp to perform operations against. Generally
|
||||
* this is only used internally, to ensure consistent bahavior.
|
||||
*/
|
||||
async withApp <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> {
|
||||
try {
|
||||
if (!this.#app) {
|
||||
const transport = await this.#transportDef.create();
|
||||
|
||||
this.#app = newSubstrateApp(transport, this.#ledgerName);
|
||||
}
|
||||
|
||||
return await fn(this.#app);
|
||||
} catch (error) {
|
||||
this.#app = null;
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
// This is necessary to ensure users still have access to class Ledger even though its deprecated.
|
||||
//
|
||||
// eslint-disable-next-line deprecation/deprecation
|
||||
export { Ledger } from './Ledger.js';
|
||||
export { LedgerGeneric } from './LedgerGeneric.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
import { supportedApps } from '@zondax/ledger-substrate';
|
||||
|
||||
import { ledgerApps } from './defaults.js';
|
||||
import { prevLedgerRecord } from './defaults.js';
|
||||
|
||||
describe('ledgerApps', (): void => {
|
||||
for (const k of Object.keys(ledgerApps)) {
|
||||
for (const k of Object.keys(prevLedgerRecord)) {
|
||||
it(`${k} is available in @zondax/ledger-substrate`, (): void => {
|
||||
expect(
|
||||
supportedApps.find(({ name }) =>
|
||||
name === ledgerApps[k]
|
||||
name === prevLedgerRecord[k]
|
||||
)
|
||||
).toBeDefined();
|
||||
});
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
||||
// and maps to the known name in the @zondax/ledger-substrate/supported_apps package
|
||||
export const ledgerApps: Record<string, string> = {
|
||||
// These map to the known name in the @zondax/ledger-substrate/supported_apps package
|
||||
// but they do not reflect all ledger apps that are supported. Since ledger now has support for all
|
||||
// substrate chains via the PolkadotGenericApp, any new chains that need ledger support can be added to
|
||||
// `genericLedgerApps` below.
|
||||
export const prevLedgerRecord: Record<string, string> = {
|
||||
acala: 'Acala',
|
||||
ajuna: 'Ajuna',
|
||||
'aleph-node': 'AlephZero',
|
||||
@@ -15,6 +17,7 @@ export const ledgerApps: Record<string, string> = {
|
||||
darwinia: 'Darwinia',
|
||||
'dock-mainnet': 'Dock',
|
||||
edgeware: 'Edgeware',
|
||||
enjin: 'Enjin',
|
||||
equilibrium: 'Equilibrium',
|
||||
genshiro: 'Genshiro',
|
||||
hydradx: 'HydraDX',
|
||||
@@ -22,15 +25,18 @@ export const ledgerApps: Record<string, string> = {
|
||||
karura: 'Karura',
|
||||
khala: 'Khala',
|
||||
kusama: 'Kusama',
|
||||
matrixchain: 'Matrixchain',
|
||||
nodle: 'Nodle',
|
||||
origintrail: 'OriginTrail',
|
||||
parallel: 'Parallel',
|
||||
peaq: 'Peaq',
|
||||
pendulum: 'Pendulum',
|
||||
phala: 'Phala',
|
||||
picasso: 'Picasso',
|
||||
polkadex: 'Polkadex',
|
||||
polkadot: 'Polkadot',
|
||||
polymesh: 'Polymesh',
|
||||
quartz: 'Quartz',
|
||||
sora: 'Sora',
|
||||
stafi: 'Stafi',
|
||||
statemine: 'Statemine',
|
||||
@@ -38,5 +44,22 @@ export const ledgerApps: Record<string, string> = {
|
||||
ternoa: 'Ternoa',
|
||||
unique: 'Unique',
|
||||
vtb: 'VTB',
|
||||
xxnetwork: 'XXNetwork'
|
||||
xxnetwork: 'XXNetwork',
|
||||
zeitgeist: 'Zeitgeist'
|
||||
};
|
||||
|
||||
// Any chains moving forward that are supported by the PolkadotGenericApp from ledger will input their names below.
|
||||
export const genericLedgerApps = {
|
||||
bittensor: 'Bittensor',
|
||||
encointer: 'Encointer',
|
||||
frequency: 'Frequency',
|
||||
integritee: 'Integritee',
|
||||
polimec: 'Polimec',
|
||||
vara: 'Vara'
|
||||
};
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
||||
export const ledgerApps: Record<string, string> = {
|
||||
...prevLedgerRecord,
|
||||
...genericLedgerApps
|
||||
};
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { packageInfo as transportInfo } from '@polkadot/hw-ledger-transports/packageInfo';
|
||||
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
|
||||
|
||||
export default [transportInfo, utilInfo];
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger 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,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
export * from './bundle.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index.js';
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger 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 transportInfo } from '@polkadot/hw-ledger-transports/packageInfo';
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
|
||||
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, [transportInfo, utilInfo]);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '12.2.2' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '13.2.3' };
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/hw-ledger authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
/**
|
||||
* Legacy Type that works with the `Ledger` class.
|
||||
*/
|
||||
export interface AccountOptions {
|
||||
/** The index of the account */
|
||||
account: number;
|
||||
@@ -12,6 +15,11 @@ export interface AccountOptions {
|
||||
change: number;
|
||||
}
|
||||
|
||||
export interface AccountOptionsGeneric extends AccountOptions {
|
||||
/** Option for PolkadotGenericApp.signWithMetadata */
|
||||
metadata: Buffer;
|
||||
}
|
||||
|
||||
export interface LedgerAddress {
|
||||
/** The ss58 encoded address */
|
||||
address: string;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"description": "Keyring management",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -14,19 +14,19 @@
|
||||
"url": "https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/util": "12.2.2",
|
||||
"@polkadot/util-crypto": "12.2.2",
|
||||
"tslib": "^2.5.3"
|
||||
"@polkadot/util": "13.2.3",
|
||||
"@polkadot/util-crypto": "13.2.3",
|
||||
"tslib": "^2.8.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "12.2.2",
|
||||
"@polkadot/util-crypto": "12.2.2"
|
||||
"@polkadot/util": "13.2.3",
|
||||
"@polkadot/util-crypto": "13.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// all external
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// default substrate dev phrase
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
|
||||
import { packageInfo as cryptoInfo } from '@polkadot/util-crypto/packageInfo';
|
||||
|
||||
export default [utilInfo, cryptoInfo];
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/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,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import './detectPackage.js';
|
||||
import './packageDetect.js';
|
||||
|
||||
import { Keyring } from './bundle.js';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index.js';
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright 2017-2024 @polkadot/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 { detectPackage } from '@polkadot/util';
|
||||
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
|
||||
import { packageInfo as cryptoInfo } from '@polkadot/util-crypto/packageInfo';
|
||||
|
||||
import { packageInfo } from './packageInfo.js';
|
||||
|
||||
detectPackage(packageInfo, null, [cryptoInfo, utilInfo]);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '12.2.2' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '13.2.3' };
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,47 +1,52 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types';
|
||||
import type { PairInfo } from './types.js';
|
||||
|
||||
import { u8aEq } from '@polkadot/util';
|
||||
import { jsonDecryptData } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';
|
||||
import { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';
|
||||
|
||||
const SEED_OFFSET = PKCS8_HEADER.length;
|
||||
const SEED_OFFSET = PAIR_HDR.length;
|
||||
|
||||
type DecodeResult = PairInfo & {
|
||||
secretKey: Uint8Array;
|
||||
};
|
||||
|
||||
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, _encType?: EncryptedJsonEncoding | EncryptedJsonEncoding[]): DecodeResult {
|
||||
/**
|
||||
* Decode a pair, taking into account the generation-specific formats and headers
|
||||
*
|
||||
* For divisor/headers, don't rely on the magic being static. These will
|
||||
* change between generations, aka with the long-awaited 4th generation
|
||||
* of the format. The external decode interface is the only way to use and decode these.
|
||||
**/
|
||||
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, _encType?: EncryptedJsonEncoding | EncryptedJsonEncoding[]): { publicKey: Uint8Array; secretKey: Uint8Array } {
|
||||
const encType = Array.isArray(_encType) || _encType === undefined
|
||||
? _encType
|
||||
: [_encType];
|
||||
const decrypted = jsonDecryptData(encrypted, passphrase, encType);
|
||||
const header = decrypted.subarray(0, PKCS8_HEADER.length);
|
||||
const header = decrypted.subarray(0, PAIR_HDR.length);
|
||||
|
||||
if (!u8aEq(header, PKCS8_HEADER)) {
|
||||
throw new Error('Invalid Pkcs8 header found in body');
|
||||
// check the start header (generations 1-3)
|
||||
if (!u8aEq(header, PAIR_HDR)) {
|
||||
throw new Error('Invalid encoding header found in body');
|
||||
}
|
||||
|
||||
// setup for generation 3 format
|
||||
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
|
||||
let divOffset = SEED_OFFSET + SEC_LENGTH;
|
||||
let divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
|
||||
let divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);
|
||||
|
||||
// old-style, we have the seed here
|
||||
if (!u8aEq(divider, PKCS8_DIVIDER)) {
|
||||
// old-style (generation 1 & 2), we have the seed here
|
||||
if (!u8aEq(divider, PAIR_DIV)) {
|
||||
divOffset = SEED_OFFSET + SEED_LENGTH;
|
||||
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
|
||||
divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
|
||||
divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);
|
||||
|
||||
if (!u8aEq(divider, PKCS8_DIVIDER)) {
|
||||
throw new Error('Invalid Pkcs8 divider found in body');
|
||||
// check the divisior at this point (already checked for generation 3)
|
||||
if (!u8aEq(divider, PAIR_DIV)) {
|
||||
throw new Error('Invalid encoding divider found in body');
|
||||
}
|
||||
}
|
||||
|
||||
const pubOffset = divOffset + PKCS8_DIVIDER.length;
|
||||
const pubOffset = divOffset + PAIR_DIV.length;
|
||||
const publicKey = decrypted.subarray(pubOffset, pubOffset + PUB_LENGTH);
|
||||
|
||||
return {
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export const PKCS8_DIVIDER = new Uint8Array([161, 35, 3, 33, 0]);
|
||||
export const PKCS8_HEADER = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);
|
||||
/** public/secret section divider (generation 1-3, will change in 4, don't rely on value) */
|
||||
export const PAIR_DIV = new Uint8Array([161, 35, 3, 33, 0]);
|
||||
|
||||
/** public/secret start block (generation 1-3, will change in 4, don't rely on value) */
|
||||
export const PAIR_HDR = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);
|
||||
|
||||
/** length of a public key */
|
||||
export const PUB_LENGTH = 32;
|
||||
|
||||
/** length of a salt */
|
||||
export const SALT_LENGTH = 32;
|
||||
|
||||
/** length of a secret key */
|
||||
export const SEC_LENGTH = 64;
|
||||
|
||||
/** length of a user-input seed */
|
||||
export const SEED_LENGTH = 32;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
@@ -6,10 +6,10 @@
|
||||
import { NONCE_LENGTH, SCRYPT_LENGTH } from '@polkadot/util-crypto/json/constants';
|
||||
|
||||
import { createTestPairs } from '../testingPairs.js';
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH } from './defaults.js';
|
||||
import { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SEC_LENGTH } from './defaults.js';
|
||||
|
||||
const PKCS8_LENGTH = PKCS8_DIVIDER.length + PKCS8_HEADER.length + PUB_LENGTH + SEC_LENGTH;
|
||||
const ENCODED_LENGTH = 16 + PKCS8_LENGTH + NONCE_LENGTH + SCRYPT_LENGTH;
|
||||
const DECODED_LENGTH = PAIR_DIV.length + PAIR_HDR.length + PUB_LENGTH + SEC_LENGTH;
|
||||
const ENCODED_LENGTH = 16 + DECODED_LENGTH + NONCE_LENGTH + SCRYPT_LENGTH;
|
||||
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
@@ -17,7 +17,7 @@ describe('encode', (): void => {
|
||||
it('returns PKCS8 when no passphrase supplied', (): void => {
|
||||
expect(
|
||||
keyring.alice.encodePkcs8()
|
||||
).toHaveLength(PKCS8_LENGTH);
|
||||
).toHaveLength(DECODED_LENGTH);
|
||||
});
|
||||
|
||||
it('returns encoded PKCS8 when passphrase supplied', (): void => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { PairInfo } from './types.js';
|
||||
@@ -6,24 +6,23 @@ import type { PairInfo } from './types.js';
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults.js';
|
||||
import { PAIR_DIV, PAIR_HDR } from './defaults.js';
|
||||
|
||||
/**
|
||||
* Encode a pair with the latest generation format (generation 3)
|
||||
**/
|
||||
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
|
||||
if (!secretKey) {
|
||||
throw new Error('Expected a valid secretKey to be passed to encode');
|
||||
}
|
||||
|
||||
const encoded = u8aConcat(
|
||||
PKCS8_HEADER,
|
||||
secretKey,
|
||||
PKCS8_DIVIDER,
|
||||
publicKey
|
||||
);
|
||||
const encoded = u8aConcat(PAIR_HDR, secretKey, PAIR_DIV, publicKey);
|
||||
|
||||
if (!passphrase) {
|
||||
return encoded;
|
||||
}
|
||||
|
||||
// this is only for generation 3 (previous generations are only handled in decoding)
|
||||
const { params, password, salt } = scryptEncode(passphrase);
|
||||
const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types.js';
|
||||
import type { PairInfo } from './types.js';
|
||||
@@ -165,7 +164,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
setMeta: (additional: KeyringPair$Meta): void => {
|
||||
meta = objectSpread({}, meta, additional);
|
||||
},
|
||||
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
sign: (message: string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
@@ -192,10 +191,10 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
unlock: (passphrase?: string): void => {
|
||||
return decodePkcs8(passphrase);
|
||||
},
|
||||
verify: (message: HexString | string | Uint8Array, signature: HexString | string | Uint8Array, signerPublic: HexString | string | Uint8Array): boolean => {
|
||||
verify: (message: string | Uint8Array, signature: string | Uint8Array, signerPublic: string | Uint8Array): boolean => {
|
||||
return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;
|
||||
},
|
||||
vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
|
||||
vrfSign: (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
@@ -208,7 +207,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
|
||||
return u8aConcat(vrfHash(proof, context, extra), proof);
|
||||
},
|
||||
vrfVerify: (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean => {
|
||||
vrfVerify: (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: Uint8Array | string, context?: string | Uint8Array, extra?: string | Uint8Array): boolean => {
|
||||
if (type === 'sr25519') {
|
||||
return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/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/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export interface PairInfo {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { KeyringPair, KeyringPairs } from './types.js';
|
||||
|
||||
import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
@@ -22,7 +21,7 @@ export class Pairs implements KeyringPairs {
|
||||
return Object.values(this.#map);
|
||||
}
|
||||
|
||||
public get (address: HexString | string | Uint8Array): KeyringPair {
|
||||
public get (address: string | Uint8Array): KeyringPair {
|
||||
const pair = this.#map[decodeAddress(address).toString()];
|
||||
|
||||
if (!pair) {
|
||||
@@ -36,7 +35,7 @@ export class Pairs implements KeyringPairs {
|
||||
return pair;
|
||||
}
|
||||
|
||||
public remove (address: HexString | string | Uint8Array): void {
|
||||
public remove (address: string | Uint8Array): void {
|
||||
delete this.#map[decodeAddress(address).toString()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
@@ -119,7 +119,7 @@ function createMeta (name?: string, seed?: string) {
|
||||
|
||||
return {
|
||||
isTesting: true,
|
||||
name: name || (seed && seed.replace('//', '_').toLowerCase())
|
||||
name: name || seed?.replace('//', '_').toLowerCase()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
@@ -42,9 +42,7 @@ describe('testingPairs', (): void => {
|
||||
const keyring = new Keyring({ type: 'ethereum' });
|
||||
const pair = keyring.createFromUri('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133');
|
||||
|
||||
expect(
|
||||
pair && pair.address
|
||||
).toEqual(TEST_ADD);
|
||||
expect(pair?.address).toEqual(TEST_ADD);
|
||||
});
|
||||
|
||||
describe('checks eth test addresses', (): void => {
|
||||
@@ -62,6 +60,7 @@ describe('testingPairs', (): void => {
|
||||
'0x4c42532034540267bf568198ccec4cb822a025da542861fcb146a5fab6433ff8',
|
||||
'0x94c49300a58d576011096bcb006aa06f5a91b34b4383891e8029c21dc39fbb8b'];
|
||||
|
||||
// @ts-expect-error We should not delete from the maps, however this is a test
|
||||
delete ring.nobody;
|
||||
|
||||
Object
|
||||
|
||||
@@ -1,23 +1,56 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringOptions, KeyringPair } from './types.js';
|
||||
|
||||
import { nobody } from './pair/nobody.js';
|
||||
import { createTestKeyring } from './testing.js';
|
||||
|
||||
export interface TestKeyringMap {
|
||||
nobody: KeyringPair;
|
||||
|
||||
[index: string]: KeyringPair;
|
||||
}
|
||||
|
||||
export function createTestPairs (options?: KeyringOptions, isDerived = true): TestKeyringMap {
|
||||
export interface TestKeyringMapSubstrate extends TestKeyringMap {
|
||||
alice: KeyringPair;
|
||||
bob: KeyringPair;
|
||||
charlie: KeyringPair;
|
||||
dave: KeyringPair;
|
||||
eve: KeyringPair;
|
||||
ferdie: KeyringPair;
|
||||
}
|
||||
|
||||
export interface TestKeyringMapEthereum extends TestKeyringMap {
|
||||
Alith: KeyringPair;
|
||||
Baltathar: KeyringPair;
|
||||
Charleth: KeyringPair;
|
||||
Dorothy: KeyringPair;
|
||||
Ethan: KeyringPair;
|
||||
Faith: KeyringPair;
|
||||
}
|
||||
|
||||
export type DetectMap<O extends KeyringOptions | undefined> = DetectPairType<O> extends 'ethereum'
|
||||
? TestKeyringMapEthereum
|
||||
: TestKeyringMapSubstrate;
|
||||
|
||||
export type DetectPairType<O extends KeyringOptions | undefined> = O extends KeyringOptions
|
||||
? O['type'] extends KeypairType
|
||||
? O['type']
|
||||
: 'sr25519'
|
||||
: 'sr25519';
|
||||
|
||||
export function createTestPairs <O extends KeyringOptions, M = DetectMap<O>> (options?: O, isDerived = true): M {
|
||||
const keyring = createTestKeyring(options, isDerived);
|
||||
const pairs = keyring.getPairs();
|
||||
const map: TestKeyringMap = { nobody: nobody() };
|
||||
|
||||
for (const p of pairs) {
|
||||
map[p.meta.name as string] = p;
|
||||
if (p.meta.name) {
|
||||
map[p.meta.name] = p;
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
return map as M;
|
||||
}
|
||||
|
||||
@@ -1,33 +1,78 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { EncryptedJson, Keypair, KeypairType, Prefix } from '@polkadot/util-crypto/types';
|
||||
|
||||
export interface KeyringOptions {
|
||||
/**
|
||||
* @description The ss58Format to use for address encoding (defaults to 42)
|
||||
*/
|
||||
/** The ss58Format to use for address encoding (defaults to 42) */
|
||||
ss58Format?: Prefix;
|
||||
/**
|
||||
* @description The type of keyring to create (defaults to ed25519)
|
||||
*/
|
||||
/** The type of keyring to create (defaults to ed25519) */
|
||||
type?: KeypairType;
|
||||
}
|
||||
|
||||
export type KeyringPair$Meta = Record<string, unknown>;
|
||||
export interface KeyringPair$MetaHardware {
|
||||
accountIndex?: number;
|
||||
accountOffset?: number;
|
||||
addressOffset?: number;
|
||||
hardwareType?: 'ledger';
|
||||
}
|
||||
|
||||
export interface KeyringPair$MetaFlags {
|
||||
isDefaultAuthSelected?: boolean;
|
||||
isExternal?: boolean;
|
||||
isHardware?: boolean;
|
||||
isHidden?: boolean;
|
||||
isInjected?: boolean;
|
||||
isMultisig?: boolean;
|
||||
isProxied?: boolean;
|
||||
isRecent?: boolean;
|
||||
isTesting?: boolean;
|
||||
}
|
||||
|
||||
export interface KeyringPair$MetaContract {
|
||||
abi: string;
|
||||
genesisHash?: HexString | null;
|
||||
}
|
||||
|
||||
export interface KeyringPair$MetaExtension {
|
||||
source?: string;
|
||||
}
|
||||
|
||||
export interface KeyringPair$MetaMultisig {
|
||||
threshold?: number;
|
||||
who?: string[];
|
||||
}
|
||||
|
||||
export interface KeyringPair$MetaParent {
|
||||
parentAddress?: string;
|
||||
parentName?: string;
|
||||
}
|
||||
|
||||
export interface KeyringPair$Meta extends KeyringPair$MetaExtension, KeyringPair$MetaFlags, KeyringPair$MetaHardware, KeyringPair$MetaMultisig, KeyringPair$MetaParent {
|
||||
address?: string;
|
||||
contract?: KeyringPair$MetaContract;
|
||||
genesisHash?: HexString | null;
|
||||
name?: string;
|
||||
suri?: string;
|
||||
tags?: string[];
|
||||
type?: KeypairType;
|
||||
whenCreated?: number;
|
||||
whenEdited?: number;
|
||||
whenUsed?: number;
|
||||
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
export interface KeyringPair$Json extends EncryptedJson {
|
||||
/** The ss58 encoded address or the hex-encoded version (the latter is for ETH-compat chains) */
|
||||
address: string | HexString;
|
||||
address: string;
|
||||
/** The underlying metadata associated with the keypair */
|
||||
meta: KeyringPair$Meta;
|
||||
}
|
||||
|
||||
export interface SignOptions {
|
||||
/**
|
||||
* @description Create a MultiSignature-compatible output with an indicator type
|
||||
**/
|
||||
/** Create a MultiSignature-compatible output with an indicator type */
|
||||
withType?: boolean;
|
||||
}
|
||||
|
||||
@@ -44,12 +89,12 @@ export interface KeyringPair {
|
||||
encodePkcs8 (passphrase?: string): Uint8Array;
|
||||
lock (): void;
|
||||
setMeta (meta: KeyringPair$Meta): void;
|
||||
sign (message: HexString | string | Uint8Array, options?: SignOptions): Uint8Array;
|
||||
sign (message: string | Uint8Array, options?: SignOptions): Uint8Array;
|
||||
toJson (passphrase?: string): KeyringPair$Json;
|
||||
unlock (passphrase?: string): void;
|
||||
verify (message: HexString | string | Uint8Array, signature: Uint8Array, signerPublic: HexString | string | Uint8Array): boolean;
|
||||
vrfSign (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): Uint8Array;
|
||||
vrfVerify (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean;
|
||||
verify (message: string | Uint8Array, signature: Uint8Array, signerPublic: string | Uint8Array): boolean;
|
||||
vrfSign (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array;
|
||||
vrfVerify (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean;
|
||||
}
|
||||
|
||||
export interface KeyringPairs {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"description": "A list of all available Substrate networks and their applicable prefixes",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -15,14 +15,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@polkadot/util": "12.2.2",
|
||||
"@substrate/ss58-registry": "^1.40.0",
|
||||
"tslib": "^2.5.3"
|
||||
"@polkadot/util": "13.2.3",
|
||||
"@substrate/ss58-registry": "^1.51.0",
|
||||
"tslib": "^2.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/hw-ledger": "12.2.2"
|
||||
"@polkadot/hw-ledger": "13.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
@@ -6,22 +6,33 @@
|
||||
import { ledgerApps } from '@polkadot/hw-ledger/defaults';
|
||||
import { isHex } from '@polkadot/util';
|
||||
|
||||
import { knownGenesis, knownLedger } from './defaults/index.js';
|
||||
import { knownGenesis, knownLedger, knownTestnet } from './defaults/index.js';
|
||||
|
||||
describe('defaults', (): void => {
|
||||
const genesisKeys = Object.keys(knownGenesis);
|
||||
const ledgerKeys = Object.keys(knownLedger);
|
||||
|
||||
describe('genesis', (): void => {
|
||||
it('has hex values for all genesis chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownGenesis).filter((network) =>
|
||||
genesisKeys.filter((network) =>
|
||||
!knownGenesis[network].length ||
|
||||
knownGenesis[network].some((g) => !isHex(g, 256))
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('has no entries for testnets', (): void => {
|
||||
expect(
|
||||
genesisKeys.filter((network) =>
|
||||
knownTestnet[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('has genesis for all Ledger chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
ledgerKeys.filter((network) =>
|
||||
!knownGenesis[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
@@ -31,7 +42,7 @@ describe('defaults', (): void => {
|
||||
describe('Ledger', (): void => {
|
||||
it('has entries for each of the apps (hwledger -> networks)', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
ledgerKeys.filter((network) =>
|
||||
!ledgerApps[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownGenesis } from '../types.js';
|
||||
|
||||
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
|
||||
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
|
||||
// last. This make lookups for the current a simple genesisHash[0]
|
||||
// (See Kusama as an example)
|
||||
// In the case where the network was hard-spooned and multiple genesisHashes
|
||||
// are provided, it needs to be in reverse order, i.e. most-recent goes first,
|
||||
// oldest goes last. This make lookups for the current a simple genesisHash[0]
|
||||
// where the latest ios always the first entry (See Kusama as an example)
|
||||
//
|
||||
// IMPORTANT: Apart from the test relays, this list is limited to live parachains
|
||||
// and live production networks. It does not and should not contain any testnets,
|
||||
// either stand-alone or connected to test relays such as Westend/Rococo
|
||||
export const knownGenesis: KnownGenesis = {
|
||||
acala: [
|
||||
'0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
|
||||
@@ -52,19 +56,32 @@ export const knownGenesis: KnownGenesis = {
|
||||
edgeware: [
|
||||
'0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
|
||||
],
|
||||
encointer: [
|
||||
'0x7dd99936c1e9e6d1ce7d90eb6f33bea8393b4bf87677d675aa63c9cb3e8c5b5b'
|
||||
],
|
||||
enjin: [
|
||||
'0xd8761d3c88f26dc12875c00d3165f7d67243d56fc85b4cf19937601a7916e5a9'
|
||||
],
|
||||
equilibrium: [
|
||||
'0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
|
||||
],
|
||||
frequency: [
|
||||
'0x4a587bf17a404e3572747add7aab7bbe56e805a5479c6c436f07f36fcc8d3ae1'
|
||||
],
|
||||
genshiro: [
|
||||
'0x9b8cefc0eb5c568b527998bdd76c184e2b76ae561be76e4667072230217ea243'
|
||||
],
|
||||
hydradx: [
|
||||
'0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', // HydraDX Parachain
|
||||
'0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', // Hydration | HydraDX Parachain
|
||||
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
|
||||
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
|
||||
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
|
||||
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
|
||||
],
|
||||
integritee: [
|
||||
'0xcdedc8eadbfa209d3f207bba541e57c3c58a667b05a2e1d1e86353c9000758da', // on Kusama
|
||||
'0xe13e7af377c64e83f95e0d70d5e5c3c01d697a84538776c5b9bbe0e7d7b6034c' // on Polkadot
|
||||
],
|
||||
'interlay-parachain': [
|
||||
'0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
|
||||
],
|
||||
@@ -82,6 +99,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
|
||||
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
|
||||
],
|
||||
matrixchain: [
|
||||
'0x3af4ff48ec76d2efc8476730f423ac07e25ad48f5f4c9dc39c778b164d808615'
|
||||
],
|
||||
nodle: [
|
||||
'0x97da7ede98d7bad4e36b4d734b6055425a3be036da2a332ea5a7037656427a21'
|
||||
],
|
||||
@@ -94,6 +114,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
parallel: [
|
||||
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
|
||||
],
|
||||
peaq: [
|
||||
'0xd2a5d385932d1f650dae03ef8e2748983779ee342c614f80854d32b8cd8fa48c'
|
||||
],
|
||||
pendulum: [
|
||||
'0x5d3c298622d5634ed019bf61ea4b71655030015bde9beb0d6a24743714462c86'
|
||||
],
|
||||
@@ -104,6 +127,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0x6811a339673c9daa897944dcdac99c6e2939cc88245ed21951a0a3c9a2be75bc',
|
||||
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
||||
],
|
||||
polimec: [
|
||||
'0x7eb9354488318e7549c722669dcbdcdc526f1fef1420e7944667212f3601fdbd'
|
||||
],
|
||||
polkadex: [
|
||||
'0x3920bcb4960a1eef5580cd5367ff3f430eef052774f78468852f7b9cb39f8a3c'
|
||||
],
|
||||
@@ -113,6 +139,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
polymesh: [
|
||||
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
|
||||
],
|
||||
quartz: [
|
||||
'0xcd4d732201ebe5d6b014edda071c4203e16867305332301dc8d092044b28e554'
|
||||
],
|
||||
rococo: [
|
||||
'0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e',
|
||||
'0xaaf2cd1b74b5f726895921259421b534124726263982522174147046b8827897',
|
||||
@@ -148,6 +177,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
unique: [
|
||||
'0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
|
||||
],
|
||||
vara: [
|
||||
'0xfe1b4c55fd4d668101126434206571a7838a8b6b93a6d1b95d607e78e6c53763'
|
||||
],
|
||||
vtb: [
|
||||
'0x286bc8414c7000ce1d6ee6a834e29a54c1784814b76243eb77ed0b2c5573c60f',
|
||||
'0x7483b89572fb2bd687c7b9a93b242d0b237f9aba463aba07ec24503931038aaa'
|
||||
@@ -157,5 +189,8 @@ export const knownGenesis: KnownGenesis = {
|
||||
],
|
||||
xxnetwork: [
|
||||
'0x50dd5d206917bf10502c68fb4d18a59fc8aa31586f4e8856b493e43544aa82aa'
|
||||
],
|
||||
zeitgeist: [
|
||||
'0x1bf2a2ecb4a868de66ea8610f2ce7c8c43706561b6476031315f6640fe38e060'
|
||||
]
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownIcon } from '../types.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { knownGenesis } from './genesis.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownLedger } from '../types.js';
|
||||
@@ -14,33 +14,44 @@ export const knownLedger: KnownLedger = {
|
||||
astar: 0x0000032a,
|
||||
bifrost: 0x00000314,
|
||||
'bifrost-kusama': 0x00000314,
|
||||
bittensor: 0x00000162,
|
||||
centrifuge: 0x000002eb,
|
||||
composable: 0x00000162,
|
||||
darwinia: 0x00000162,
|
||||
'dock-mainnet': 0x00000252,
|
||||
edgeware: 0x0000020b,
|
||||
encointer: 0x000001b2,
|
||||
enjin: 0x00000483,
|
||||
equilibrium: 0x05f5e0fd,
|
||||
frequency: 0x0000082b,
|
||||
genshiro: 0x05f5e0fc,
|
||||
hydradx: 0x00000162,
|
||||
integritee: 0x000007df,
|
||||
'interlay-parachain': 0x00000162,
|
||||
karura: 0x000002ae,
|
||||
khala: 0x000001b2,
|
||||
kusama: 0x000001b2,
|
||||
matrixchain: 0x00000483,
|
||||
nodle: 0x000003eb,
|
||||
origintrail: 0x00000162,
|
||||
parallel: 0x00000162,
|
||||
peaq: 0x00000d0a,
|
||||
pendulum: 0x00000162,
|
||||
phala: 0x00000162,
|
||||
picasso: 0x000001b2,
|
||||
polimec: 0x00000d10,
|
||||
polkadex: 0x0000031f,
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253,
|
||||
quartz: 0x00000277,
|
||||
sora: 0x00000269,
|
||||
stafi: 0x0000038b,
|
||||
statemine: 0x000001b2, // common-good on Kusama, shares derivation
|
||||
statemint: 0x00000162, // common-good on Polkadot, shares derivation
|
||||
ternoa: 0x00003e3,
|
||||
unique: 0x00000162,
|
||||
unique: 0x00000295,
|
||||
vara: 0x00001370,
|
||||
vtb: 0x000002b6,
|
||||
xxnetwork: 0x000007a3
|
||||
xxnetwork: 0x000007a3,
|
||||
zeitgeist: 0x00000162
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownTestnet } from '../types.js';
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export default [];
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
@@ -115,6 +115,6 @@ describe('selectableNetworks', (): void => {
|
||||
|
||||
it('has a sorted list (first external, last external)', (): void => {
|
||||
expect(selectableNetworks[3].displayName).toEqual('3DP network');
|
||||
expect(selectableNetworks[selectableNetworks.length - 1].displayName).toEqual('xx network');
|
||||
expect(selectableNetworks[selectableNetworks.length - 1].displayName).toEqual('Zeitgeist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// TODO: This was removed, really cannot recall the reason...
|
||||
// ... put it back, but keep it removed
|
||||
// import './detectPackage';
|
||||
// import './packageDetect.js';
|
||||
|
||||
export * from './interfaces.js';
|
||||
export { packageInfo } from './packageInfo.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownSubstrate, Network, SubstrateNetwork } from './types.js';
|
||||
@@ -29,8 +29,8 @@ function toExpanded (o: KnownSubstrate): SubstrateNetwork {
|
||||
n.isIgnored = n.isTestnet || (
|
||||
!(
|
||||
o.standardAccount &&
|
||||
o.decimals && o.decimals.length &&
|
||||
o.symbols && o.symbols.length
|
||||
o.decimals?.length &&
|
||||
o.symbols?.length
|
||||
) &&
|
||||
o.prefix !== 42
|
||||
);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index.js';
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks 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/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '12.2.2' };
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '13.2.3' };
|
||||
|
||||
@@ -1,28 +1,34 @@
|
||||
// Copyright 2017-2023 @polkadot/networks authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
import known from '@substrate/ss58-registry';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
const other = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'packages/networks/test/ss58registry.json'), 'utf-8')) as unknown;
|
||||
import { stringify } from '@polkadot/util';
|
||||
|
||||
describe('@substrate/ss58-registry', (): void => {
|
||||
it('has known values', (): void => {
|
||||
const json = JSON.stringify(known, null, 2);
|
||||
const testUrl = new URL('../test/ss58registry.json', import.meta.url);
|
||||
const json = stringify(known, 2);
|
||||
|
||||
try {
|
||||
expect(JSON.parse(json)).toEqual(other);
|
||||
expect(
|
||||
JSON.parse(json)
|
||||
).toEqual(
|
||||
JSON.parse(
|
||||
fs.readFileSync(testUrl, 'utf-8')
|
||||
)
|
||||
);
|
||||
} catch (error) {
|
||||
if (process.env.GITHUB_REPOSITORY) {
|
||||
if (process.env['GITHUB_REPOSITORY']) {
|
||||
console.error(json);
|
||||
|
||||
throw error;
|
||||
}
|
||||
|
||||
fs.writeFileSync(path.join(process.cwd(), 'packages/networks/test/ss58registry.json'), json, { flag: 'w' });
|
||||
fs.writeFileSync(testUrl, json, { flag: 'w' });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
// Copyright 2017-2023 @polkadot/keyring authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { RegistryEntry } from '@substrate/ss58-registry';
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
export type Icon = 'beachball' | 'empty' | 'jdenticon' | 'polkadot' | 'substrate';
|
||||
|
||||
@@ -9,22 +10,29 @@ export type KnownIcon = Record<string, Icon>;
|
||||
|
||||
export type KnownLedger = Record<string, number>;
|
||||
|
||||
export type KnownGenesis = Record<string, string[]>;
|
||||
export type KnownGenesis = Record<string, HexString[]>;
|
||||
|
||||
export type KnownSubstrate = RegistryEntry;
|
||||
|
||||
export type KnownTestnet = Record<string, true>;
|
||||
|
||||
export interface SubstrateNetwork extends KnownSubstrate {
|
||||
genesisHash: string[];
|
||||
/** The genesisHash for the chain */
|
||||
genesisHash: HexString[];
|
||||
/** Does the chain has support for Ledger devices */
|
||||
hasLedgerSupport: boolean;
|
||||
/** The IdentityIcon to use for the chain */
|
||||
icon: Icon;
|
||||
/** Flag set when we don't include this chain */
|
||||
isIgnored: boolean;
|
||||
/** Flag to indicate a testnet */
|
||||
isTestnet: boolean;
|
||||
/** The Ledger-specific/required slip44 for the chain */
|
||||
slip44?: number | null;
|
||||
}
|
||||
|
||||
export interface Network extends SubstrateNetwork {
|
||||
/** The network assigned to this chain */
|
||||
network: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -222,15 +222,13 @@
|
||||
"network": "darwinia",
|
||||
"displayName": "Darwinia Network",
|
||||
"symbols": [
|
||||
"RING",
|
||||
"KTON"
|
||||
"RING"
|
||||
],
|
||||
"decimals": [
|
||||
9,
|
||||
9
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://darwinia.network/"
|
||||
"standardAccount": "secp256k1",
|
||||
"website": "https://darwinia.network"
|
||||
},
|
||||
{
|
||||
"prefix": 19,
|
||||
@@ -258,6 +256,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://stafi.io"
|
||||
},
|
||||
{
|
||||
"prefix": 21,
|
||||
"network": "karmachain",
|
||||
"displayName": "Karmacoin",
|
||||
"symbols": [
|
||||
"KCOIN"
|
||||
],
|
||||
"decimals": [
|
||||
6
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://karmaco.in"
|
||||
},
|
||||
{
|
||||
"prefix": 22,
|
||||
"network": "dock-pos-mainnet",
|
||||
@@ -497,12 +508,16 @@
|
||||
},
|
||||
{
|
||||
"prefix": 41,
|
||||
"network": "poli",
|
||||
"displayName": "Polimec Chain",
|
||||
"symbols": [],
|
||||
"decimals": [],
|
||||
"network": "polimec",
|
||||
"displayName": "Polimec Protocol",
|
||||
"symbols": [
|
||||
"PLMC"
|
||||
],
|
||||
"decimals": [
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://polimec.io/"
|
||||
"website": "https://www.polimec.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 42,
|
||||
@@ -700,10 +715,23 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://pendulumchain.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 58,
|
||||
"network": "eternal-civilization",
|
||||
"displayName": "Eternal Civilization",
|
||||
"symbols": [
|
||||
"ECC"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "http://www.ysknfr.cn/"
|
||||
},
|
||||
{
|
||||
"prefix": 63,
|
||||
"network": "hydradx",
|
||||
"displayName": "HydraDX",
|
||||
"displayName": "Hydration",
|
||||
"symbols": [
|
||||
"HDX"
|
||||
],
|
||||
@@ -711,7 +739,7 @@
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://hydradx.io"
|
||||
"website": "https://hydration.net"
|
||||
},
|
||||
{
|
||||
"prefix": 65,
|
||||
@@ -1101,7 +1129,7 @@
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://vara-network.io/"
|
||||
"website": "https://vara.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 172,
|
||||
@@ -1168,6 +1196,45 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://sora.org"
|
||||
},
|
||||
{
|
||||
"prefix": 440,
|
||||
"network": "allfeat_network",
|
||||
"displayName": "Allfeat Network",
|
||||
"symbols": [
|
||||
"AFT"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://allfeat.network"
|
||||
},
|
||||
{
|
||||
"prefix": 666,
|
||||
"network": "metaquity_network",
|
||||
"displayName": "Metaquity Network",
|
||||
"symbols": [
|
||||
"MQTY"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://metaquity.xyz/"
|
||||
},
|
||||
{
|
||||
"prefix": 777,
|
||||
"network": "curio",
|
||||
"displayName": "Curio",
|
||||
"symbols": [
|
||||
"CGT"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://parachain.capitaldex.exchange/"
|
||||
},
|
||||
{
|
||||
"prefix": 789,
|
||||
"network": "geek",
|
||||
@@ -1350,6 +1417,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://logion.network"
|
||||
},
|
||||
{
|
||||
"prefix": 2024,
|
||||
"network": "vow-chain",
|
||||
"displayName": "Enigmatic Smile",
|
||||
"symbols": [
|
||||
"VOW"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.vow.foundation/"
|
||||
},
|
||||
{
|
||||
"prefix": 2032,
|
||||
"network": "interlay",
|
||||
@@ -1402,6 +1482,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://chainflip.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 2199,
|
||||
"network": "moonsama",
|
||||
"displayName": "Moonsama",
|
||||
"symbols": [
|
||||
"SAMA"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "secp256k1",
|
||||
"website": "https://moonsama.com"
|
||||
},
|
||||
{
|
||||
"prefix": 2206,
|
||||
"network": "ICE",
|
||||
@@ -1442,17 +1535,17 @@
|
||||
"website": "https://subspace.network"
|
||||
},
|
||||
{
|
||||
"prefix": 4006,
|
||||
"network": "tangle",
|
||||
"displayName": "Tangle Network",
|
||||
"prefix": 3333,
|
||||
"network": "peerplays",
|
||||
"displayName": "Peerplays",
|
||||
"symbols": [
|
||||
"TNT"
|
||||
"PPY"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.webb.tools/"
|
||||
"standardAccount": "secp256k1",
|
||||
"website": "https://www.peerplays.com/"
|
||||
},
|
||||
{
|
||||
"prefix": 4450,
|
||||
@@ -1481,17 +1574,30 @@
|
||||
"website": "https://humanode.io"
|
||||
},
|
||||
{
|
||||
"prefix": 6094,
|
||||
"network": "subspace",
|
||||
"displayName": "Subspace",
|
||||
"prefix": 5845,
|
||||
"network": "tangle",
|
||||
"displayName": "Tangle Network",
|
||||
"symbols": [
|
||||
"SSC"
|
||||
"TNT"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://subspace.network"
|
||||
"website": "https://www.tangle.tools/"
|
||||
},
|
||||
{
|
||||
"prefix": 6094,
|
||||
"network": "autonomys",
|
||||
"displayName": "Autonomys",
|
||||
"symbols": [
|
||||
"AI3"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://autonomys.xyz"
|
||||
},
|
||||
{
|
||||
"prefix": 7007,
|
||||
@@ -1523,6 +1629,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://gmordie.com"
|
||||
},
|
||||
{
|
||||
"prefix": 7306,
|
||||
"network": "krigan",
|
||||
"displayName": "Krigan Network",
|
||||
"symbols": [
|
||||
"KRGN"
|
||||
],
|
||||
"decimals": [
|
||||
9
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://krigan.network"
|
||||
},
|
||||
{
|
||||
"prefix": 7391,
|
||||
"network": "unique_mainnet",
|
||||
@@ -1536,6 +1655,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
},
|
||||
{
|
||||
"prefix": 8866,
|
||||
"network": "golden_gate",
|
||||
"displayName": "Golden Gate",
|
||||
"symbols": [
|
||||
"GGX"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://ggxchain.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 8883,
|
||||
"network": "sapphire_mainnet",
|
||||
@@ -1549,6 +1681,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
},
|
||||
{
|
||||
"prefix": 8886,
|
||||
"network": "golden_gate_sydney",
|
||||
"displayName": "Golden Gate Sydney",
|
||||
"symbols": [
|
||||
"GGXT"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://ggxchain.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 9072,
|
||||
"network": "hashed",
|
||||
@@ -1609,7 +1754,7 @@
|
||||
"TCESS"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://cess.cloud"
|
||||
@@ -1622,7 +1767,7 @@
|
||||
"CESS"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://cess.cloud"
|
||||
@@ -1679,6 +1824,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://nftmart.io"
|
||||
},
|
||||
{
|
||||
"prefix": 12850,
|
||||
"network": "analog-timechain",
|
||||
"displayName": "Analog Timechain",
|
||||
"symbols": [
|
||||
"ANLOG"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://analog.one"
|
||||
},
|
||||
{
|
||||
"prefix": 13116,
|
||||
"network": "bittensor",
|
||||
@@ -1691,5 +1849,57 @@
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://bittensor.com"
|
||||
},
|
||||
{
|
||||
"prefix": 14697,
|
||||
"network": "goro",
|
||||
"displayName": "GORO Network",
|
||||
"symbols": [
|
||||
"GORO"
|
||||
],
|
||||
"decimals": [
|
||||
9
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://goro.network"
|
||||
},
|
||||
{
|
||||
"prefix": 14998,
|
||||
"network": "mosaic-chain",
|
||||
"displayName": "Mosaic Chain",
|
||||
"symbols": [
|
||||
"MOS"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://mosaicchain.io"
|
||||
},
|
||||
{
|
||||
"prefix": 29972,
|
||||
"network": "mythos",
|
||||
"displayName": "Mythos",
|
||||
"symbols": [
|
||||
"MYTH"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "secp256k1",
|
||||
"website": "https://mythos.foundation"
|
||||
},
|
||||
{
|
||||
"prefix": 8888,
|
||||
"network": "xcavate",
|
||||
"displayName": "Xcavate Protocol",
|
||||
"symbols": [
|
||||
"XCAV"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://xcavate.io/"
|
||||
}
|
||||
]
|
||||
@@ -3,7 +3,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"description": "A collection of useful crypto utilities for @polkadot",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util-crypto#readme",
|
||||
"license": "Apache-2.0",
|
||||
@@ -16,29 +16,29 @@
|
||||
"sideEffects": [
|
||||
"./bundleInit.js",
|
||||
"./bundleInit.cjs",
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
"./packageDetect.js",
|
||||
"./packageDetect.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "12.2.2",
|
||||
"version": "13.2.3",
|
||||
"browser": {
|
||||
"crypto": false,
|
||||
"stream": false
|
||||
},
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@noble/curves": "1.1.0",
|
||||
"@noble/hashes": "1.3.1",
|
||||
"@polkadot/networks": "12.2.2",
|
||||
"@polkadot/util": "12.2.2",
|
||||
"@polkadot/wasm-crypto": "^7.2.1",
|
||||
"@polkadot/wasm-util": "^7.2.1",
|
||||
"@polkadot/x-bigint": "12.2.2",
|
||||
"@polkadot/x-randomvalues": "12.2.2",
|
||||
"@scure/base": "1.1.1",
|
||||
"tslib": "^2.5.3"
|
||||
"@noble/curves": "^1.3.0",
|
||||
"@noble/hashes": "^1.3.3",
|
||||
"@polkadot/networks": "13.2.3",
|
||||
"@polkadot/util": "13.2.3",
|
||||
"@polkadot/wasm-crypto": "^7.4.1",
|
||||
"@polkadot/wasm-util": "^7.4.1",
|
||||
"@polkadot/x-bigint": "13.2.3",
|
||||
"@polkadot/x-randomvalues": "13.2.3",
|
||||
"@scure/base": "^1.1.7",
|
||||
"tslib": "^2.8.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "12.2.2"
|
||||
"@polkadot/util": "13.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { decodeAddress } from './decode.js';
|
||||
|
||||
/**
|
||||
* @name addressToEvm
|
||||
* @summary Converts an SS58 address to its corresponding EVM address.
|
||||
*/
|
||||
export function addressToEvm (address: HexString | string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||
export function addressToEvm (address: string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||
return decodeAddress(address, ignoreChecksum).subarray(0, 20);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types.js';
|
||||
|
||||
import { base58Decode } from '../base58/index.js';
|
||||
@@ -14,7 +13,7 @@ import { defaults } from './defaults.js';
|
||||
* @description
|
||||
* From the provided input, validate that the address is a valid input.
|
||||
*/
|
||||
export function checkAddress (address: HexString | string, prefix: Prefix): [boolean, string | null] {
|
||||
export function checkAddress (address: string, prefix: Prefix): [boolean, string | null] {
|
||||
let decoded;
|
||||
|
||||
try {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { sshash } from './sshash.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types.js';
|
||||
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L6
|
||||
@@ -11,7 +10,7 @@ import { base58Decode } from '../base58/index.js';
|
||||
import { checkAddressChecksum } from './checksum.js';
|
||||
import { defaults } from './defaults.js';
|
||||
|
||||
export function decodeAddress (encoded?: HexString | string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
|
||||
export function decodeAddress (encoded?: string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
|
||||
if (!encoded) {
|
||||
throw new Error('Invalid empty address passed');
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { availableNetworks } from '../networks.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { DeriveJunction } from '../key/DeriveJunction.js';
|
||||
import type { Prefix } from './types.js';
|
||||
|
||||
@@ -20,7 +19,7 @@ function filterHard ({ isHard }: DeriveJunction): boolean {
|
||||
* @description
|
||||
* Creates a sr25519 derived address based on the input address/publicKey and the uri supplied.
|
||||
*/
|
||||
export function deriveAddress (who: HexString | Uint8Array | string, suri: string, ss58Format?: Prefix): string {
|
||||
export function deriveAddress (who: string | Uint8Array, suri: string, ss58Format?: Prefix): string {
|
||||
const { path } = keyExtractPath(suri);
|
||||
|
||||
if (!path.length || path.every(filterHard)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types.js';
|
||||
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L34
|
||||
@@ -12,7 +11,7 @@ import { decodeAddress } from './decode.js';
|
||||
import { defaults } from './defaults.js';
|
||||
import { sshash } from './sshash.js';
|
||||
|
||||
export function encodeAddress (key: HexString | Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
|
||||
export function encodeAddress (key: string | Uint8Array, ss58Format: Prefix = defaults.prefix): string {
|
||||
// decode it, this means we can re-encode an address
|
||||
const u8a = decodeAddress(key);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
|
||||
// Copyright 2017-2024 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user