Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25f9444c53 | ||
|
|
6d46f8b24e | ||
|
|
0189cdabe9 | ||
|
|
9d61c2c96c | ||
|
|
6599b41155 | ||
|
|
9c05257046 | ||
|
|
41e2e67fd0 | ||
|
|
092fbdd923 | ||
|
|
c1cdc80169 | ||
|
|
306bbdea12 | ||
|
|
f41519e185 | ||
|
|
1a3fd344b5 | ||
|
|
f798c1dbd5 | ||
|
|
813d358999 | ||
|
|
e85eb35413 | ||
|
|
8a50cba394 | ||
|
|
20f030e987 | ||
|
|
4a683f41d3 | ||
|
|
ea7f59ab73 | ||
|
|
60498f7f36 | ||
|
|
9ad0c46417 | ||
|
|
0fc140f838 | ||
|
|
cd63bb695d | ||
|
|
7eac688074 | ||
|
|
820a5e4077 | ||
|
|
bc0f69aef0 | ||
|
|
5074adf690 | ||
|
|
8461d105d6 | ||
|
|
cd246e2381 | ||
|
|
8a499bf1bf | ||
|
|
5b2ec8e4d6 | ||
|
|
4a06d1382f | ||
|
|
66ac9e15a6 | ||
|
|
0e55357053 | ||
|
|
b4b80bbf67 | ||
|
|
4355b9b066 | ||
|
|
5c92e095ff | ||
|
|
4fedd594f1 | ||
|
|
6f05fa6634 | ||
|
|
856e93f4a0 | ||
|
|
195e42ec11 | ||
|
|
16e90aadfc | ||
|
|
bcdf5ba26e | ||
|
|
ae9a04e557 | ||
|
|
4b37a82fb3 | ||
|
|
1b69bb9dfa | ||
|
|
e8f703f850 | ||
|
|
3ad4455fe1 | ||
|
|
1f6a263a8e | ||
|
|
73073529bb | ||
|
|
e1bdac1ba5 | ||
|
|
56c619944c | ||
|
|
4c60b98b07 | ||
|
|
2f9f007547 | ||
|
|
d00184fff7 | ||
|
|
e1e3a1699f | ||
|
|
90a1837978 | ||
|
|
c96ad1a34e | ||
|
|
b1eda9efe9 | ||
|
|
2184ae8511 | ||
|
|
ce94314992 | ||
|
|
eea3596847 | ||
|
|
37e78f7abd | ||
|
|
4bb2c83213 | ||
|
|
3828d941a9 | ||
|
|
c92d5cfb20 | ||
|
|
70d2250b3b | ||
|
|
a46279876f | ||
|
|
4267c4ac76 | ||
|
|
e09dfcffbe | ||
|
|
b722291de2 | ||
|
|
4367bb0f68 | ||
|
|
1d71f67e2a | ||
|
|
2d4995b16e | ||
|
|
b96cfd36cf | ||
|
|
9f53838626 | ||
|
|
478dd6ccd9 | ||
|
|
fd313c2e91 | ||
|
|
66b58ea5f2 | ||
|
|
66acbe04af | ||
|
|
2194cc58d7 | ||
|
|
768f64aec7 | ||
|
|
2176bedd50 | ||
|
|
8273eb5441 | ||
|
|
76af1b8822 | ||
|
|
80eb70a382 | ||
|
|
7e01b2b256 | ||
|
|
b30bed8707 | ||
|
|
d79813065f | ||
|
|
7e12949146 | ||
|
|
5ca6575245 | ||
|
|
4cadf3bcb7 | ||
|
|
81f8f16b98 | ||
|
|
8edfb1139f | ||
|
|
69d1d896d1 | ||
|
|
3bc62adf6f | ||
|
|
691a8e9b18 | ||
|
|
fc812590e5 | ||
|
|
05499abcd5 | ||
|
|
e375dd8a9d | ||
|
|
3269883e8f | ||
|
|
c99129ee06 | ||
|
|
2514e107bf | ||
|
|
3c34a0e1f2 | ||
|
|
f704e371c8 | ||
|
|
97e3443e74 | ||
|
|
a84e101666 | ||
|
|
a799918d58 | ||
|
|
429390fb62 | ||
|
|
05d0109b72 | ||
|
|
02b1429979 | ||
|
|
6e1853d01f | ||
|
|
aa9c406d01 | ||
|
|
f9ec44823d | ||
|
|
54218651f9 | ||
|
|
571c9eff6a | ||
|
|
5b7333b8dd | ||
|
|
938fa8b967 | ||
|
|
b99a69871e | ||
|
|
b1da8f575b | ||
|
|
a960aaf6ae | ||
|
|
f88c647ad0 | ||
|
|
7ff11925d9 | ||
|
|
cb5a588489 | ||
|
|
09019224e3 | ||
|
|
2d7031831a | ||
|
|
faf7ea2b17 | ||
|
|
af973de694 | ||
|
|
dfede866b2 | ||
|
|
0f0b243815 | ||
|
|
29f53fe906 | ||
|
|
225c250634 | ||
|
|
c871e9d735 | ||
|
|
b42ead28e5 | ||
|
|
db0581c051 | ||
|
|
e7ac095ace | ||
|
|
a7d9fc48e9 | ||
|
|
3db2990ce7 | ||
|
|
4b7cda243b | ||
|
|
c4ceeb8382 | ||
|
|
540971d388 | ||
|
|
b4d65a1c49 | ||
|
|
4fd4660853 | ||
|
|
4b46c179b2 | ||
|
|
3c6d297ecd | ||
|
|
4a6e620acc | ||
|
|
50b494ee2e | ||
|
|
5b551ca976 | ||
|
|
5f2a0e25f9 | ||
|
|
4edb0f00b6 | ||
|
|
096c772d7d | ||
|
|
d771d4c243 | ||
|
|
e038c36719 | ||
|
|
19c8799986 | ||
|
|
e7f642e7fb | ||
|
|
90e05a7907 | ||
|
|
1ad961eb93 | ||
|
|
8549f1fe89 | ||
|
|
0be212bd49 | ||
|
|
2dd2f78f7e | ||
|
|
d5ce0ff4d1 | ||
|
|
4d887e889a | ||
|
|
1113d09315 | ||
|
|
b774b7804b | ||
|
|
6c1b0e7346 | ||
|
|
68ba664c4c | ||
|
|
c3c4ceab8b | ||
|
|
fff30601a0 | ||
|
|
cfb5d24a87 | ||
|
|
7ce4ed1504 | ||
|
|
5a00b146fc | ||
|
|
1a73a3407e | ||
|
|
0db66346a6 | ||
|
|
a07bfe1234 | ||
|
|
5feb233abc | ||
|
|
16951c6feb | ||
|
|
22aa8d7adb | ||
|
|
dfaf954f75 | ||
|
|
78911607e8 | ||
|
|
cdcc331e6e | ||
|
|
882b29eebd | ||
|
|
de5c9a1594 | ||
|
|
2fc26b5533 | ||
|
|
6d795ecc5d | ||
|
|
a0c3aa3059 | ||
|
|
e30bac1ed6 | ||
|
|
50a061eab3 | ||
|
|
f2064f059f | ||
|
|
768cd68146 | ||
|
|
0a5bfdca5e | ||
|
|
3ec2f6dcb2 | ||
|
|
0f2a3a142f | ||
|
|
6f5a706ec9 | ||
|
|
7e0f917c2b | ||
|
|
99731a6664 | ||
|
|
7765476a26 | ||
|
|
2cd9633afe | ||
|
|
72749d083f | ||
|
|
9ede85f99a | ||
|
|
d6a390beb4 | ||
|
|
a14bec79f8 | ||
|
|
c0de5ac3c8 | ||
|
|
8d7f810556 | ||
|
|
5c6526a6bd | ||
|
|
e9635ab75b | ||
|
|
e946243b6f | ||
|
|
ca6a4177b5 | ||
|
|
7817311f84 | ||
|
|
77659aae2a | ||
|
|
7cc619fbb0 | ||
|
|
887654049e | ||
|
|
d07b79f578 | ||
|
|
cefeb0bb51 | ||
|
|
1d675ec803 | ||
|
|
7596dfa65c | ||
|
|
508e997c64 | ||
|
|
89563ee05c | ||
|
|
8b72584d53 | ||
|
|
4ae62c114b | ||
|
|
823fb51d18 | ||
|
|
a840b815bd | ||
|
|
fbf973dc2a | ||
|
|
2698f6779f | ||
|
|
3b5de80c54 | ||
|
|
041f5a7c2b | ||
|
|
cb8f1130af | ||
|
|
f480df7504 | ||
|
|
51763d3bf9 | ||
|
|
d2b7e88060 | ||
|
|
b20df563ce | ||
|
|
5ada180d66 | ||
|
|
a4256de444 | ||
|
|
bce5553a4b | ||
|
|
670743cbcf | ||
|
|
ffed9ceb6d | ||
|
|
bbacb1b80a | ||
|
|
5ea38c9898 | ||
|
|
7177722a49 | ||
|
|
6083923604 | ||
|
|
7a3e1c23aa | ||
|
|
cab50dbf7a | ||
|
|
9964b308ce | ||
|
|
247a0e7227 | ||
|
|
f2dba8aff8 | ||
|
|
2ef18335e3 | ||
|
|
fa0818d088 | ||
|
|
2106626f22 | ||
|
|
fceab0becc |
-30
@@ -1,30 +0,0 @@
|
||||
8
|
||||
2.6.2
|
||||
2.12.2
|
||||
5.2.2
|
||||
5.2.3
|
||||
5.4.2
|
||||
5.4.3
|
||||
5.4.4
|
||||
5.5.2
|
||||
5.6.2
|
||||
5.6.3
|
||||
5.9.2
|
||||
6.0.2
|
||||
6.0.3
|
||||
6.0.4
|
||||
6.0.5
|
||||
|
||||
7.0.2
|
||||
7.0.3
|
||||
7.1.2
|
||||
7.8.2
|
||||
7.9.2
|
||||
8.0.2
|
||||
8.0.3
|
||||
8.0.4
|
||||
8.0.5
|
||||
8.1.2
|
||||
8.2.2
|
||||
8.3.2
|
||||
8.3.3
|
||||
@@ -0,0 +1,86 @@
|
||||
<!--
|
||||
|
||||
For general support, howto, coding and bundling questions, please
|
||||
use the Substrate & Polkadot StackExchange at
|
||||
|
||||
https://substrate.stackexchange.com/
|
||||
|
||||
and get other ecosystem developers involved. This issues in this
|
||||
repository are meant for the tracking of feature requests and bug
|
||||
reports.
|
||||
|
||||
While all issues are looked at non-bug and non-features would take
|
||||
quite a bit longer to get to and may yield less than satisfactory
|
||||
responses in this format.
|
||||
|
||||
Additionally, please ensure you have done a search on the existing
|
||||
and closed issues before logging a new request. This saves time on
|
||||
all sides.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **I'm submitting a ...**
|
||||
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
Classify the type of report your are submitting
|
||||
|
||||
-->
|
||||
|
||||
- [ ] Bug report
|
||||
- [ ] Feature request
|
||||
- [ ] Support request
|
||||
- [ ] Other
|
||||
|
||||
|
||||
* **What is the current behavior and expected behavior?**
|
||||
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
If you're describing a bug, tell us what should happen. If you're
|
||||
suggesting a change/improvement, tell us how it should work.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **What is the motivation for changing the behavior?**
|
||||
|
||||
<!---
|
||||
|
||||
OPTIONAL:
|
||||
|
||||
Suggest a motivation for the request or ideas how to implement the
|
||||
addition or change
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **Please tell us about your environment:**
|
||||
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
Include as many relevant details about the environment in which you
|
||||
experienced the issue. Also ensure that you have tested against the
|
||||
latest stable releases if you believe this to be a bug
|
||||
|
||||
-->
|
||||
|
||||
- Version:
|
||||
- Environment:
|
||||
|
||||
- [ ] Node.js
|
||||
- [ ] Browser
|
||||
- [ ] Other (limited support for other environments)
|
||||
|
||||
- Language:
|
||||
|
||||
- [ ] JavaScript
|
||||
- [ ] TypeScript (include tsc --version)
|
||||
- [ ] Other
|
||||
@@ -5,7 +5,7 @@ jobs:
|
||||
pr:
|
||||
strategy:
|
||||
matrix:
|
||||
step: ['lint', 'test', 'build']
|
||||
step: ['lint', 'test', 'build', 'deno']
|
||||
name: ${{ matrix.step }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
@@ -13,7 +13,11 @@ jobs:
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: denoland/setup-deno@v1
|
||||
with:
|
||||
deno-version: vx.x.x
|
||||
- name: ${{ matrix.step }}
|
||||
if: always()
|
||||
run: |
|
||||
yarn install --immutable | grep -v 'YN0013'
|
||||
yarn ${{ matrix.step }}
|
||||
|
||||
+3
-6
@@ -1,13 +1,12 @@
|
||||
--test-*
|
||||
_book/
|
||||
build/
|
||||
build-cjs/
|
||||
build-esm/
|
||||
build-docs/
|
||||
build-*/
|
||||
coverage/
|
||||
docs/.vuepress/dist/
|
||||
node_modules/
|
||||
tmp/
|
||||
/import_map.json
|
||||
/mod.ts
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
@@ -26,6 +25,4 @@ npm-debug.log*
|
||||
package-lock.json
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
store.db
|
||||
store.db.compacted
|
||||
tsconfig.*buildinfo
|
||||
|
||||
+117
@@ -1,5 +1,122 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 10.1.1 Jul 21, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `arrayUnzip` as reverse of `arrayZip`
|
||||
- Adjust `objectSpread` to natively handle `Map` entries spreads
|
||||
- Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters
|
||||
- Adjust `nobody` zero-key pair with pre-computed address
|
||||
- Align `objectProperty` & `lazyMethod` call signatures (backwards compatible)
|
||||
- Various internal speed optimizations
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.0.2 Jul 10, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust async import in `x-fetch` to be Jest-friendly
|
||||
|
||||
|
||||
## 10.0.1 Jul 8, 2022
|
||||
|
||||
- **Breaking change** In this major version version previously deprecated function signatures have been removed. If still using the old forms for either `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn` or `u8aToBn`, please update and only pass through an options object as the second parameter.
|
||||
|
||||
Contributed:
|
||||
|
||||
- Ledger support for Stafi (Thanks to https://github.com/kaelnew)
|
||||
- Ledger support for Aleph Zero (Thanks to https://github.com/carlosala)
|
||||
- Add genesis for HydraDX parachain (Thanks to https://github.com/jak-pan)
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove deprecated signatures for `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn`, `u8aToBn`
|
||||
- Align option handling of `n*` (BigInt) functions with `bn*` (BN)
|
||||
- Allow for usage without `@types/node` installed
|
||||
- Adjust for available ESM-only dependencies
|
||||
- Upgrade dependencies to latest stable versions
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.3
|
||||
|
||||
|
||||
## 9.7.2 Jul 4, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.2
|
||||
|
||||
|
||||
## 9.7.1 Jul 1, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Update signatures where `readonly` arrays are used
|
||||
- Upgrade dependencies to latest stable versions
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.1
|
||||
|
||||
|
||||
## 9.6.2 Jun 25, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix `hexToU8a` where `0x` is not correctly converted
|
||||
|
||||
|
||||
## 9.6.1 Jun 23, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `floatToU8a` and `u8aToFloat` (both 32 & 64-bit, le & be)
|
||||
- Adjust `isUndefined` check (local variable available)
|
||||
- Adjust use of `assert`, `isUndefined` & `isNull`
|
||||
|
||||
|
||||
## 9.5.1 Jun 18, 2022
|
||||
|
||||
Contributed:
|
||||
|
||||
- Update Bifrost genesisHash (Thanks to https://github.com/awesomepan)
|
||||
- Add Ledger support for Composable (Thanks to https://github.com/carlosala)
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `u8aToNumber` (limited, <= 48 bits) function
|
||||
- Use `~~` as bitwise/faster `Math.floor` replacement
|
||||
- Remove unneeded `objectSpread` option expansions
|
||||
- Optimize `hexToU8a` operations
|
||||
- Optimize `stringCamelCase` operations
|
||||
- Optimize `u8aToBn` operations
|
||||
- Additional internal/external comments (as missing)
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 9.4.1 Jun 4, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `nextTick` to `@polkadot/util` to defer execution to the queue
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 9.3.1 May 29, 2022
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Ledger support for Parallel (Thanks to https://github.com/carlosala)
|
||||
- Add Ledger support for Astar & Polkadex (Thanks to https://github.com/carlosala)
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `u8aToU8a` checks with better `isU8a` shortcut
|
||||
- Adjust compact conversion with unrolled loops
|
||||
- Adjust `string{Camel, Pascal}Case` with loop (no map)
|
||||
- Add `compactFromU8aLim` variant with Uint8Array-only inputs
|
||||
- Add `u8aConcatStrict` variant with Uint8Array-only inputs
|
||||
- Internal code maintainability enhancements
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 9.2.1 May 13, 2022
|
||||
|
||||
Contributed:
|
||||
|
||||
+5
-4
@@ -1,10 +1,12 @@
|
||||
1316 Jaco 9.2.1 (#1489)
|
||||
1432 Jaco 10.1.1 (#1614)
|
||||
9 Antoine Estienne Add eth uri keyring test (#1291)
|
||||
6 Amaury Martiny Add tests from Rust (#283)
|
||||
6 Carlo Sala feat(ledger): add interlay and unique (#1609)
|
||||
5 Jakub Pánik Add HydraDX parachain to genesis (#1583)
|
||||
5 kwingram25 Add BN consts and timeToString (#610)
|
||||
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
||||
4 Jakub Pánik Add basilisk 🐍 (#1396)
|
||||
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
||||
3 pan update bifrost genesis hash (#1521)
|
||||
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
||||
2 Gav Wood Fix stake:unstake (#182)
|
||||
2 Hyungsuk Kang Add cross client Encryption/Decryption (#496)
|
||||
@@ -12,7 +14,6 @@
|
||||
2 Kami Adding Westend genesis. (#1429)
|
||||
2 Lovesh Harchandani Update genesis hash of Dock mainnet (#1436)
|
||||
2 Nantian fix bigint type (#1079)
|
||||
2 pan add bifrost (#1296)
|
||||
2 Stefanie Doll Add missing dependencies to util-crypto (#424)
|
||||
1 Agustinus Theodorus docs: fix typo in naclSeal docs. (#1005)
|
||||
1 Alexander Krupenkin Added ECDSA keypair support (#589)
|
||||
@@ -20,7 +21,6 @@
|
||||
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 Carlo Sala feat(networks): add statemint to KnownLedger (#1467)
|
||||
1 Eliott Teissonniere add nodle ledger specs (#1089)
|
||||
1 h4x3rotab Throws an error when signing with a locked keypair (#578)
|
||||
1 Harry Liu Update README.md (#446)
|
||||
@@ -30,6 +30,7 @@
|
||||
1 Jake Naviasky Add evmToAddress and addressToEvm crypto utils. (#705)
|
||||
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 Lezek123 logger - wildcard include/exclude with DEBUG env (#932)
|
||||
1 Mario Neises remove redudant export (#257)
|
||||
1 Miguel Hervas Add CFG Ledger Support (#1057)
|
||||
|
||||
+12
-7
@@ -10,7 +10,12 @@
|
||||
"url": "https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"version": "9.2.1",
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"versions": {
|
||||
"git": "10.1.1",
|
||||
"npm": "10.1.1"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
@@ -19,19 +24,19 @@
|
||||
"build:release": "polkadot-ci-ghact-build",
|
||||
"build:rollup": "polkadot-exec-rollup --config",
|
||||
"clean": "polkadot-dev-clean-build",
|
||||
"deno": "yarn polkadot-dev-deno-map && yarn build && deno check --import-map=import_map.json mod.ts",
|
||||
"lint": "polkadot-dev-run-lint",
|
||||
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
|
||||
"postinstall": "polkadot-dev-yarn-only",
|
||||
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
|
||||
"test": "NODE_OPTIONS=--experimental-vm-modules polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
|
||||
"test:mnemonicCmp": "polkadot-dev-run-test packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts",
|
||||
"test:one": "polkadot-dev-run-test --runInBand"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.17.10",
|
||||
"@polkadot/dev": "^0.66.21",
|
||||
"@types/jest": "^27.5.1"
|
||||
"@babel/core": "^7.18.9",
|
||||
"@polkadot/dev": "^0.67.84",
|
||||
"@types/jest": "^28.1.6"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^4.6.4"
|
||||
"typescript": "^4.7.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,18 +16,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.1",
|
||||
"@polkadot/util": "9.2.1"
|
||||
"@polkadot/util": "10.1.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.1"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { TransportDef } from './types';
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const transports: TransportDef[] = [];
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './empty';
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '9.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { TransportDef } from './types';
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const transports: TransportDef[] = [];
|
||||
export * from './empty';
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@polkadot/hw-ledger-transports": "9.2.1",
|
||||
"@polkadot/util": "9.2.1",
|
||||
"@zondax/ledger-substrate": "^0.27.0"
|
||||
"@polkadot/hw-ledger-transports": "10.1.1",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@zondax/ledger-substrate": "^0.33.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { ResponseBase, SubstrateApp } from '@zondax/ledger-substrate';
|
||||
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { assert, u8aToBuffer } from '@polkadot/util';
|
||||
import { u8aToBuffer } from '@polkadot/util';
|
||||
|
||||
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants';
|
||||
import { ledgerApps } from './defaults';
|
||||
@@ -26,8 +26,11 @@ export class Ledger {
|
||||
|
||||
constructor (transport: LedgerTypes, chain: Chain) {
|
||||
// u2f is deprecated
|
||||
assert(['hid', 'webusb'].includes(transport), () => `Unsupported transport ${transport}`);
|
||||
assert(Object.keys(ledgerApps).includes(chain), () => `Unsupported chain ${chain}`);
|
||||
if (!['hid', 'webusb'].includes(transport)) {
|
||||
throw new Error(`Unsupported transport ${transport}`);
|
||||
} else if (!Object.keys(ledgerApps).includes(chain)) {
|
||||
throw new Error(`Unsupported chain ${chain}`);
|
||||
}
|
||||
|
||||
this.#chain = chain;
|
||||
this.#transport = transport;
|
||||
@@ -71,7 +74,9 @@ export class Ledger {
|
||||
if (!this.#app) {
|
||||
const def = transports.find(({ type }) => type === this.#transport);
|
||||
|
||||
assert(def, () => `Unable to find a transport for ${this.#transport}`);
|
||||
if (!def) {
|
||||
throw new Error(`Unable to find a transport for ${this.#transport}`);
|
||||
}
|
||||
|
||||
const transport = await def.create();
|
||||
|
||||
@@ -96,7 +101,9 @@ export class Ledger {
|
||||
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
|
||||
const result = await promise;
|
||||
|
||||
assert(result.return_code === LEDGER_SUCCESS_CODE, () => result.error_message);
|
||||
if (result.return_code !== LEDGER_SUCCESS_CODE) {
|
||||
throw new Error(result.error_message);
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
@@ -4,24 +4,32 @@
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { newAcalaApp, newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKaruraApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp, newStatemintApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||
import { newAcalaApp, newAlephZeroApp, newAstarApp, newBifrostApp, newCentrifugeApp, newComposableApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newInterlayApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStafiApp, newStatemineApp, newStatemintApp, newUniqueApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
||||
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
acala: newAcalaApp,
|
||||
'aleph-node': newAlephZeroApp,
|
||||
astar: newAstarApp,
|
||||
bifrost: newBifrostApp,
|
||||
centrifuge: newCentrifugeApp,
|
||||
composable: newComposableApp,
|
||||
'dock-mainnet': newDockApp,
|
||||
edgeware: newEdgewareApp,
|
||||
equilibrium: newEquilibriumApp,
|
||||
genshiro: newGenshiroApp,
|
||||
'interlay-parachain': newInterlayApp,
|
||||
karura: newKaruraApp,
|
||||
kusama: newKusamaApp,
|
||||
'nodle-chain': newNodleApp,
|
||||
'nodle-para': newNodleApp,
|
||||
parallel: newParallelApp,
|
||||
polkadex: newPolkadexApp,
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp,
|
||||
sora: newSoraApp,
|
||||
stafi: newStafiApp,
|
||||
statemine: newStatemineApp,
|
||||
statemint: newStatemintApp,
|
||||
unique: newUniqueApp,
|
||||
xxnetwork: newXXNetworkApp
|
||||
};
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index';
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '9.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
|
||||
@@ -20,15 +20,15 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@polkadot/util": "9.2.1",
|
||||
"@polkadot/util-crypto": "9.2.1"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@polkadot/util-crypto": "10.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "9.2.1",
|
||||
"@polkadot/util-crypto": "9.2.1"
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@polkadot/util-crypto": "10.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types';
|
||||
|
||||
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
|
||||
import { hexToU8a, isHex, stringToU8a } from '@polkadot/util';
|
||||
import { base64Decode, decodeAddress, ed25519PairFromSeed as ed25519FromSeed, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, secp256k1PairFromSeed as secp256k1FromSeed, sr25519PairFromSeed as sr25519FromSeed } from '@polkadot/util-crypto';
|
||||
|
||||
import { DEV_PHRASE } from './defaults';
|
||||
@@ -50,7 +50,9 @@ export class Keyring implements KeyringInstance {
|
||||
constructor (options: KeyringOptions = {}) {
|
||||
options.type = options.type || 'ed25519';
|
||||
|
||||
assert(['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), () => `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
|
||||
if (!['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined')) {
|
||||
throw new Error(`Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
|
||||
}
|
||||
|
||||
this.#pairs = new Pairs();
|
||||
this.#ss58 = options.ss58Format;
|
||||
@@ -162,7 +164,9 @@ export class Keyring implements KeyringInstance {
|
||||
* @description Creates a pair from a JSON keyfile
|
||||
*/
|
||||
public createFromJson ({ address, encoded, encoding: { content, type, version }, meta }: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair {
|
||||
assert(version !== '3' || content[0] === 'pkcs8', () => `Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);
|
||||
if (version === '3' && content[0] !== 'pkcs8') {
|
||||
throw new Error(`Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);
|
||||
}
|
||||
|
||||
const cryptoType = version === '0' || !Array.isArray(content)
|
||||
? this.type
|
||||
@@ -171,7 +175,9 @@ export class Keyring implements KeyringInstance {
|
||||
? [type]
|
||||
: type;
|
||||
|
||||
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), () => `Unknown crypto type ${cryptoType}`);
|
||||
if (!['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType)) {
|
||||
throw new Error(`Unknown crypto type ${cryptoType}`);
|
||||
}
|
||||
|
||||
// Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs
|
||||
const publicKey = isHex(address)
|
||||
@@ -216,7 +222,9 @@ export class Keyring implements KeyringInstance {
|
||||
? mnemonicToLegacySeed(phrase, '', false, 64)
|
||||
: mnemonicToMiniSecret(phrase, password);
|
||||
} else {
|
||||
assert(phrase.length <= 32, 'specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');
|
||||
if (phrase.length > 32) {
|
||||
throw new Error('specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');
|
||||
}
|
||||
|
||||
seed = stringToU8a(phrase.padEnd(32));
|
||||
}
|
||||
@@ -238,7 +246,7 @@ export class Keyring implements KeyringInstance {
|
||||
public encodeAddress = (address: Uint8Array | string, ss58Format?: number): string => {
|
||||
return this.type === 'ethereum'
|
||||
? ethereumEncode(address)
|
||||
: encodeAddress(address, isUndefined(ss58Format) ? this.#ss58 : ss58Format);
|
||||
: encodeAddress(address, ss58Format === undefined ? this.#ss58 : ss58Format);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index';
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '9.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, isUndefined, u8aEq } from '@polkadot/util';
|
||||
import { u8aEq } from '@polkadot/util';
|
||||
import { jsonDecryptData } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
|
||||
@@ -16,13 +16,15 @@ type DecodeResult = PairInfo & {
|
||||
};
|
||||
|
||||
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, _encType?: EncryptedJsonEncoding | EncryptedJsonEncoding[]): DecodeResult {
|
||||
const encType = Array.isArray(_encType) || isUndefined(_encType)
|
||||
const encType = Array.isArray(_encType) || _encType === undefined
|
||||
? _encType
|
||||
: [_encType];
|
||||
const decrypted = jsonDecryptData(encrypted, passphrase, encType);
|
||||
const header = decrypted.subarray(0, PKCS8_HEADER.length);
|
||||
|
||||
assert(u8aEq(header, PKCS8_HEADER), 'Invalid Pkcs8 header found in body');
|
||||
if (!u8aEq(header, PKCS8_HEADER)) {
|
||||
throw new Error('Invalid Pkcs8 header found in body');
|
||||
}
|
||||
|
||||
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
|
||||
let divOffset = SEED_OFFSET + SEC_LENGTH;
|
||||
@@ -34,7 +36,9 @@ export function decodePair (passphrase?: string, encrypted?: Uint8Array | null,
|
||||
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
|
||||
divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
|
||||
|
||||
assert(u8aEq(divider, PKCS8_DIVIDER), 'Invalid Pkcs8 divider found in body');
|
||||
if (!u8aEq(divider, PKCS8_DIVIDER)) {
|
||||
throw new Error('Invalid Pkcs8 divider found in body');
|
||||
}
|
||||
}
|
||||
|
||||
const pubOffset = divOffset + PKCS8_DIVIDER.length;
|
||||
|
||||
@@ -3,13 +3,15 @@
|
||||
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
|
||||
|
||||
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
|
||||
assert(secretKey, 'Expected a valid secretKey to be passed to encode');
|
||||
if (!secretKey) {
|
||||
throw new Error('Expected a valid secretKey to be passed to encode');
|
||||
}
|
||||
|
||||
const encoded = u8aConcat(
|
||||
PKCS8_HEADER,
|
||||
|
||||
@@ -217,11 +217,11 @@ describe('pair', (): void => {
|
||||
});
|
||||
|
||||
it('allows derivation on the pair', (): void => {
|
||||
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: PAIRSSR25519[0].publicKey, secretKey: PAIRSSR25519[0].secretKey }, {});
|
||||
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: hexToU8a(PAIRSSR25519[0].p), secretKey: hexToU8a(PAIRSSR25519[0].s) }, {});
|
||||
const stash = alice.derive('//stash');
|
||||
const soft = alice.derive('//funding/0');
|
||||
|
||||
expect(stash.publicKey).toEqual(PAIRSSR25519[1].publicKey);
|
||||
expect(stash.publicKey).toEqual(hexToU8a(PAIRSSR25519[1].p));
|
||||
expect(soft.address).toEqual('5ECQNn7UueWHPFda5qUi4fTmTtyCnPvGnuoyVVSj5CboJh9J');
|
||||
});
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclOpen, naclSeal, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';
|
||||
|
||||
import { decodePair } from './decode';
|
||||
@@ -145,8 +145,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
// eslint-disable-next-line sort-keys
|
||||
decodePkcs8,
|
||||
decryptMessage: (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null => {
|
||||
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
|
||||
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot encrypt with a locked key pair');
|
||||
} else if (['ecdsa', 'ethereum'].includes(type)) {
|
||||
throw new Error('Secp256k1 not supported yet');
|
||||
}
|
||||
|
||||
const messageU8a = u8aToU8a(encryptedMessageWithNonce);
|
||||
|
||||
@@ -158,8 +161,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
);
|
||||
},
|
||||
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair => {
|
||||
assert(type !== 'ethereum', 'Unable to derive on this keypair');
|
||||
assert(!isLocked(secretKey), 'Cannot derive on a locked keypair');
|
||||
if (type === 'ethereum') {
|
||||
throw new Error('Unable to derive on this keypair');
|
||||
} else if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot derive on a locked keypair');
|
||||
}
|
||||
|
||||
const { path } = keyExtractPath(suri);
|
||||
const derived = keyFromPath({ publicKey, secretKey }, path, type);
|
||||
@@ -170,8 +176,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
return recode(passphrase);
|
||||
},
|
||||
encryptMessage: (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
|
||||
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot encrypt with a locked key pair');
|
||||
} else if (['ecdsa', 'ethereum'].includes(type)) {
|
||||
throw new Error('Secp256k1 not supported yet');
|
||||
}
|
||||
|
||||
const { nonce, sealed } = naclSeal(u8aToU8a(message), convertSecretKeyToCurve25519(secretKey), convertPublicKeyToCurve25519(u8aToU8a(recipientPublicKey)), nonceIn);
|
||||
|
||||
@@ -184,7 +193,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
meta = objectSpread({}, meta, additional);
|
||||
},
|
||||
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
|
||||
return u8aConcat(
|
||||
options.withType
|
||||
@@ -212,7 +223,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;
|
||||
},
|
||||
vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
|
||||
if (type === 'sr25519') {
|
||||
return sr25519VrfSign(message, { secretKey }, context, extra);
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
|
||||
import { encodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
// empty publicKey
|
||||
const publicKey = new Uint8Array(32);
|
||||
const address = encodeAddress(publicKey);
|
||||
|
||||
// pre-computed via encodeAddress(publicKey)
|
||||
const address = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
|
||||
|
||||
const meta = {
|
||||
isTesting: true,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { KeyringPair, KeyringPairs } from './types';
|
||||
|
||||
import { assert, isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { decodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
type KeyringPairMap = Record<string, KeyringPair>;
|
||||
@@ -25,11 +25,13 @@ export class Pairs implements KeyringPairs {
|
||||
public get (address: HexString | string | Uint8Array): KeyringPair {
|
||||
const pair = this.#map[decodeAddress(address).toString()];
|
||||
|
||||
assert(pair, () => `Unable to retrieve keypair '${
|
||||
isU8a(address) || isHex(address)
|
||||
? u8aToHex(u8aToU8a(address))
|
||||
: address
|
||||
}'`);
|
||||
if (!pair) {
|
||||
throw new Error(`Unable to retrieve keypair '${
|
||||
isU8a(address) || isHex(address)
|
||||
? u8aToHex(u8aToU8a(address))
|
||||
: address
|
||||
}'`);
|
||||
}
|
||||
|
||||
return pair;
|
||||
}
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
// Copyright 2017-2022 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringInstance, KeyringOptions } from './types';
|
||||
|
||||
import { assert, hexToU8a } from '@polkadot/util';
|
||||
import { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
|
||||
import { Keyring } from './keyring';
|
||||
import { createPair } from './pair';
|
||||
|
||||
interface PairDef {
|
||||
name?: string;
|
||||
publicKey: Uint8Array;
|
||||
p: HexString;
|
||||
s: HexString;
|
||||
seed?: string;
|
||||
secretKey?: Uint8Array;
|
||||
type: KeypairType
|
||||
}
|
||||
|
||||
@@ -23,50 +24,50 @@ interface PairDef {
|
||||
// adding the keys when only the keyring is used.
|
||||
export const PAIRSSR25519: PairDef[] = [
|
||||
{
|
||||
publicKey: hexToU8a('0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'),
|
||||
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'), // nosemgrep
|
||||
p: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
|
||||
s: '0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011', // nosemgrep
|
||||
seed: 'Alice',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'),
|
||||
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'), // nosemgrep
|
||||
p: '0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f',
|
||||
s: '0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd', // nosemgrep
|
||||
seed: 'Alice//stash',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48'),
|
||||
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'), // nosemgrep
|
||||
p: '0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48',
|
||||
s: '0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325', // nosemgrep
|
||||
seed: 'Bob',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e'),
|
||||
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'), // nosemgrep
|
||||
p: '0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e',
|
||||
s: '0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde', // nosemgrep
|
||||
seed: 'Bob//stash',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22'),
|
||||
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'), // nosemgrep
|
||||
p: '0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22',
|
||||
s: '0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c', // nosemgrep
|
||||
seed: 'Charlie',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20'),
|
||||
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'), // nosemgrep
|
||||
p: '0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20',
|
||||
s: '0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568', // nosemgrep
|
||||
seed: 'Dave',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e'),
|
||||
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'), // nosemgrep
|
||||
p: '0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e',
|
||||
s: '0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587', // nosemgrep
|
||||
seed: 'Eve',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c'),
|
||||
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'), // nosemgrep
|
||||
p: '0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c',
|
||||
s: '0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426', // nosemgrep
|
||||
seed: 'Ferdie',
|
||||
type: 'sr25519'
|
||||
}
|
||||
@@ -75,44 +76,46 @@ export const PAIRSSR25519: PairDef[] = [
|
||||
export const PAIRSETHEREUM: PairDef[] = [
|
||||
{
|
||||
name: 'Alith',
|
||||
publicKey: hexToU8a('0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f'),
|
||||
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'), // nosemgrep
|
||||
p: '0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f',
|
||||
s: '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Baltathar',
|
||||
publicKey: hexToU8a('0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518'),
|
||||
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'), // nosemgrep
|
||||
p: '0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518',
|
||||
s: '0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Charleth',
|
||||
publicKey: hexToU8a('0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e'),
|
||||
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'), // nosemgrep
|
||||
p: '0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e',
|
||||
s: '0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Dorothy',
|
||||
publicKey: hexToU8a('0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c'),
|
||||
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'), // nosemgrep
|
||||
p: '0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c',
|
||||
s: '0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Ethan',
|
||||
publicKey: hexToU8a('0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa'),
|
||||
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'), // nosemgrep
|
||||
p: '0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa',
|
||||
s: '0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Faith',
|
||||
publicKey: hexToU8a('0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74'),
|
||||
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'), // nosemgrep
|
||||
p: '0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74',
|
||||
s: '0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df', // nosemgrep
|
||||
type: 'ethereum'
|
||||
}
|
||||
];
|
||||
|
||||
function createMeta (name?: string, seed?: string) {
|
||||
assert(name || seed, 'Testing pair should have either a name or a seed');
|
||||
if (!name && !seed) {
|
||||
throw new Error('Testing pair should have either a name or a seed');
|
||||
}
|
||||
|
||||
return {
|
||||
isTesting: true,
|
||||
@@ -128,16 +131,20 @@ function createMeta (name?: string, seed?: string) {
|
||||
*/
|
||||
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
|
||||
const keyring = new Keyring(options);
|
||||
const pairs = (options.type && options.type === 'ethereum')
|
||||
const pairs = options.type === 'ethereum'
|
||||
? PAIRSETHEREUM
|
||||
: PAIRSSR25519;
|
||||
|
||||
for (const { name, publicKey, secretKey, seed, type } of pairs) {
|
||||
for (const { name, p, s, seed, type } of pairs) {
|
||||
const meta = createMeta(name, seed);
|
||||
const pair = !isDerived && !name && seed
|
||||
? keyring.addFromUri(seed, meta, options.type)
|
||||
: keyring.addPair(
|
||||
createPair({ toSS58: keyring.encodeAddress, type }, { publicKey, secretKey }, meta)
|
||||
createPair(
|
||||
{ toSS58: keyring.encodeAddress, type },
|
||||
{ publicKey: hexToU8a(p), secretKey: hexToU8a(s) },
|
||||
meta
|
||||
)
|
||||
);
|
||||
|
||||
pair.lock = (): void => {
|
||||
|
||||
@@ -17,15 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@polkadot/util": "9.2.1",
|
||||
"@substrate/ss58-registry": "^1.18.0"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@substrate/ss58-registry": "^1.24.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/hw-ledger": "9.2.1",
|
||||
"@polkadot/x-fetch": "9.2.1"
|
||||
"@polkadot/hw-ledger": "10.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
// Copyright 2017-2022 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Ss58Registry } from './types';
|
||||
|
||||
import fs from 'fs';
|
||||
|
||||
import { objectKeys, stringify } from '@polkadot/util';
|
||||
import { fetch } from '@polkadot/x-fetch';
|
||||
|
||||
import { allNetworks } from './';
|
||||
|
||||
const REGISTRY = 'https://raw.githubusercontent.com/paritytech/ss58-registry/main/ss58-registry.json';
|
||||
const OUTPUT = './.github/ss58-check.md';
|
||||
|
||||
function assertAndLog (check: boolean, error: string): void {
|
||||
if (!check) {
|
||||
process.env.CI_LOG && fs.appendFileSync(OUTPUT, `
|
||||
|
||||
${error}
|
||||
`);
|
||||
|
||||
throw new Error(error);
|
||||
}
|
||||
}
|
||||
|
||||
describe('check latest Substrate ss58 registry', (): void => {
|
||||
let original: Ss58Registry;
|
||||
|
||||
beforeAll(async (): Promise<void> => {
|
||||
original = (await (await fetch(REGISTRY)).json()) as Ss58Registry;
|
||||
});
|
||||
|
||||
it('has the same number as the original', (): void => {
|
||||
assertAndLog(allNetworks.length === original.registry.length, `Number of entries mismatched:: Expected ${original.registry.length} found ${allNetworks.length}`);
|
||||
});
|
||||
|
||||
it('has no missing any entries', (): void => {
|
||||
const missing = original.registry
|
||||
.filter(({ prefix }) => !allNetworks.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has no extra entries', (): void => {
|
||||
const missing = allNetworks
|
||||
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has the same values as the original', (): void => {
|
||||
const fields = objectKeys(original.schema);
|
||||
const errors = original.registry
|
||||
.map((n): [string, string[]] => {
|
||||
const other = allNetworks.find(({ prefix }) => prefix === n.prefix);
|
||||
|
||||
return [
|
||||
`${n.displayName} (${n.prefix})`,
|
||||
other
|
||||
? fields.filter((f) =>
|
||||
['decimals', 'symbols'].includes(f)
|
||||
? stringify(n[f] || []) !== stringify(other[f] || [])
|
||||
: stringify(n[f]) !== stringify(other[f])
|
||||
)
|
||||
: []
|
||||
];
|
||||
})
|
||||
.filter(([, fields]) => fields.length);
|
||||
|
||||
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
|
||||
});
|
||||
});
|
||||
@@ -11,6 +11,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
acala: [
|
||||
'0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
|
||||
],
|
||||
'aleph-node': [
|
||||
'0x70255b4d28de0fc4e1a193d7e175ad1ccef431598211c55538f1018651a0344e'
|
||||
],
|
||||
astar: [
|
||||
'0x9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6'
|
||||
],
|
||||
@@ -18,11 +21,15 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0xa85cfb9b9fd4d622a5b28289a02347af987d8f73fa3108450e2b4a11c1ce5755'
|
||||
],
|
||||
bifrost: [
|
||||
'0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
|
||||
'0x262e1b2ad728475fd6fe88e62d34c200abe6fd693931ddad144059b1eb884e5b'
|
||||
],
|
||||
centrifuge: [
|
||||
'0xb3db41421702df9a7fcac62b53ffeac85f7853cc4e689e0b93aeb3db18c09d82',
|
||||
'0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
|
||||
],
|
||||
composable: [
|
||||
'0xdaab8df776eb52ec604a5df5d388bb62a050a0aaec4556a64265b9d42755552d'
|
||||
],
|
||||
'dock-mainnet': [
|
||||
'0x6bfe24dca2a3be10f22212678ac13a6446ec764103c0f3471c71609eac384aae',
|
||||
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
|
||||
@@ -37,11 +44,15 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0x9b8cefc0eb5c568b527998bdd76c184e2b76ae561be76e4667072230217ea243'
|
||||
],
|
||||
hydradx: [
|
||||
'0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', // HydraDX Parachain
|
||||
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
|
||||
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
|
||||
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
|
||||
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
|
||||
],
|
||||
'interlay-parachain': [
|
||||
'0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
|
||||
],
|
||||
karura: [
|
||||
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
|
||||
],
|
||||
@@ -53,12 +64,18 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
|
||||
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
|
||||
],
|
||||
'nodle-chain': [
|
||||
'0xa3d114c2b8d0627c1aa9b134eafcf7d05ca561fdc19fb388bb9457f81809fb23'
|
||||
'nodle-para': [
|
||||
'0x97da7ede98d7bad4e36b4d734b6055425a3be036da2a332ea5a7037656427a21'
|
||||
],
|
||||
parallel: [
|
||||
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
|
||||
],
|
||||
picasso: [
|
||||
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
||||
],
|
||||
polkadex: [
|
||||
'0x3920bcb4960a1eef5580cd5367ff3f430eef052774f78468852f7b9cb39f8a3c'
|
||||
],
|
||||
polkadot: [
|
||||
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
|
||||
],
|
||||
@@ -94,6 +111,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
subsocial: [
|
||||
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
|
||||
],
|
||||
unique: [
|
||||
'0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
|
||||
],
|
||||
westend: [
|
||||
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
|
||||
],
|
||||
|
||||
@@ -9,19 +9,27 @@ import type { KnownLedger } from '../types';
|
||||
// NOTE: Any network here needs to have a genesisHash attached in the ./genesis.ts config
|
||||
export const knownLedger: KnownLedger = {
|
||||
acala: 0x00000313,
|
||||
'aleph-node': 0x00000283,
|
||||
astar: 0x0000032a,
|
||||
bifrost: 0x00000314,
|
||||
centrifuge: 0x000002eb,
|
||||
composable: 0x00000162,
|
||||
'dock-mainnet': 0x00000252,
|
||||
edgeware: 0x0000020b,
|
||||
equilibrium: 0x05f5e0fd,
|
||||
genshiro: 0x05f5e0fc,
|
||||
'interlay-parachain': 0x00000162,
|
||||
karura: 0x000002ae,
|
||||
kusama: 0x000001b2,
|
||||
'nodle-chain': 0x000003eb,
|
||||
'nodle-para': 0x000003eb,
|
||||
parallel: 0x00000162,
|
||||
polkadex: 0x0000031f,
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253,
|
||||
sora: 0x00000269,
|
||||
stafi: 0x0000038b,
|
||||
statemine: 0x000001b2, // common-good on Kusama, shares derivation
|
||||
statemint: 0x00000162, // common-good on Polkadot, shares derivation
|
||||
unique: 0x00000162,
|
||||
xxnetwork: 0x000007a3
|
||||
};
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index';
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '9.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
|
||||
@@ -438,7 +438,7 @@
|
||||
"NODL"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
11
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://nodle.io/"
|
||||
@@ -633,6 +633,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://dico.io"
|
||||
},
|
||||
{
|
||||
"prefix": 54,
|
||||
"network": "cere",
|
||||
"displayName": "Cere Network",
|
||||
"symbols": [
|
||||
"CERE"
|
||||
],
|
||||
"decimals": [
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://cere.network"
|
||||
},
|
||||
{
|
||||
"prefix": 55,
|
||||
"network": "xxnetwork",
|
||||
@@ -646,6 +659,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://xx.network"
|
||||
},
|
||||
{
|
||||
"prefix": 56,
|
||||
"network": "pendulum",
|
||||
"displayName": "Pendulum chain",
|
||||
"symbols": [
|
||||
"PEN"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://pendulumchain.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 57,
|
||||
"network": "amplitude",
|
||||
"displayName": "Amplitude chain",
|
||||
"symbols": [
|
||||
"AMPE"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://pendulumchain.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 63,
|
||||
"network": "hydradx",
|
||||
@@ -780,6 +819,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://polkadex.trade"
|
||||
},
|
||||
{
|
||||
"prefix": 89,
|
||||
"network": "polkadexparachain",
|
||||
"displayName": "Polkadex Parachain",
|
||||
"symbols": [
|
||||
"PDEX"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://polkadex.trade"
|
||||
},
|
||||
{
|
||||
"prefix": 93,
|
||||
"network": "fragnova",
|
||||
"displayName": "Fragnova Network",
|
||||
"symbols": [
|
||||
"NOVA"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://fragnova.com"
|
||||
},
|
||||
{
|
||||
"prefix": 98,
|
||||
"network": "polkasmith",
|
||||
@@ -854,6 +919,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://integritee.network"
|
||||
},
|
||||
{
|
||||
"prefix": 117,
|
||||
"network": "tinker",
|
||||
"displayName": "Tinker",
|
||||
"symbols": [
|
||||
"TNKR"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://invarch.network"
|
||||
},
|
||||
{
|
||||
"prefix": 126,
|
||||
"network": "joystream",
|
||||
"displayName": "Joystream",
|
||||
"symbols": [
|
||||
"JOY"
|
||||
],
|
||||
"decimals": [
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.joystream.org"
|
||||
},
|
||||
{
|
||||
"prefix": 128,
|
||||
"network": "clover",
|
||||
@@ -984,6 +1075,32 @@
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://efinity.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 1221,
|
||||
"network": "peaq",
|
||||
"displayName": "Peaq Network",
|
||||
"symbols": [
|
||||
"PEAQ"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://www.peaq.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 1222,
|
||||
"network": "apex",
|
||||
"displayName": "Apex Network",
|
||||
"symbols": [
|
||||
"APEX"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://www.peaq.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 1284,
|
||||
"network": "moonbeam",
|
||||
@@ -1101,6 +1218,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://subspace.network"
|
||||
},
|
||||
{
|
||||
"prefix": 7007,
|
||||
"network": "tidefi",
|
||||
"displayName": "Tidefi",
|
||||
"symbols": [
|
||||
"TDFY"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://tidefi.com"
|
||||
},
|
||||
{
|
||||
"prefix": 7391,
|
||||
"network": "unique_mainnet",
|
||||
@@ -1114,6 +1244,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
},
|
||||
{
|
||||
"prefix": 9807,
|
||||
"network": "dentnet",
|
||||
"displayName": "DENTNet",
|
||||
"symbols": [
|
||||
"DENTX"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.dentnet.io"
|
||||
},
|
||||
{
|
||||
"prefix": 10041,
|
||||
"network": "basilisk",
|
||||
@@ -1165,5 +1308,33 @@
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://ata.network"
|
||||
},
|
||||
{
|
||||
"prefix": 15253,
|
||||
"network": "ice-network",
|
||||
"displayName": "ICE Network",
|
||||
"symbols": [
|
||||
"ICX",
|
||||
"ICY"
|
||||
],
|
||||
"decimals": [
|
||||
18,
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 12191,
|
||||
"network": "nftmart",
|
||||
"displayName": "NFTMart",
|
||||
"symbols": [
|
||||
"NMT"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://nftmart.io"
|
||||
}
|
||||
]
|
||||
@@ -12,7 +12,6 @@
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../hw-ledger/tsconfig.build.json" },
|
||||
{ "path": "../util/tsconfig.build.json" },
|
||||
{ "path": "../x-fetch/tsconfig.build.json" }
|
||||
{ "path": "../util/tsconfig.build.json" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -22,22 +22,22 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"browser": {
|
||||
"crypto": false,
|
||||
"stream": false
|
||||
},
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@noble/hashes": "1.0.0",
|
||||
"@noble/secp256k1": "1.5.5",
|
||||
"@polkadot/networks": "9.2.1",
|
||||
"@polkadot/util": "9.2.1",
|
||||
"@polkadot/wasm-crypto": "^6.1.1",
|
||||
"@polkadot/x-bigint": "9.2.1",
|
||||
"@polkadot/x-randomvalues": "9.2.1",
|
||||
"@scure/base": "1.0.0",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@noble/hashes": "1.1.2",
|
||||
"@noble/secp256k1": "1.6.3",
|
||||
"@polkadot/networks": "10.1.1",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@polkadot/wasm-crypto": "^6.3.1",
|
||||
"@polkadot/x-bigint": "10.1.1",
|
||||
"@polkadot/x-randomvalues": "10.1.1",
|
||||
"@scure/base": "1.1.1",
|
||||
"ed2curve": "^0.3.0",
|
||||
"tweetnacl": "^1.0.3"
|
||||
},
|
||||
@@ -45,6 +45,6 @@
|
||||
"@types/ed2curve": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "9.2.1"
|
||||
"@polkadot/util": "10.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,5 @@ import { decodeAddress } from './decode';
|
||||
* @summary Converts an SS58 address to its corresponding EVM address.
|
||||
*/
|
||||
export function addressToEvm (address: HexString | string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||
const decoded = decodeAddress(address, ignoreChecksum);
|
||||
|
||||
return decoded.subarray(0, 20);
|
||||
return decodeAddress(address, ignoreChecksum).subarray(0, 20);
|
||||
}
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Network } from '@polkadot/networks/types';
|
||||
|
||||
import { availableNetworks } from '../networks';
|
||||
|
||||
function networkToPrefix ({ prefix }: Network): number {
|
||||
return prefix;
|
||||
}
|
||||
|
||||
export const defaults = {
|
||||
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
|
||||
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
|
||||
allowedEncodedLengths: [3, 4, 6, 10, 35, 36, 37, 38],
|
||||
allowedPrefix: availableNetworks.map(networkToPrefix),
|
||||
allowedPrefix: availableNetworks.map(({ prefix }) => prefix),
|
||||
prefix: 42
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@ const l = logger('setSS58Format');
|
||||
* @deprecated Use keyring.setSS58Format
|
||||
*/
|
||||
export function setSS58Format (prefix: Prefix): void {
|
||||
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as pat of the address encode function');
|
||||
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as part of the address encode function');
|
||||
|
||||
defaults.prefix = prefix;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ type EncodeFn = (value: U8aLike, ipfsCompat?: boolean) => string;
|
||||
|
||||
type ValidateFn = (value?: unknown, ipfsCompat?: boolean) => value is string;
|
||||
|
||||
/** @internal */
|
||||
export function createDecode ({ coder, ipfs }: Config, validate: ValidateFn): DecodeFn {
|
||||
return (value: string, ipfsCompat?: boolean): Uint8Array => {
|
||||
validate(value, ipfsCompat);
|
||||
@@ -39,6 +40,7 @@ export function createDecode ({ coder, ipfs }: Config, validate: ValidateFn): De
|
||||
};
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function createEncode ({ coder, ipfs }: Config): EncodeFn {
|
||||
return (value: U8aLike, ipfsCompat?: boolean): string => {
|
||||
const out = coder.encode(u8aToU8a(value));
|
||||
@@ -49,6 +51,7 @@ export function createEncode ({ coder, ipfs }: Config): EncodeFn {
|
||||
};
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function createIs (validate: ValidateFn): ValidateFn {
|
||||
return (value?: unknown, ipfsCompat?: boolean): value is string => {
|
||||
try {
|
||||
@@ -59,6 +62,7 @@ export function createIs (validate: ValidateFn): ValidateFn {
|
||||
};
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function createValidate ({ chars, ipfs, type }: Config): ValidateFn {
|
||||
return (value?: unknown, ipfsCompat?: boolean): value is string => {
|
||||
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
|
||||
|
||||
@@ -10,8 +10,6 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { createAsHex } from '../helpers';
|
||||
|
||||
type BitLength = 64 | 128 | 256 | 384 | 512;
|
||||
|
||||
/**
|
||||
* @name blake2AsU8a
|
||||
* @summary Creates a blake2b u8a from the input.
|
||||
@@ -26,7 +24,7 @@ type BitLength = 64 | 128 | 256 | 384 | 512;
|
||||
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d]
|
||||
* ```
|
||||
*/
|
||||
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: BitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
|
||||
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: 64 | 128 | 256 | 384 | 512 = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
|
||||
const byteLength = Math.ceil(bitLength / 8);
|
||||
const u8a = u8aToU8a(data);
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export {};
|
||||
|
||||
describe('cryptoWaitReady', (): void => {
|
||||
it('should return false when it cannot initialize', async (): Promise<void> => {
|
||||
const old = global.WebAssembly;
|
||||
|
||||
@@ -14,17 +14,19 @@ interface DualHash {
|
||||
512: (u8a: Uint8Array) => Uint8Array;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function createAsHex <T extends (...args: any[]) => Uint8Array> (fn: T): (...args: Parameters<T>) => HexString {
|
||||
/** @internal */
|
||||
export function createAsHex <T extends (...args: never[]) => Uint8Array> (fn: T): (...args: Parameters<T>) => HexString {
|
||||
return (...args: Parameters<T>): HexString =>
|
||||
u8aToHex(fn(...args));
|
||||
}
|
||||
|
||||
export function createBitHasher <T> (bitLength: T, fn: (data: HexString | Buffer | Uint8Array | string, bitLength: T, onlyJs?: boolean) => Uint8Array): (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array {
|
||||
/** @internal */
|
||||
export function createBitHasher (bitLength: 256 | 512, fn: (data: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512, onlyJs?: boolean) => Uint8Array): (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array {
|
||||
return (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array =>
|
||||
fn(data, bitLength, onlyJs);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function createDualHasher (wa: DualHash, js: DualHash): (value: HexString | Buffer | Uint8Array | string, bitLength?: 256 | 512, onlyJs?: boolean) => Uint8Array {
|
||||
return (value: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array => {
|
||||
const u8a = u8aToU8a(value);
|
||||
|
||||
@@ -8,8 +8,6 @@ import { sha512 } from '@noble/hashes/sha512';
|
||||
import { hasBigInt, u8aToU8a } from '@polkadot/util';
|
||||
import { hmacSha256, hmacSha512, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
type BitLength = 256 | 512;
|
||||
|
||||
const JS_HASH = {
|
||||
256: sha256,
|
||||
512: sha512
|
||||
@@ -20,7 +18,7 @@ const WA_MHAC = {
|
||||
512: hmacSha512
|
||||
};
|
||||
|
||||
function createSha (bitLength: BitLength): (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array {
|
||||
function createSha (bitLength: 256 | 512): (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array {
|
||||
return (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean): Uint8Array =>
|
||||
hmacShaAsU8a(key, data, bitLength, onlyJs);
|
||||
}
|
||||
@@ -29,7 +27,7 @@ function createSha (bitLength: BitLength): (key: Uint8Array | string, data: Uint
|
||||
* @name hmacShaAsU8a
|
||||
* @description creates a Hmac Sha (256/512) Uint8Array from the key & data
|
||||
*/
|
||||
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: BitLength = 256, onlyJs?: boolean): Uint8Array {
|
||||
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array {
|
||||
const u8aKey = u8aToU8a(key);
|
||||
|
||||
return !hasBigInt || (!onlyJs && isReady())
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert, isNull } from '@polkadot/util';
|
||||
|
||||
import { DeriveJunction } from './DeriveJunction';
|
||||
import { keyExtractPath } from './extractPath';
|
||||
|
||||
@@ -22,7 +20,9 @@ export function keyExtractSuri (suri: string): ExtractResult {
|
||||
// eslint-disable-next-line @typescript-eslint/prefer-regexp-exec
|
||||
const matches = suri.match(RE_CAPTURE);
|
||||
|
||||
assert(!isNull(matches), 'Unable to match provided value to a secret URI');
|
||||
if (matches === null) {
|
||||
throw new Error('Unable to match provided value to a secret URI');
|
||||
}
|
||||
|
||||
const [, phrase, , derivePath, , , password] = matches as string[];
|
||||
const { path } = keyExtractPath(derivePath);
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
// - Use util-crypto randomAsU8a (instead of randombytes)
|
||||
// - Remove setting of wordlist passing of wordlist in functions
|
||||
// - Remove mnemonicToSeed (we only use the sync variant)
|
||||
// - generateMnemonic takes number of words (instead of strength)
|
||||
|
||||
import { assert, stringToU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
@@ -73,7 +74,7 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
||||
// calculate the checksum and compare
|
||||
const entropyBytes = entropyBits.match(/(.{1,8})/g)?.map(binaryToByte);
|
||||
|
||||
assert(entropyBytes && entropyBytes.length % 4 === 0 && entropyBytes.length >= 16 && entropyBytes.length <= 32, INVALID_ENTROPY);
|
||||
assert(entropyBytes && (entropyBytes.length % 4 === 0) && (entropyBytes.length >= 16) && (entropyBytes.length <= 32), INVALID_ENTROPY);
|
||||
|
||||
const entropy = u8aToU8a(entropyBytes);
|
||||
const newChecksum = deriveChecksumBits(entropy);
|
||||
@@ -85,7 +86,7 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
||||
|
||||
export function entropyToMnemonic (entropy: Uint8Array): string {
|
||||
// 128 <= ENT <= 256
|
||||
assert(entropy.length % 4 === 0 && entropy.length >= 16 && entropy.length <= 32, INVALID_ENTROPY);
|
||||
assert((entropy.length % 4 === 0) && (entropy.length >= 16) && (entropy.length <= 32), INVALID_ENTROPY);
|
||||
|
||||
const entropyBits = bytesToBinary(Array.from(entropy));
|
||||
const checksumBits = deriveChecksumBits(entropy);
|
||||
@@ -97,12 +98,8 @@ export function entropyToMnemonic (entropy: Uint8Array): string {
|
||||
.join(' ');
|
||||
}
|
||||
|
||||
export function generateMnemonic (strength?: number): string {
|
||||
strength = strength || 128;
|
||||
|
||||
assert(strength % 32 === 0, INVALID_ENTROPY);
|
||||
|
||||
return entropyToMnemonic(randomAsU8a(strength / 8));
|
||||
export function generateMnemonic (numWords: 12 | 15 | 18 | 21 | 24): string {
|
||||
return entropyToMnemonic(randomAsU8a((numWords / 3) * 4));
|
||||
}
|
||||
|
||||
export function validateMnemonic (mnemonic: string): boolean {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { cryptoWaitReady } from '..';
|
||||
import { mnemonicGenerate, WordCount } from './generate';
|
||||
import { mnemonicGenerate } from './generate';
|
||||
import { mnemonicValidate } from './validate';
|
||||
|
||||
describe('mnemonicGenerate', (): void => {
|
||||
@@ -17,7 +17,7 @@ describe('mnemonicGenerate', (): void => {
|
||||
});
|
||||
|
||||
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
|
||||
it.each([12, 15, 18, 21, 24] as WordCount[])('generates a valid mnemonic (%p words)', (num): void => {
|
||||
it.each([12, 15, 18, 21, 24] as 12[])('generates a valid mnemonic (%p words)', (num): void => {
|
||||
const mnemonic = mnemonicGenerate(num, onlyJs);
|
||||
const isValid = mnemonicValidate(mnemonic);
|
||||
|
||||
|
||||
@@ -6,17 +6,6 @@ import { bip39Generate, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { generateMnemonic } from './bip39';
|
||||
|
||||
export type WordCount = 12 | 15 | 18 | 21 | 24;
|
||||
|
||||
// mapping of words to the actual strength (as expected)
|
||||
const STRENGTH_MAP = {
|
||||
12: 16 * 8,
|
||||
15: 20 * 8,
|
||||
18: 24 * 8,
|
||||
21: 28 * 8,
|
||||
24: 32 * 8
|
||||
};
|
||||
|
||||
/**
|
||||
* @name mnemonicGenerate
|
||||
* @summary Creates a valid mnemonic string using using [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).
|
||||
@@ -29,8 +18,8 @@ const STRENGTH_MAP = {
|
||||
* const mnemonic = mnemonicGenerate(); // => string
|
||||
* ```
|
||||
*/
|
||||
export function mnemonicGenerate (numWords: WordCount = 12, onlyJs?: boolean): string {
|
||||
export function mnemonicGenerate (numWords: 12 | 15 | 18 | 21 | 24 = 12, onlyJs?: boolean): string {
|
||||
return !hasBigInt || (!onlyJs && isReady())
|
||||
? bip39Generate(numWords)
|
||||
: generateMnemonic(STRENGTH_MAP[numWords]);
|
||||
: generateMnemonic(numWords);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert, hasBigInt } from '@polkadot/util';
|
||||
import { hasBigInt } from '@polkadot/util';
|
||||
import { bip39ToSeed, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { mnemonicToSeedSync } from './bip39';
|
||||
@@ -25,8 +25,11 @@ import { mnemonicValidate } from './validate';
|
||||
* ```
|
||||
*/
|
||||
export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs?: boolean, byteLength: 32 | 64 = 32): Uint8Array {
|
||||
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
|
||||
assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`);
|
||||
if (!mnemonicValidate(mnemonic)) {
|
||||
throw new Error('Invalid bip39 mnemonic specified');
|
||||
} else if (![32, 64].includes(byteLength)) {
|
||||
throw new Error(`Invalid seed length ${byteLength}, expected 32 or 64`);
|
||||
}
|
||||
|
||||
return byteLength === 32
|
||||
? !hasBigInt || (!onlyJs && isReady())
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert, stringToU8a } from '@polkadot/util';
|
||||
import { stringToU8a } from '@polkadot/util';
|
||||
import { bip39ToMiniSecret, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { pbkdf2Encode } from '../pbkdf2';
|
||||
@@ -9,7 +9,9 @@ import { mnemonicToEntropy } from './toEntropy';
|
||||
import { mnemonicValidate } from './validate';
|
||||
|
||||
export function mnemonicToMiniSecret (mnemonic: string, password = '', onlyJs?: boolean): Uint8Array {
|
||||
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
|
||||
if (!mnemonicValidate(mnemonic)) {
|
||||
throw new Error('Invalid bip39 mnemonic specified');
|
||||
}
|
||||
|
||||
if (!onlyJs && isReady()) {
|
||||
return bip39ToMiniSecret(mnemonic, password);
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './index';
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '9.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { Params } from './types';
|
||||
|
||||
import { assert, u8aToBn } from '@polkadot/util';
|
||||
import { u8aToBn } from '@polkadot/util';
|
||||
|
||||
import { BN_LE_OPTS } from '../bn';
|
||||
import { DEFAULT_PARAMS } from './defaults';
|
||||
@@ -23,7 +23,9 @@ export function scryptFromU8a (data: Uint8Array): Result {
|
||||
// and updates for greater security. However we need some protection against carefully-crafted params that can
|
||||
// eat up CPU since these are user inputs. So we need to get very clever here, but atm we only allow the defaults
|
||||
// and if no match, bail out
|
||||
assert(N === DEFAULT_PARAMS.N && p === DEFAULT_PARAMS.p && r === DEFAULT_PARAMS.r, 'Invalid injected scrypt params found');
|
||||
if (N !== DEFAULT_PARAMS.N || p !== DEFAULT_PARAMS.p || r !== DEFAULT_PARAMS.r) {
|
||||
throw new Error('Invalid injected scrypt params found');
|
||||
}
|
||||
|
||||
return { params: { N, p, r }, salt };
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { Point } from '@noble/secp256k1';
|
||||
|
||||
import { assert, hasBigInt } from '@polkadot/util';
|
||||
import { hasBigInt } from '@polkadot/util';
|
||||
import { isReady, secp256k1Compress as wasm } from '@polkadot/wasm-crypto';
|
||||
|
||||
export function secp256k1Compress (publicKey: Uint8Array, onlyJs?: boolean): Uint8Array {
|
||||
@@ -11,7 +11,9 @@ export function secp256k1Compress (publicKey: Uint8Array, onlyJs?: boolean): Uin
|
||||
return publicKey;
|
||||
}
|
||||
|
||||
assert(publicKey.length === 65, 'Invalid publicKey provided');
|
||||
if (publicKey.length !== 65) {
|
||||
throw new Error('Invalid publicKey provided');
|
||||
}
|
||||
|
||||
return !hasBigInt || (!onlyJs && isReady())
|
||||
? wasm(publicKey)
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert, compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
import { compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
|
||||
const HDKD = compactAddLength(stringToU8a('Secp256k1HDKD'));
|
||||
|
||||
export function secp256k1DeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
|
||||
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
|
||||
if (!isU8a(chainCode) || chainCode.length !== 32) {
|
||||
throw new Error('Invalid chainCode passed to derive');
|
||||
}
|
||||
|
||||
// NOTE This is specific to the Substrate HDD derivation, so always use the blake2 hasher
|
||||
return blake2AsU8a(u8aConcat(HDKD, seed, chainCode), 256);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { Point } from '@noble/secp256k1';
|
||||
|
||||
import { assert, bnToU8a, hasBigInt, u8aConcat } from '@polkadot/util';
|
||||
import { bnToU8a, hasBigInt, u8aConcat } from '@polkadot/util';
|
||||
import { isReady, secp256k1Expand as wasm } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { BN_BE_256_OPTS } from '../bn';
|
||||
@@ -13,7 +13,9 @@ export function secp256k1Expand (publicKey: Uint8Array, onlyJs?: boolean): Uint8
|
||||
return publicKey.subarray(1);
|
||||
}
|
||||
|
||||
assert(publicKey.length === 33, 'Invalid publicKey provided');
|
||||
if (publicKey.length !== 33) {
|
||||
throw new Error('Invalid publicKey provided');
|
||||
}
|
||||
|
||||
if (!hasBigInt || (!onlyJs && isReady())) {
|
||||
return wasm(publicKey).subarray(1);
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { Keypair } from '../../types';
|
||||
|
||||
import { getPublicKey } from '@noble/secp256k1';
|
||||
|
||||
import { assert, hasBigInt, u8aEmpty } from '@polkadot/util';
|
||||
import { hasBigInt, u8aEmpty } from '@polkadot/util';
|
||||
import { isReady, secp256k1FromSeed } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -13,7 +13,9 @@ import { isReady, secp256k1FromSeed } from '@polkadot/wasm-crypto';
|
||||
* @description Returns a object containing a `publicKey` & `secretKey` generated from the supplied seed.
|
||||
*/
|
||||
export function secp256k1PairFromSeed (seed: Uint8Array, onlyJs?: boolean): Keypair {
|
||||
assert(seed.length === 32, 'Expected valid 32-byte private key as a seed');
|
||||
if (seed.length !== 32) {
|
||||
throw new Error('Expected valid 32-byte private key as a seed');
|
||||
}
|
||||
|
||||
if (!hasBigInt || (!onlyJs && isReady())) {
|
||||
const full = secp256k1FromSeed(seed);
|
||||
@@ -23,7 +25,9 @@ export function secp256k1PairFromSeed (seed: Uint8Array, onlyJs?: boolean): Keyp
|
||||
// it seems that the lazy static section yields invalid results on the _first_ run.
|
||||
// If this happens, fail outright, we cannot allow invalid return values
|
||||
// https://github.com/polkadot-js/wasm/issues/307
|
||||
assert(!u8aEmpty(publicKey), 'Invalid publicKey generated from WASM interface');
|
||||
if (u8aEmpty(publicKey)) {
|
||||
throw new Error('Invalid publicKey generated from WASM interface');
|
||||
}
|
||||
|
||||
return {
|
||||
publicKey,
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { HashType } from './types';
|
||||
|
||||
import { recoverPublicKey, Signature } from '@noble/secp256k1';
|
||||
|
||||
import { assert, hasBigInt, u8aToU8a } from '@polkadot/util';
|
||||
import { hasBigInt, u8aToU8a } from '@polkadot/util';
|
||||
import { isReady, secp256k1Recover as wasm } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { secp256k1Compress } from './compress';
|
||||
@@ -23,7 +23,9 @@ export function secp256k1Recover (msgHash: HexString | Uint8Array | string, sign
|
||||
? wasm(msg, sig, recovery)
|
||||
: recoverPublicKey(msg, Signature.fromCompact(sig).toRawBytes(), recovery);
|
||||
|
||||
assert(publicKey, 'Unable to recover publicKey from signature');
|
||||
if (!publicKey) {
|
||||
throw new Error('Unable to recover publicKey from signature');
|
||||
}
|
||||
|
||||
return hashType === 'keccak'
|
||||
? secp256k1Expand(publicKey, onlyJs)
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { HashType } from './types';
|
||||
|
||||
import { Signature, signSync } from '@noble/secp256k1';
|
||||
|
||||
import { assert, bnToU8a, hasBigInt, u8aConcat } from '@polkadot/util';
|
||||
import { bnToU8a, hasBigInt, u8aConcat } from '@polkadot/util';
|
||||
import { isReady, secp256k1Sign as wasm } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { BN_BE_256_OPTS } from '../bn';
|
||||
@@ -17,7 +17,9 @@ import { hasher } from './hasher';
|
||||
* @description Returns message signature of `message`, using the supplied pair
|
||||
*/
|
||||
export function secp256k1Sign (message: Uint8Array | string, { secretKey }: Partial<Keypair>, hashType: HashType = 'blake2', onlyJs?: boolean): Uint8Array {
|
||||
assert(secretKey?.length === 32, 'Expected valid secp256k1 secretKey, 32-bytes');
|
||||
if (secretKey?.length !== 32) {
|
||||
throw new Error('Expected valid secp256k1 secretKey, 32-bytes');
|
||||
}
|
||||
|
||||
const data = hasher(hashType, message, onlyJs);
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { _0n, assert, BN, bnToU8a, hasBigInt, isU8a, nToU8a, u8aToBigInt } from '@polkadot/util';
|
||||
import { _0n, BN, bnToU8a, hasBigInt, isU8a, nToU8a, u8aToBigInt } from '@polkadot/util';
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
import { BN_BE_256_OPTS, BN_BE_OPTS } from '../bn';
|
||||
@@ -15,7 +15,9 @@ const N_BN = new BN(N, 'hex');
|
||||
function addBi (seckey: Uint8Array, tweak: Uint8Array): Uint8Array {
|
||||
let res = u8aToBigInt(tweak, BN_BE_OPTS);
|
||||
|
||||
assert(res < N_BI, 'Tweak parameter is out of range');
|
||||
if (res >= N_BI) {
|
||||
throw new Error('Tweak parameter is out of range');
|
||||
}
|
||||
|
||||
res += u8aToBigInt(seckey, BN_BE_OPTS);
|
||||
|
||||
@@ -23,7 +25,9 @@ function addBi (seckey: Uint8Array, tweak: Uint8Array): Uint8Array {
|
||||
res -= N_BI;
|
||||
}
|
||||
|
||||
assert(res !== _0n, 'Invalid resulting private key');
|
||||
if (res === _0n) {
|
||||
throw new Error('Invalid resulting private key');
|
||||
}
|
||||
|
||||
return nToU8a(res, BN_BE_256_OPTS);
|
||||
}
|
||||
@@ -31,7 +35,9 @@ function addBi (seckey: Uint8Array, tweak: Uint8Array): Uint8Array {
|
||||
function addBn (seckey: Uint8Array, tweak: Uint8Array): Uint8Array {
|
||||
const res = new BN(tweak);
|
||||
|
||||
assert(res.cmp(N_BN) < 0, 'Tweak parameter is out of range');
|
||||
if (res.cmp(N_BN) >= 0) {
|
||||
throw new Error('Tweak parameter is out of range');
|
||||
}
|
||||
|
||||
res.iadd(new BN(seckey));
|
||||
|
||||
@@ -39,14 +45,19 @@ function addBn (seckey: Uint8Array, tweak: Uint8Array): Uint8Array {
|
||||
res.isub(N_BN);
|
||||
}
|
||||
|
||||
assert(!res.isZero(), 'Invalid resulting private key');
|
||||
if (res.isZero()) {
|
||||
throw new Error('Invalid resulting private key');
|
||||
}
|
||||
|
||||
return bnToU8a(res, BN_BE_256_OPTS);
|
||||
}
|
||||
|
||||
export function secp256k1PrivateKeyTweakAdd (seckey: Uint8Array, tweak: Uint8Array, onlyBn?: boolean): Uint8Array {
|
||||
assert(isU8a(seckey) && seckey.length === 32, 'Expected seckey to be an Uint8Array with length 32');
|
||||
assert(isU8a(tweak) && tweak.length === 32, 'Expected tweak to be an Uint8Array with length 32');
|
||||
if (!isU8a(seckey) || seckey.length !== 32) {
|
||||
throw new Error('Expected seckey to be an Uint8Array with length 32');
|
||||
} else if (!isU8a(tweak) || tweak.length !== 32) {
|
||||
throw new Error('Expected tweak to be an Uint8Array with length 32');
|
||||
}
|
||||
|
||||
return !hasBigInt || onlyBn
|
||||
? addBn(seckey, tweak)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { HashType } from './types';
|
||||
|
||||
import { assert, u8aEq, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aEq, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { hasher } from './hasher';
|
||||
import { secp256k1Recover } from './recover';
|
||||
@@ -16,7 +16,9 @@ import { secp256k1Recover } from './recover';
|
||||
export function secp256k1Verify (msgHash: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, address: HexString | Uint8Array | string, hashType: HashType = 'blake2', onlyJs?: boolean): boolean {
|
||||
const sig = u8aToU8a(signature);
|
||||
|
||||
assert(sig.length === 65, `Expected signature with 65 bytes, ${sig.length} found instead`);
|
||||
if (sig.length !== 65) {
|
||||
throw new Error(`Expected signature with 65 bytes, ${sig.length} found instead`);
|
||||
}
|
||||
|
||||
const publicKey = secp256k1Recover(hasher(hashType, msgHash), sig, sig[64], hashType, onlyJs);
|
||||
const signerAddr = hasher(hashType, publicKey, onlyJs);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { KeypairType, VerifyResult } from '../types';
|
||||
|
||||
import { assert, u8aIsWrapped, u8aToU8a, u8aUnwrapBytes, u8aWrapBytes } from '@polkadot/util';
|
||||
import { u8aIsWrapped, u8aToU8a, u8aUnwrapBytes, u8aWrapBytes } from '@polkadot/util';
|
||||
|
||||
import { decodeAddress } from '../address/decode';
|
||||
import { ed25519Verify } from '../ed25519/verify';
|
||||
@@ -57,7 +57,9 @@ function verifyDetect (result: VerifyResult, { message, publicKey, signature }:
|
||||
}
|
||||
|
||||
function verifyMultisig (result: VerifyResult, { message, publicKey, signature }: VerifyInput): VerifyResult {
|
||||
assert([0, 1, 2].includes(signature[0]), () => `Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
|
||||
if (![0, 1, 2].includes(signature[0])) {
|
||||
throw new Error(`Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
|
||||
}
|
||||
|
||||
const type = CRYPTO_TYPES[signature[0]] || 'none';
|
||||
|
||||
@@ -88,7 +90,9 @@ function getVerifyFn (signature: Uint8Array): VerifyFn {
|
||||
export function signatureVerify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, addressOrPublicKey: HexString | Uint8Array | string): VerifyResult {
|
||||
const signatureU8a = u8aToU8a(signature);
|
||||
|
||||
assert([64, 65, 66].includes(signatureU8a.length), () => `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
|
||||
if (![64, 65, 66].includes(signatureU8a.length)) {
|
||||
throw new Error(`Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
|
||||
}
|
||||
|
||||
const publicKey = decodeAddress(addressOrPublicKey);
|
||||
const input = { message: u8aToU8a(message), publicKey, signature: signatureU8a };
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { sr25519Agree } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -14,8 +14,11 @@ export function sr25519Agreement (secretKey: HexString | Uint8Array | string, pu
|
||||
const secretKeyU8a = u8aToU8a(secretKey);
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
assert(secretKeyU8a.length === 64, () => `Invalid secretKey, received ${secretKeyU8a.length} bytes, expected 64`);
|
||||
if (publicKeyU8a.length !== 32) {
|
||||
throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
} else if (secretKeyU8a.length !== 64) {
|
||||
throw new Error(`Invalid secretKey, received ${secretKeyU8a.length} bytes, expected 64`);
|
||||
}
|
||||
|
||||
return sr25519Agree(publicKeyU8a, secretKeyU8a);
|
||||
}
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
|
||||
import type { Keypair } from '../types';
|
||||
|
||||
import { assert, isU8a } from '@polkadot/util';
|
||||
import { isU8a } from '@polkadot/util';
|
||||
|
||||
import { sr25519PairFromU8a } from './pair/fromU8a';
|
||||
import { sr25519KeypairToU8a } from './pair/toU8a';
|
||||
|
||||
export function createDeriveFn (derive: (pair: Uint8Array, cc: Uint8Array) => Uint8Array): (keypair: Keypair, chainCode: Uint8Array) => Keypair {
|
||||
return (keypair: Keypair, chainCode: Uint8Array): Keypair => {
|
||||
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
|
||||
if (!isU8a(chainCode) || chainCode.length !== 32) {
|
||||
throw new Error('Invalid chainCode passed to derive');
|
||||
}
|
||||
|
||||
return sr25519PairFromU8a(
|
||||
derive(sr25519KeypairToU8a(keypair), chainCode)
|
||||
|
||||
@@ -3,14 +3,17 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { assert, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
import { isU8a, u8aToU8a } from '@polkadot/util';
|
||||
import { sr25519DerivePublicSoft } from '@polkadot/wasm-crypto';
|
||||
|
||||
export function sr25519DerivePublic (publicKey: HexString | Uint8Array | string, chainCode: Uint8Array): Uint8Array {
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
|
||||
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
if (!isU8a(chainCode) || chainCode.length !== 32) {
|
||||
throw new Error('Invalid chainCode passed to derive');
|
||||
} else if (publicKeyU8a.length !== 32) {
|
||||
throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
}
|
||||
|
||||
return sr25519DerivePublicSoft(publicKeyU8a, chainCode);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { sr25519KeypairFromSeed } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { sr25519PairFromU8a } from './fromU8a';
|
||||
@@ -16,7 +16,9 @@ import { sr25519PairFromU8a } from './fromU8a';
|
||||
export function sr25519PairFromSeed (seed: HexString | Uint8Array | string): Keypair {
|
||||
const seedU8a = u8aToU8a(seed);
|
||||
|
||||
assert(seedU8a.length === 32, () => `Expected a seed matching 32 bytes, found ${seedU8a.length}`);
|
||||
if (seedU8a.length !== 32) {
|
||||
throw new Error(`Expected a seed matching 32 bytes, found ${seedU8a.length}`);
|
||||
}
|
||||
|
||||
return sr25519PairFromU8a(
|
||||
sr25519KeypairFromSeed(seedU8a)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
|
||||
const SEC_LEN = 64;
|
||||
const PUB_LEN = 32;
|
||||
@@ -13,7 +13,9 @@ const TOT_LEN = SEC_LEN + PUB_LEN;
|
||||
export function sr25519PairFromU8a (full: HexString | Uint8Array | string): Keypair {
|
||||
const fullU8a = u8aToU8a(full);
|
||||
|
||||
assert(fullU8a.length === TOT_LEN, () => `Expected keypair with ${TOT_LEN} bytes, found ${fullU8a.length}`);
|
||||
if (fullU8a.length !== TOT_LEN) {
|
||||
throw new Error(`Expected keypair with ${TOT_LEN} bytes, found ${fullU8a.length}`);
|
||||
}
|
||||
|
||||
return {
|
||||
publicKey: fullU8a.slice(SEC_LEN, TOT_LEN),
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Keypair } from '../types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { sr25519Sign as wasmSign } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -12,8 +12,11 @@ import { sr25519Sign as wasmSign } from '@polkadot/wasm-crypto';
|
||||
* @description Returns message signature of `message`, using the supplied pair
|
||||
*/
|
||||
export function sr25519Sign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial<Keypair>): Uint8Array {
|
||||
assert(publicKey?.length === 32, 'Expected a valid publicKey, 32-bytes');
|
||||
assert(secretKey?.length === 64, 'Expected a valid secretKey, 64-bytes');
|
||||
if (publicKey?.length !== 32) {
|
||||
throw new Error('Expected a valid publicKey, 32-bytes');
|
||||
} else if (secretKey?.length !== 64) {
|
||||
throw new Error('Expected a valid secretKey, 64-bytes');
|
||||
}
|
||||
|
||||
return wasmSign(publicKey, secretKey, u8aToU8a(message));
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { sr25519Verify as wasmVerify } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -14,8 +14,11 @@ export function sr25519Verify (message: HexString | Uint8Array | string, signatu
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
const signatureU8a = u8aToU8a(signature);
|
||||
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
if (publicKeyU8a.length !== 32) {
|
||||
throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
} else if (signatureU8a.length !== 64) {
|
||||
throw new Error(`Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
}
|
||||
|
||||
return wasmVerify(signatureU8a, u8aToU8a(message), publicKeyU8a);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Keypair } from '../types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { vrfSign } from '@polkadot/wasm-crypto';
|
||||
|
||||
const EMPTY_U8A = new Uint8Array();
|
||||
@@ -14,7 +14,9 @@ const EMPTY_U8A = new Uint8Array();
|
||||
* @description Sign with sr25519 vrf signing (deterministic)
|
||||
*/
|
||||
export function sr25519VrfSign (message: HexString | Uint8Array | string, { secretKey }: Partial<Keypair>, context: HexString | string | Uint8Array = EMPTY_U8A, extra: HexString | string | Uint8Array = EMPTY_U8A): Uint8Array {
|
||||
assert(secretKey?.length === 64, 'Invalid secretKey, expected 64-bytes');
|
||||
if (secretKey?.length !== 64) {
|
||||
throw new Error('Invalid secretKey, expected 64-bytes');
|
||||
}
|
||||
|
||||
return vrfSign(secretKey, u8aToU8a(context), u8aToU8a(message), u8aToU8a(extra));
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { vrfVerify } from '@polkadot/wasm-crypto';
|
||||
|
||||
const EMPTY_U8A = new Uint8Array();
|
||||
@@ -16,8 +16,11 @@ export function sr25519VrfVerify (message: HexString | Uint8Array | string, sign
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
const proofU8a = u8aToU8a(signOutput);
|
||||
|
||||
assert(publicKeyU8a.length === 32, 'Invalid publicKey, expected 32-bytes');
|
||||
assert(proofU8a.length === 96, 'Invalid vrfSign output, expected 96 bytes');
|
||||
if (publicKeyU8a.length !== 32) {
|
||||
throw new Error('Invalid publicKey, expected 32-bytes');
|
||||
} else if (proofU8a.length !== 96) {
|
||||
throw new Error('Invalid vrfSign output, expected 96 bytes');
|
||||
}
|
||||
|
||||
return vrfVerify(publicKeyU8a, u8aToU8a(context), u8aToU8a(message), u8aToU8a(extra), proofU8a);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { arrayRange } from '@polkadot/util';
|
||||
import { performance, performanceCmp } from '@polkadot/util/test/performance';
|
||||
import { perf, perfCmp } from '@polkadot/util/test/performance';
|
||||
|
||||
import { randomAsU8a } from '..';
|
||||
|
||||
@@ -11,7 +11,7 @@ type ExecFn = (input: Uint8Array, onlyJs: boolean) => unknown;
|
||||
const GENERATED = arrayRange(256).map(() => [randomAsU8a()]);
|
||||
|
||||
export function performanceWasm (name: string, count: number, exec: ExecFn, inputs = GENERATED): void {
|
||||
performanceCmp(name, ['WebAssembly', 'JavaScript'], count, inputs, exec);
|
||||
perfCmp(name, ['WebAssembly', 'JavaScript'], count, inputs, exec);
|
||||
}
|
||||
|
||||
export { performance, performanceCmp };
|
||||
export { perf, perfCmp };
|
||||
|
||||
@@ -9,8 +9,6 @@ import { isReady, twox } from '@polkadot/wasm-crypto';
|
||||
import { createAsHex } from '../helpers';
|
||||
import { xxhash64 } from './xxhash64';
|
||||
|
||||
type BitLength = 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512;
|
||||
|
||||
/**
|
||||
* @name xxhashAsU8a
|
||||
* @summary Creates a xxhash64 u8a from the input.
|
||||
@@ -25,7 +23,7 @@ type BitLength = 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512;
|
||||
* xxhashAsU8a('abc'); // => 0x44bc2cf5ad770999
|
||||
* ```
|
||||
*/
|
||||
export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bitLength: BitLength = 64, onlyJs?: boolean): Uint8Array {
|
||||
export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bitLength: 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512 = 64, onlyJs?: boolean): Uint8Array {
|
||||
const rounds = Math.ceil(bitLength / 64);
|
||||
const u8a = u8aToU8a(data);
|
||||
|
||||
|
||||
+10
-11
@@ -9,13 +9,13 @@
|
||||
"exports": {
|
||||
"./hex/toU8a": {
|
||||
"node": {
|
||||
"require": "./hex/toU8aBuffer.cjs",
|
||||
"require": "./cjs/hex/toU8aBuffer.js",
|
||||
"default": "./hex/toU8aBuffer.js"
|
||||
}
|
||||
},
|
||||
"./u8a/toHex": {
|
||||
"node": {
|
||||
"require": "./u8a/toHexBuffer.cjs",
|
||||
"require": "./cjs/u8a/toHexBuffer.js",
|
||||
"default": "./u8a/toHexBuffer.js"
|
||||
}
|
||||
}
|
||||
@@ -34,19 +34,18 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.2.1",
|
||||
"version": "10.1.1",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.9",
|
||||
"@polkadot/x-bigint": "9.2.1",
|
||||
"@polkadot/x-global": "9.2.1",
|
||||
"@polkadot/x-textdecoder": "9.2.1",
|
||||
"@polkadot/x-textencoder": "9.2.1",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-bigint": "10.1.1",
|
||||
"@polkadot/x-global": "10.1.1",
|
||||
"@polkadot/x-textdecoder": "10.1.1",
|
||||
"@polkadot/x-textencoder": "10.1.1",
|
||||
"@types/bn.js": "^5.1.0",
|
||||
"bn.js": "^5.2.0",
|
||||
"ip-regex": "^4.3.0"
|
||||
"bn.js": "^5.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/x-randomvalues": "9.2.1"
|
||||
"@polkadot/x-randomvalues": "10.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { arrayChunk } from '.';
|
||||
import { perf } from '../test/performance';
|
||||
import { arrayChunk, arrayRange } from '.';
|
||||
|
||||
describe('arrayChunk', (): void => {
|
||||
it('chunks arrays', (): void => {
|
||||
@@ -9,4 +10,6 @@ describe('arrayChunk', (): void => {
|
||||
arrayChunk([1, 2, 3, 4, 5, 6, 7], 3)
|
||||
).toEqual([[1, 2, 3], [4, 5, 6], [7]]);
|
||||
});
|
||||
|
||||
perf('arrayChunk', 200_000, [[arrayRange(500), 50]], arrayChunk);
|
||||
});
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
*/
|
||||
export function arrayChunk <T> (array: T[], chunkSize: number): T[][] {
|
||||
const outputSize = Math.ceil(array.length / chunkSize);
|
||||
|
||||
// noop for the single-split case
|
||||
if (outputSize === 1) {
|
||||
return [array];
|
||||
}
|
||||
|
||||
const output = Array<T[]>(outputSize);
|
||||
|
||||
for (let i = 0; i < outputSize; i++) {
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isNull } from '../is/null';
|
||||
import { isUndefined } from '../is/undefined';
|
||||
|
||||
/**
|
||||
* @name arrayFilter
|
||||
* @summary Filters undefined and (optionally) null values from an array
|
||||
@@ -19,10 +16,9 @@ import { isUndefined } from '../is/undefined';
|
||||
* arrayFilter([0, void 0, true, null, false, ''], false); // [0, true, false, '']
|
||||
* ```
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function arrayFilter <T = any> (array: T[], allowNulls = true): T[] {
|
||||
return array.filter((v) =>
|
||||
!isUndefined(v) &&
|
||||
(allowNulls || !isNull(v))
|
||||
export function arrayFilter <T = unknown> (array: readonly (T | null | undefined)[], allowNulls = true): T[] {
|
||||
return array.filter((v): v is T =>
|
||||
v !== undefined &&
|
||||
(allowNulls || v !== null)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,12 @@
|
||||
* arrayFlatten([[1, 2], [3, 4], [5]]); // [1, 2, 3, 4, 5]
|
||||
* ```
|
||||
*/
|
||||
export function arrayFlatten <T> (arrays: T[][]): T[] {
|
||||
export function arrayFlatten <T> (arrays: readonly T[][]): T[] {
|
||||
// noop for the single-entry case
|
||||
if (arrays.length === 1) {
|
||||
return arrays[0];
|
||||
}
|
||||
|
||||
// pre-allocate based on the combined size
|
||||
let size = 0;
|
||||
|
||||
|
||||
@@ -10,4 +10,5 @@ export { arrayFilter } from './filter';
|
||||
export { arrayFlatten } from './flatten';
|
||||
export { arrayRange } from './range';
|
||||
export { arrayShuffle } from './shuffle';
|
||||
export { arrayUnzip } from './unzip';
|
||||
export { arrayZip } from './zip';
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '../assert';
|
||||
|
||||
/**
|
||||
* @name arrayRange
|
||||
* @summary Returns a range of numbers ith the size and the specified offset
|
||||
@@ -19,7 +17,9 @@ import { assert } from '../assert';
|
||||
* ```
|
||||
*/
|
||||
export function arrayRange (size: number, startAt = 0): number[] {
|
||||
assert(size > 0, 'Expected non-zero, positive number as a range size');
|
||||
if (size <= 0) {
|
||||
throw new Error('Expected non-zero, positive number as a range size');
|
||||
}
|
||||
|
||||
const result = new Array<number>(size);
|
||||
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { perf } from '../test/performance';
|
||||
import { arrayRange, arrayShuffle } from '.';
|
||||
|
||||
const ptest = arrayRange(16284);
|
||||
|
||||
describe('arrayShuffle', (): void => {
|
||||
it('returns an empty array as-is', (): void => {
|
||||
expect(
|
||||
@@ -28,4 +31,6 @@ describe('arrayShuffle', (): void => {
|
||||
JSON.stringify(inp)
|
||||
).not.toEqual(JSON.stringify(out));
|
||||
});
|
||||
|
||||
perf('arrayShuffle', 1000, [[ptest]], arrayShuffle);
|
||||
});
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export function arrayShuffle <T> (input: T[]): T[] {
|
||||
/**
|
||||
* @name arrayShuffle
|
||||
* @description Shuffles the input array (unlike sort, this is not done in-place)
|
||||
*/
|
||||
export function arrayShuffle <T> (input: readonly T[]): T[] {
|
||||
const result = input.slice();
|
||||
let curr = result.length;
|
||||
|
||||
// noop for the single entry
|
||||
if (curr === 1) {
|
||||
return result;
|
||||
}
|
||||
|
||||
while (curr !== 0) {
|
||||
const rand = Math.floor(Math.random() * curr);
|
||||
// ~~ is more performant than Math.floor
|
||||
const rand = ~~(Math.random() * curr);
|
||||
|
||||
curr--;
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { arrayUnzip } from '.';
|
||||
|
||||
describe('arrayUnzip', (): void => {
|
||||
it('unzips entries', (): void => {
|
||||
expect(
|
||||
arrayUnzip([['a', 1], ['b', 2], ['c', 3]])
|
||||
).toEqual([['a', 'b', 'c'], [1, 2, 3]]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,17 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* @name arrayUnzip
|
||||
* @description Splits a single [K, V][] into [K[], V[]]
|
||||
*/
|
||||
export function arrayUnzip <K, V> (entries: readonly [K, V][]): [K[], V[]] {
|
||||
const keys = new Array<K>(entries.length);
|
||||
const values = new Array<V>(entries.length);
|
||||
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
[keys[i], values[i]] = entries[i];
|
||||
}
|
||||
|
||||
return [keys, values];
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export function arrayZip <K, V> (keys: K[], values: V[]): [K, V][] {
|
||||
/**
|
||||
* @name arrayZip
|
||||
* @description Combines 2 distinct key/value arrays into a single [K, V] array
|
||||
*/
|
||||
export function arrayZip <K, V> (keys: readonly K[], values: readonly V[]): [K, V][] {
|
||||
const result = new Array<[K, V]>(keys.length);
|
||||
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isFunction } from './is/function';
|
||||
import { isNull } from './is/null';
|
||||
import { isUndefined } from './is/undefined';
|
||||
|
||||
type MessageFn = () => string;
|
||||
|
||||
@@ -38,7 +36,7 @@ export function assert (condition: unknown, message: string | MessageFn): assert
|
||||
* @description Returns when the value is not undefined/null, otherwise throws assertion error
|
||||
*/
|
||||
export function assertReturn <T> (value: T | undefined | null, message: string | MessageFn): T {
|
||||
assert(!isUndefined(value) && !isNull(value), message);
|
||||
assert(value !== undefined && value !== null, message);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/** @internal */
|
||||
export function createCmp <T> (cmp: (a: T, b: T) => boolean): (...items: T[]) => T {
|
||||
return (...items: T[]): T => {
|
||||
if (items.length === 0) {
|
||||
throw new Error('Must provide one or more arguments');
|
||||
}
|
||||
|
||||
let result = items[0];
|
||||
|
||||
for (let i = 1; i < items.length; i++) {
|
||||
if (cmp(items[i], result)) {
|
||||
result = items[i];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
@@ -25,6 +25,6 @@ describe('nMax', (): void => {
|
||||
it('fails when no items are available', (): void => {
|
||||
expect(
|
||||
() => nMax()
|
||||
).toThrow(/Must provide one or more bigint arguments/);
|
||||
).toThrow(/Must provide one or more arguments/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -19,6 +19,6 @@ describe('nMin', (): void => {
|
||||
it('fails when no items are available', (): void => {
|
||||
expect(
|
||||
() => nMin()
|
||||
).toThrow(/Must provide one or more bigint arguments/);
|
||||
).toThrow(/Must provide one or more arguments/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,42 +1,16 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '../assert';
|
||||
|
||||
function gt (a: bigint, b: bigint): boolean {
|
||||
return a > b;
|
||||
}
|
||||
|
||||
function lt (a: bigint, b: bigint): boolean {
|
||||
return a < b;
|
||||
}
|
||||
|
||||
function find (items: bigint[], cmp: (a: bigint, b: bigint) => boolean): bigint {
|
||||
assert(items.length >= 1, 'Must provide one or more bigint arguments');
|
||||
|
||||
let result = items[0];
|
||||
|
||||
for (let i = 1; i < items.length; i++) {
|
||||
if (cmp(items[i], result)) {
|
||||
result = items[i];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
import { createCmp } from './helpers';
|
||||
|
||||
/**
|
||||
* @name nMax
|
||||
* @summary Finds and returns the highest value in an array of bigint.
|
||||
*/
|
||||
export function nMax (...items: bigint[]): bigint {
|
||||
return find(items, gt);
|
||||
}
|
||||
export const nMax = createCmp<bigint>((a, b) => a > b);
|
||||
|
||||
/**
|
||||
* @name nMin
|
||||
* @summary Finds and returns the lowest value in an array of bigint.
|
||||
*/
|
||||
export function nMin (...items: bigint[]): bigint {
|
||||
return find(items, lt);
|
||||
}
|
||||
export const nMin = createCmp<bigint>((a, b) => a < b);
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { BN } from '../bn';
|
||||
import { SQRT_MAX_SAFE_INTEGER } from './sqrt';
|
||||
import { nSqrt } from '.';
|
||||
|
||||
const TESTS: [string | number | BN | bigint, string | number][] = [
|
||||
export const SQRT_TESTS: [string | number | BN | bigint, string | number][] = [
|
||||
[0, 0],
|
||||
[1, 1],
|
||||
[4, 2],
|
||||
@@ -34,9 +35,21 @@ describe('nSqrt', (): void => {
|
||||
).toThrow(/negative numbers is not supported/);
|
||||
});
|
||||
|
||||
TESTS.forEach(([value, expected], index): void => {
|
||||
it('has the correct constant for sqrt(Number.MAX_SAFE_INTEGER)', (): void => {
|
||||
expect(
|
||||
BigInt(
|
||||
~~Math.sqrt(
|
||||
Number.MAX_SAFE_INTEGER
|
||||
)
|
||||
) === SQRT_MAX_SAFE_INTEGER
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
SQRT_TESTS.forEach(([value, expected], index): void => {
|
||||
it(`calcs for test #${index}`, (): void => {
|
||||
expect(nSqrt(value) === BigInt(expected)).toEqual(true);
|
||||
expect(
|
||||
nSqrt(value) === BigInt(expected)
|
||||
).toEqual(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -6,11 +6,11 @@ import type { ToBigInt, ToBn } from '../types';
|
||||
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
import { assert } from '../assert';
|
||||
import { _0n, _1n, _2pow53n } from './consts';
|
||||
import { nToBigInt } from './toBigInt';
|
||||
|
||||
const _sqrt2pow53n = BigInt(94906265);
|
||||
/** @internal */
|
||||
export const SQRT_MAX_SAFE_INTEGER = BigInt(94906265);
|
||||
|
||||
/**
|
||||
* @name nSqrt
|
||||
@@ -19,17 +19,20 @@ const _sqrt2pow53n = BigInt(94906265);
|
||||
export function nSqrt <ExtToBn extends ToBn | ToBigInt> (value: ExtToBn | BN | bigint | string | number | null): bigint {
|
||||
const n = nToBigInt(value);
|
||||
|
||||
assert(n >= _0n, 'square root of negative numbers is not supported');
|
||||
if (n < _0n) {
|
||||
throw new Error('square root of negative numbers is not supported');
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/53683995/javascript-big-integer-square-root/
|
||||
// shortcut <= 2^53 - 1 to use the JS utils
|
||||
if (n <= _2pow53n) {
|
||||
return BigInt(Math.floor(Math.sqrt(Number(n))));
|
||||
// ~~ is more performant that Math.floor
|
||||
return BigInt(~~Math.sqrt(Number(n)));
|
||||
}
|
||||
|
||||
// Use sqrt(MAX_SAFE_INTEGER) as starting point. since we already know the
|
||||
// output will be larger than this, we expect this to be a safe start
|
||||
let x0 = _sqrt2pow53n;
|
||||
let x0 = SQRT_MAX_SAFE_INTEGER;
|
||||
|
||||
while (true) {
|
||||
const x1 = ((n / x0) + x0) >> _1n;
|
||||
|
||||
@@ -4,24 +4,18 @@
|
||||
import type { BN } from '../bn/bn';
|
||||
import type { HexString, NumberOptions, ToBigInt, ToBn } from '../types';
|
||||
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { u8aToHex } from '../u8a';
|
||||
import { nToU8a } from './toU8a';
|
||||
|
||||
/** @internal */
|
||||
const ZERO_STR = '0x00';
|
||||
|
||||
/**
|
||||
* @name nToHex
|
||||
* @summary Creates a hex value from a bigint object.
|
||||
*/
|
||||
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): HexString {
|
||||
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, { bitLength, isLe = false, isNegative = false }: NumberOptions = {}): HexString {
|
||||
return !value
|
||||
? ZERO_STR
|
||||
: u8aToHex(
|
||||
nToU8a(value, objectSpread(
|
||||
// We spread here, the default for hex values is BE (JSONRPC via substrate)
|
||||
{ isLe: false, isNegative: false },
|
||||
options
|
||||
))
|
||||
);
|
||||
: u8aToHex(nToU8a(value, { bitLength, isLe, isNegative }));
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { arrayRange } from '../array';
|
||||
import { performance } from '../test/performance';
|
||||
import { perf } from '../test/performance';
|
||||
import { nToU8a } from '.';
|
||||
|
||||
const ptest = arrayRange(65536).map((v) => [v]);
|
||||
@@ -56,5 +56,5 @@ describe('nToU8a', (): void => {
|
||||
).toEqual(new Uint8Array([46, 251, 255, 255]));
|
||||
});
|
||||
|
||||
performance('nToU8a', 250000, ptest, nToU8a);
|
||||
perf('nToU8a', 250000, ptest, nToU8a);
|
||||
});
|
||||
|
||||
@@ -6,14 +6,13 @@ import type { NumberOptions, ToBigInt, ToBn } from '../types';
|
||||
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { _0n, _1n } from './consts';
|
||||
import { nToBigInt } from './toBigInt';
|
||||
|
||||
const DIV = BigInt(256);
|
||||
const NEG_MASK = BigInt(0xff);
|
||||
|
||||
function toU8a (value: bigint, { isLe, isNegative }: NumberOptions): Uint8Array {
|
||||
function toU8a (value: bigint, isLe: boolean, isNegative: boolean): Uint8Array {
|
||||
const arr: number[] = [];
|
||||
|
||||
if (isNegative) {
|
||||
@@ -44,34 +43,29 @@ function toU8a (value: bigint, { isLe, isNegative }: NumberOptions): Uint8Array
|
||||
* @name nToU8a
|
||||
* @summary Creates a Uint8Array object from a bigint.
|
||||
*/
|
||||
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): Uint8Array {
|
||||
const opts: NumberOptions = objectSpread(
|
||||
{ bitLength: -1, isLe: true, isNegative: false },
|
||||
options
|
||||
);
|
||||
|
||||
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, { bitLength = -1, isLe = true, isNegative = false }: NumberOptions = {}): Uint8Array {
|
||||
const valueBi = nToBigInt(value);
|
||||
|
||||
if (valueBi === _0n) {
|
||||
return opts.bitLength === -1
|
||||
return bitLength === -1
|
||||
? new Uint8Array()
|
||||
: new Uint8Array(Math.ceil((opts.bitLength || 0) / 8));
|
||||
: new Uint8Array(Math.ceil((bitLength || 0) / 8));
|
||||
}
|
||||
|
||||
const u8a = toU8a(valueBi, opts);
|
||||
const u8a = toU8a(valueBi, isLe, isNegative);
|
||||
|
||||
if (opts.bitLength === -1) {
|
||||
if (bitLength === -1) {
|
||||
return u8a;
|
||||
}
|
||||
|
||||
const byteLength = Math.ceil((opts.bitLength || 0) / 8);
|
||||
const byteLength = Math.ceil((bitLength || 0) / 8);
|
||||
const output = new Uint8Array(byteLength);
|
||||
|
||||
if (opts.isNegative) {
|
||||
if (isNegative) {
|
||||
output.fill(0xff);
|
||||
}
|
||||
|
||||
output.set(u8a, opts.isLe ? 0 : byteLength - u8a.length);
|
||||
output.set(u8a, isLe ? 0 : byteLength - u8a.length);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -25,6 +25,6 @@ describe('bnMax', (): void => {
|
||||
it('fails when no items are available', (): void => {
|
||||
expect(
|
||||
() => bnMax()
|
||||
).toThrow(/Must provide one or more BN arguments/);
|
||||
).toThrow(/Must provide one or more arguments/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -15,4 +15,10 @@ describe('bnMin', (): void => {
|
||||
bnMin(new BN(1))
|
||||
).toEqual(new BN(1));
|
||||
});
|
||||
|
||||
it('fails when no items are available', (): void => {
|
||||
expect(
|
||||
() => bnMin()
|
||||
).toThrow(/Must provide one or more arguments/);
|
||||
});
|
||||
});
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user