Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bff05aad32 | ||
|
|
0f98c1ac22 | ||
|
|
f72d9a2a26 | ||
|
|
1d0558a537 | ||
|
|
94e7c05573 | ||
|
|
12601805b1 | ||
|
|
9194f417fe | ||
|
|
6a3118e66c | ||
|
|
4ccad202c5 | ||
|
|
96a019f6eb | ||
|
|
bad6a1b991 | ||
|
|
d83e50ee19 | ||
|
|
feae08fc0f | ||
|
|
fdd32df12f | ||
|
|
17a9b653ac | ||
|
|
6154454c38 | ||
|
|
ac0ec5be55 | ||
|
|
3802426046 | ||
|
|
d91b27b180 | ||
|
|
1f9a1a5f8a | ||
|
|
6b3edffe55 | ||
|
|
7d46eb8423 | ||
|
|
a7eb0ed319 | ||
|
|
227a34d55d | ||
|
|
8a29dc2b57 | ||
|
|
88d1a71df8 | ||
|
|
6f53068297 | ||
|
|
5bf71dab41 | ||
|
|
b6f3dfb2ca | ||
|
|
4d3a2d9610 | ||
|
|
7eaf013572 | ||
|
|
c673b96963 | ||
|
|
c57eee5027 | ||
|
|
9efd2db377 | ||
|
|
c90246ec0b | ||
|
|
fbe1532f62 | ||
|
|
f514402b15 | ||
|
|
5ea6992704 | ||
|
|
7955022ce5 | ||
|
|
000d097de2 | ||
|
|
8a6c8b64df | ||
|
|
306e503d23 | ||
|
|
648019f9d4 | ||
|
|
5e48cfbbaa | ||
|
|
57825fc73b | ||
|
|
19ae016723 | ||
|
|
8d7bed5865 | ||
|
|
e019a3043a | ||
|
|
9dfd013755 | ||
|
|
a5df4ed764 | ||
|
|
a938a9f998 | ||
|
|
1a6f81e2a7 | ||
|
|
6ab85a42bb | ||
|
|
21c9e1aefd | ||
|
|
58f740f3de | ||
|
|
ddc6b83e96 | ||
|
|
285e595930 | ||
|
|
dce16d59e6 | ||
|
|
b8edcb0e65 | ||
|
|
b63607c4a0 | ||
|
|
c56c86432a | ||
|
|
e52fe9a838 | ||
|
|
06dca3d955 | ||
|
|
0908dbb861 | ||
|
|
e97410df52 | ||
|
|
faa6734329 | ||
|
|
f2f25815c1 | ||
|
|
80785babb4 | ||
|
|
59761086d0 | ||
|
|
05c82721e8 | ||
|
|
1b13cf0eea | ||
|
|
e6777ece62 | ||
|
|
7436976598 | ||
|
|
699ef952c3 | ||
|
|
cd9dc35475 | ||
|
|
ee7923c457 | ||
|
|
bd3f51844c | ||
|
|
986dfe5006 | ||
|
|
1eba41b2e6 | ||
|
|
88c2d16951 | ||
|
|
303a57c4b5 | ||
|
|
7bfca0d40f | ||
|
|
916187dbf2 | ||
|
|
cfc598b30f | ||
|
|
67bfe3a52e | ||
|
|
0299cba18e | ||
|
|
182c6770d1 | ||
|
|
c89ec8a964 | ||
|
|
dc63304735 | ||
|
|
9ce825de94 | ||
|
|
3cb41c3b03 | ||
|
|
b1f9c37f6a | ||
|
|
4a69486993 | ||
|
|
3a7ab0454f | ||
|
|
ecfc262bcd | ||
|
|
776a653f42 | ||
|
|
ee99ffdbb4 | ||
|
|
bda848f484 | ||
|
|
82a63887a6 | ||
|
|
50317d7dc3 | ||
|
|
39e6a3c048 | ||
|
|
db93c3076b | ||
|
|
c8f0ad55c4 | ||
|
|
2104c50bd0 | ||
|
|
7e9b2770b6 | ||
|
|
8bf24c2f85 | ||
|
|
60337a3b55 | ||
|
|
f527c80b5c | ||
|
|
bdd2bcf236 | ||
|
|
cf370febf0 | ||
|
|
715ef6e7db | ||
|
|
cc644e85bf | ||
|
|
c7b8d95097 | ||
|
|
42de7cebe1 | ||
|
|
2e520c933a | ||
|
|
5d1dd0dd27 | ||
|
|
154f9f22f1 | ||
|
|
98e398954e | ||
|
|
3643c2e306 | ||
|
|
80195f6d11 | ||
|
|
6bc648bfe0 | ||
|
|
c29b12d3b5 | ||
|
|
8a5b514944 | ||
|
|
64fd66bd2a | ||
|
|
75aa7ba2c7 | ||
|
|
25196c3367 | ||
|
|
eeb68c7e0f | ||
|
|
1604b92771 | ||
|
|
1881b564c5 | ||
|
|
3bd4b56eb0 | ||
|
|
ce46e6da0c | ||
|
|
bd1efcbba0 | ||
|
|
f2e4fa0d34 | ||
|
|
adbf452c8d | ||
|
|
56a5a079dd | ||
|
|
0791b2dc9e | ||
|
|
9821eba11f | ||
|
|
b0b0151071 | ||
|
|
8422e0da66 | ||
|
|
5faa0fd544 | ||
|
|
b16396b9b3 | ||
|
|
f342348ad2 | ||
|
|
a8f13bd387 | ||
|
|
dbb77f35b6 | ||
|
|
c60e35ee9e | ||
|
|
b102d9c2b3 | ||
|
|
0ee4bc81f5 | ||
|
|
b05abf869a | ||
|
|
bc014f11dd | ||
|
|
f1429f10af | ||
|
|
be8cabbd1e | ||
|
|
8d0a0ed2b7 | ||
|
|
39baaa2b6d | ||
|
|
821980f64e | ||
|
|
6688ff0a43 | ||
|
|
ee18b661ad | ||
|
|
9a5998b921 | ||
|
|
f27f705f0c | ||
|
|
5e16b1e84c | ||
|
|
25a53e43fd | ||
|
|
75b60b9999 | ||
|
|
e8813aa110 | ||
|
|
b55cdb25f6 | ||
|
|
05e852337a | ||
|
|
cdd2d9ace5 | ||
|
|
a2d9538b31 | ||
|
|
391ab49b8f | ||
|
|
b390714285 | ||
|
|
277c80eb96 | ||
|
|
28f0040080 | ||
|
|
5f280aabb8 | ||
|
|
39937bed29 | ||
|
|
3519d21d8e | ||
|
|
8b4dc01ae4 | ||
|
|
bb73f7ae41 | ||
|
|
e6a0f1e2fd | ||
|
|
e8af9b5a1e | ||
|
|
1606dfd9ca | ||
|
|
2fcf59eeb0 | ||
|
|
a7606b6514 | ||
|
|
871b20c90a | ||
|
|
5d93642093 | ||
|
|
2b2fefb2bb | ||
|
|
1ede65db38 | ||
|
|
7090c3daec | ||
|
|
c03f53e097 | ||
|
|
2ec02e2580 | ||
|
|
6b4f9b3d2f | ||
|
|
d20c37ddd0 | ||
|
|
23d46b063c | ||
|
|
085862ce79 | ||
|
|
88580b98a6 | ||
|
|
fb8b80afd7 | ||
|
|
d3b5b4ad38 | ||
|
|
049e8dfde8 | ||
|
|
8230e3ceac | ||
|
|
37358d4d05 | ||
|
|
2cf6ffa3b1 | ||
|
|
d7f2a70071 | ||
|
|
eb96e2a7aa | ||
|
|
6965709351 | ||
|
|
1677d3eace | ||
|
|
4d77bf3c5b | ||
|
|
222bb74a81 | ||
|
|
90b4b61852 | ||
|
|
b1e209dfeb | ||
|
|
88beb4d81c | ||
|
|
3b2ecb87e9 | ||
|
|
79a2cd0e8f | ||
|
|
0c2d105f9d | ||
|
|
944d77c5f2 | ||
|
|
0fdf83effe | ||
|
|
66866e1a8e | ||
|
|
9abcc72143 | ||
|
|
6f0aa35098 | ||
|
|
93fb633ea6 | ||
|
|
5524e50baf | ||
|
|
e1354746b1 | ||
|
|
309722f285 | ||
|
|
4efd88869d | ||
|
|
ee0436a612 | ||
|
|
b4ca8219d9 | ||
|
|
d30a3ddedb | ||
|
|
fa5b5bca7e | ||
|
|
87afdb1d86 | ||
|
|
23f68c63f4 | ||
|
|
184dbccf39 | ||
|
|
06c06a8b73 | ||
|
|
82f5fec822 | ||
|
|
a953b3a78a | ||
|
|
19283b3c28 | ||
|
|
ac06f38118 | ||
|
|
f9e5c033ab | ||
|
|
de7817e6b5 | ||
|
|
5972551313 | ||
|
|
cf0aab479a | ||
|
|
5ab0b173b6 | ||
|
|
cf990dd4ec | ||
|
|
8a6fd0812a | ||
|
|
e93f8d7418 | ||
|
|
36f6407796 | ||
|
|
8ede488aec | ||
|
|
eb9d5b9585 | ||
|
|
20821aad40 | ||
|
|
23fa2b90a8 | ||
|
|
f94a1ea730 | ||
|
|
fc98cd9b45 | ||
|
|
5fdd967666 | ||
|
|
9043f335d4 | ||
|
|
d9231d26aa | ||
|
|
445e0f7ea6 | ||
|
|
ba0a183bd9 | ||
|
|
46beaa1151 | ||
|
|
31d55b218a | ||
|
|
9b30b4b09e | ||
|
|
cc0dd2a2b5 | ||
|
|
31a0a9b9d1 | ||
|
|
9e1e49a1b8 | ||
|
|
313b44388a | ||
|
|
30dd8169bc | ||
|
|
67450bc225 | ||
|
|
e9285e9ccd | ||
|
|
2a45652ce0 | ||
|
|
6d923da266 | ||
|
|
d55b48566b | ||
|
|
3ac567e1c4 | ||
|
|
d19713f548 | ||
|
|
53249f51b8 | ||
|
|
4883106c3d | ||
|
|
b3f60da550 | ||
|
|
644f32dfaa | ||
|
|
bf4c6b497f | ||
|
|
a74ac0a0f9 | ||
|
|
6701f7420f | ||
|
|
8e43a2d105 | ||
|
|
9560301883 | ||
|
|
889bd36432 | ||
|
|
e310a63059 | ||
|
|
98082774f7 | ||
|
|
4d680f4b0c | ||
|
|
ff7c086b5b | ||
|
|
63b38c56ff | ||
|
|
8be38e40a1 | ||
|
|
9eb2f14dee | ||
|
|
733d7c1948 | ||
|
|
08ac55d7cd | ||
|
|
e2f5a85d14 | ||
|
|
77289d0ec0 | ||
|
|
29406a0010 | ||
|
|
006d55f5c1 | ||
|
|
650a3ca4a8 |
+9
-1
@@ -17,4 +17,12 @@
|
||||
|
||||
7.0.2
|
||||
7.0.3
|
||||
7.1.2
|
||||
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
|
||||
@@ -1,5 +1,21 @@
|
||||
checks:
|
||||
argument-count:
|
||||
config:
|
||||
threshold: 5
|
||||
method-complexity:
|
||||
config:
|
||||
threshold: 7
|
||||
method-count:
|
||||
config:
|
||||
threshold: 25
|
||||
method-lines:
|
||||
config:
|
||||
threshold: 30
|
||||
|
||||
exclude_patterns:
|
||||
- "**/*.spec.js"
|
||||
- "**/*.spec.ts"
|
||||
- "packages/networks/src/substrate.ts"
|
||||
- "packages/util/src/is/utf8.ts"
|
||||
- "packages/x-noble-hashes/src/**.ts"
|
||||
- "packages/x-noble-secp256k1/src/**.ts"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
packages/x-noble-hashes/**/*.ts
|
||||
packages/x-noble-secp256k1/**/*.ts
|
||||
+2
-8
@@ -6,18 +6,12 @@ const base = require('@polkadot/dev/config/eslint.cjs');
|
||||
module.exports = {
|
||||
...base,
|
||||
ignorePatterns: [
|
||||
'.eslintrc.js',
|
||||
'.github/**',
|
||||
'.vscode/**',
|
||||
'.yarn/**',
|
||||
'**/build/*',
|
||||
'**/coverage/*',
|
||||
'**/node_modules/*'
|
||||
...base.ignorePatterns
|
||||
],
|
||||
parserOptions: {
|
||||
...base.parserOptions,
|
||||
project: [
|
||||
'./tsconfig.json'
|
||||
'./tsconfig.eslint.json'
|
||||
]
|
||||
},
|
||||
rules: {
|
||||
|
||||
@@ -2,7 +2,7 @@ name: 'Lock Threads'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1/2 * * *'
|
||||
- cron: '15 1/3 * * *'
|
||||
|
||||
jobs:
|
||||
lock:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 2/2 * * *'
|
||||
- cron: '50 1/3 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
|
||||
+3
-2
@@ -11,7 +11,9 @@ tmp/
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.idea
|
||||
.npmrc
|
||||
.vscode
|
||||
.yarn/*
|
||||
!.yarn/releases
|
||||
!.yarn/plugins
|
||||
@@ -24,5 +26,4 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
store.db
|
||||
store.db.compacted
|
||||
.idea
|
||||
.vscode
|
||||
tsconfig.*buildinfo
|
||||
|
||||
+144
@@ -1,5 +1,149 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 8.2.2 Dec 19, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Bifrost Ledger capabilities (Thanks to https://github.com/awesomepan)
|
||||
- Add Sora genesisHash & Ledger capabilities (Thanks to https://github.com/NoodleSploder)
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `isPromise` check utility function
|
||||
- Add `assertUnreachable` for codepaths that should not be followed
|
||||
- Preserve all-caps word splits in `stringCamelCase`
|
||||
- Adjust `x-*` fallbacks via `x-global/extractGlobal`
|
||||
- Sync with upstream Substrate ss58 registry
|
||||
- Additional tests for `bip39` wordlists
|
||||
- Maintainability cleanups
|
||||
- Update to latest Ledger dependencies
|
||||
- Swap to upstream `@noble` packages
|
||||
- Adjust tsconfig with references
|
||||
- 8.2.2 (8.2.1 failed CI due to incorrect CHANGELOG)
|
||||
|
||||
|
||||
## 8.1.2 Dec 5, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjustment to non-full-word consecutive uppercase via `string{Camel, Pascal}Case`
|
||||
|
||||
|
||||
## 8.1.1 Dec 5, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Picasso genesisHash (Thanks to https://github.com/hussein-aitlahcen)
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow for use of `secp256k1` from `@polkadot/wasm-crypto`
|
||||
- Adjust `isBigInt` to not do `instanceof` check
|
||||
- Ensure consequtive capitals in `stringCamelCase` are lowercased
|
||||
- Use `@polkadot/x-bigint` for `BigInt` constructor
|
||||
- Split `@noble/hashes` fork into `x-noble-hashes`
|
||||
- Add `@noble/secp256k1` fork into `x-noble-secp256k1`, replaces `elliptic`
|
||||
|
||||
|
||||
## 8.0.5 Dec 1, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust sha3 expectation of `BigInt` availability
|
||||
|
||||
|
||||
## 8.0.4 Nov 30, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `stringCamelCase` with leading `_`
|
||||
|
||||
|
||||
## 8.0.3 Nov 30, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove `Buffer` usage in `x-randomvalues`
|
||||
- Adjust `stringCamelCase` for all-caps parts
|
||||
|
||||
|
||||
## 8.0.2 Nov 26, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Explicitly include BigInt patched versions
|
||||
|
||||
|
||||
## 8.0.1 Nov 26, 2021
|
||||
|
||||
**Important** In the 8.0 version the hashing utilities have been consolidated around an optimized and audited version from `@noble/hashes`. As in the past the WASM hashing will be used by default if the environment is initialized.
|
||||
|
||||
**Breaking change** The `schnorrkel*` functions have been renamed to `sr25519*`. Likewise the `ed25519` operations have been renamed from `nacl*` to `ed25519*`. Additionally the `{ed, sr, secp256k1}25519KeyPairFrom*` functions have been renamed to `{ed, sr, secp256k1}25519PairFrom*`.
|
||||
|
||||
Changes:
|
||||
|
||||
- Introduce `ed25519*` & `sr25519*` functions
|
||||
- Replace camelcase dep with simplified/optimized version
|
||||
- Replace (most) hashing operations with `@noble/hashes`
|
||||
- Replace JS fallback for `xxhash`
|
||||
- Adjust `BigInt` utility exports (with capability detection)
|
||||
- Previously added `bi*` functions renamed to `n*`
|
||||
- Extend performance tests with implementation compares
|
||||
- Remove non-significant Node Buffer concat fill
|
||||
|
||||
|
||||
## 7.9.2 Nov 22, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix TS compiled definitions for `base*` types
|
||||
- Provide JS/Wasm interfaces for `hmacShaAsU8a`
|
||||
|
||||
|
||||
## 7.9.1 Nov 21, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Updated Polymesh genesisHash (Thanks to https://github.com/adamdossa)
|
||||
|
||||
Changes:
|
||||
|
||||
- Add strongly typed `object{Entries, Keys, Values}` utilities
|
||||
- Add `{hex, u8a}ToBigInt` utilities
|
||||
- Add `bi*` utilities for `bigint` operations (mirror of `bn*`)
|
||||
- Add `stringPascalCase` utility
|
||||
- Add `isCodec` to check for Codec-like structures
|
||||
- Add `has*` detection shortcuts (e.g. `hasWasm` or `hasBuffer`)
|
||||
- Add `sha256AsU8a` util (& replace use internally)
|
||||
- Optimize for `hexToU8a` and `u8aToHex` functions
|
||||
- Optimize `u8aEq` to use `DataView` for compares
|
||||
- Align `base{32, 58, 64}*` around (audited) `micro-base`
|
||||
- Space optimization for bip39 wordlists
|
||||
- Sync with upstream Substrate ss58 registry
|
||||
- Expand tests for uncovered functions
|
||||
|
||||
|
||||
## 7.8.2 Nov 7, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Expose internal `isArray` check
|
||||
- Move `object{Property, Properties}` from api repo
|
||||
|
||||
|
||||
## 7.8.1 Nov 6, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Added Acala genesisHash (Thanks to https://github.com/qwer951123)
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `objectClear` and `objectSpread` utility functions
|
||||
- Add `lazyMethod` & `lazyMethods` utility functions
|
||||
- Sync with upstream Substrate ss58 registry
|
||||
|
||||
|
||||
## 7.7.1 Oct 31, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
+2
-3
@@ -13,8 +13,7 @@ module.exports = Object.assign({}, config, {
|
||||
'@polkadot/util-(crypto)(.*)$': '<rootDir>/packages/util-$1/src/$2',
|
||||
// eslint-disable-next-line sort-keys
|
||||
'@polkadot/util(.*)$': '<rootDir>/packages/util/src/$1',
|
||||
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node',
|
||||
'@polkadot/x-global(.*)$': '<rootDir>/packages/x-global/src/$1',
|
||||
'@polkadot/x-rxjs(.*)$': '<rootDir>/packages/x-rxjs/src/$1'
|
||||
'@polkadot/x-(bigint|global)(.*)$': '<rootDir>/packages/x-$1/src/$2',
|
||||
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node'
|
||||
}
|
||||
});
|
||||
|
||||
+7
-8
@@ -10,7 +10,7 @@
|
||||
"url": "https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
@@ -21,20 +21,19 @@
|
||||
"clean": "polkadot-dev-clean-build",
|
||||
"lint": "polkadot-dev-run-lint",
|
||||
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
|
||||
"networks:sync": "node packages/networks/scripts/fromSubstrate.mjs",
|
||||
"networks:sync": "yarn build && node packages/networks/scripts/fromSubstrate.mjs",
|
||||
"postinstall": "polkadot-dev-yarn-only",
|
||||
"test": "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.15.8",
|
||||
"@polkadot/dev": "^0.63.18",
|
||||
"@polkadot/ts": "^0.4.12",
|
||||
"@types/ed2curve": "^0.2.2",
|
||||
"@types/jest": "^27.0.2"
|
||||
"@babel/core": "^7.16.5",
|
||||
"@polkadot/dev": "^0.64.5",
|
||||
"@polkadot/ts": "^0.4.20",
|
||||
"@types/jest": "^27.0.3"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^4.4.4"
|
||||
"typescript": "^4.5.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,17 +16,17 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.15.4",
|
||||
"@ledgerhq/hw-transport": "^6.11.2",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.11.2",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.11.2"
|
||||
"@babel/runtime": "^7.16.5",
|
||||
"@ledgerhq/hw-transport": "^6.20.0",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.20.0",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.20.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.11.2"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.20.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,13 +10,6 @@ import LedgerWebUsb from '@ledgerhq/hw-transport-webusb';
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const transports: TransportDef[] = [
|
||||
// deprecated
|
||||
// import LedgerU2F from '@ledgerhq/hw-transport-u2f';
|
||||
// {
|
||||
// create: (): Promise<Transport> =>
|
||||
// LedgerU2F.create(),
|
||||
// type: 'u2f'
|
||||
// },
|
||||
{
|
||||
create: (): Promise<Transport> =>
|
||||
LedgerWebUsb.create(),
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '7.7.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '8.2.2' };
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"references": []
|
||||
}
|
||||
@@ -19,12 +19,12 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.15.4",
|
||||
"@polkadot/hw-ledger-transports": "7.7.1",
|
||||
"@polkadot/util": "7.7.1",
|
||||
"@zondax/ledger-substrate": "^0.18.0"
|
||||
"@babel/runtime": "^7.16.5",
|
||||
"@polkadot/hw-ledger-transports": "8.2.2",
|
||||
"@polkadot/util": "8.2.2",
|
||||
"@zondax/ledger-substrate": "^0.23.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { knownLedger } from '@polkadot/networks/defaults';
|
||||
|
||||
import { ledgerApps } from './defaults';
|
||||
|
||||
describe('defaults', (): void => {
|
||||
it('has entries for each of the apps (hwledger -> networks)', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
!ledgerApps[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('has entries for each of the apps (networks -> hwledger)', (): void => {
|
||||
expect(
|
||||
Object.keys(ledgerApps).filter((network) =>
|
||||
!knownLedger[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -4,10 +4,11 @@
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newStatemineApp } from '@zondax/ledger-substrate';
|
||||
import { newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp } from '@zondax/ledger-substrate';
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults.ts
|
||||
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
bifrost: newBifrostApp,
|
||||
centrifuge: newCentrifugeApp,
|
||||
'dock-mainnet': newDockApp,
|
||||
edgeware: newEdgewareApp,
|
||||
@@ -17,5 +18,6 @@ export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp>
|
||||
'nodle-chain': newNodleApp,
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp,
|
||||
sora: newSoraApp,
|
||||
statemine: newStatemineApp
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', version: '7.7.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', version: '8.2.2' };
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
|
||||
|
||||
export interface AccountOptions {
|
||||
@@ -15,7 +17,7 @@ export interface LedgerAddress {
|
||||
}
|
||||
|
||||
export interface LedgerSignature {
|
||||
signature: string;
|
||||
signature: HexString;
|
||||
}
|
||||
|
||||
export interface LedgerVersion {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"references": [
|
||||
{ "path": "../hw-ledger-transports" },
|
||||
{ "path": "../util" }
|
||||
]
|
||||
}
|
||||
@@ -20,15 +20,15 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.15.4",
|
||||
"@polkadot/util": "7.7.1",
|
||||
"@polkadot/util-crypto": "7.7.1"
|
||||
"@babel/runtime": "^7.16.5",
|
||||
"@polkadot/util": "8.2.2",
|
||||
"@polkadot/util-crypto": "8.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "7.7.1",
|
||||
"@polkadot/util-crypto": "7.7.1"
|
||||
"@polkadot/util": "8.2.2",
|
||||
"@polkadot/util-crypto": "8.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,6 +369,14 @@ describe('keypair', (): void => {
|
||||
).toEqual(ETH_ADDRESS_ONE);
|
||||
});
|
||||
|
||||
it('creates with dev phrase with derivation path specified - addFromUri with type', (): void => {
|
||||
const keyringUntyped = new Keyring();
|
||||
|
||||
expect(
|
||||
keyringUntyped.addFromUri(PHRASE, {}, 'ethereum').address
|
||||
).toEqual(ETH_ADDRESS_ONE);
|
||||
});
|
||||
|
||||
it('encodes a pair toJSON (and decodes)', (): void => {
|
||||
const pair = keyring.createFromUri(PHRASE);
|
||||
const json = pair.toJson('password');
|
||||
|
||||
@@ -5,17 +5,17 @@ import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util
|
||||
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types';
|
||||
|
||||
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
|
||||
import { base64Decode, decodeAddress, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed } from '@polkadot/util-crypto';
|
||||
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';
|
||||
import { createPair } from './pair';
|
||||
import { Pairs } from './pairs';
|
||||
|
||||
const keypairFromSeed = {
|
||||
const PairFromSeed = {
|
||||
ecdsa: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
|
||||
ed25519: (seed: Uint8Array): Keypair => naclFromSeed(seed),
|
||||
ed25519: (seed: Uint8Array): Keypair => ed25519FromSeed(seed),
|
||||
ethereum: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
|
||||
sr25519: (seed: Uint8Array): Keypair => schnorrkelFromSeed(seed)
|
||||
sr25519: (seed: Uint8Array): Keypair => sr25519FromSeed(seed)
|
||||
};
|
||||
|
||||
function pairToPublic ({ publicKey }: KeyringPair): Uint8Array {
|
||||
@@ -142,7 +142,7 @@ export class Keyring implements KeyringInstance {
|
||||
*/
|
||||
public addFromSeed (seed: Uint8Array, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
|
||||
return this.addPair(
|
||||
createPair({ toSS58: this.encodeAddress, type }, keypairFromSeed[type](seed), meta, null)
|
||||
createPair({ toSS58: this.encodeAddress, type }, PairFromSeed[type](seed), meta, null)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -224,9 +224,9 @@ export class Keyring implements KeyringInstance {
|
||||
|
||||
const derived = type === 'ethereum'
|
||||
? isPhraseHex
|
||||
? keypairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once
|
||||
? PairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once
|
||||
: hdEthereum(seed, derivePath.substring(1))
|
||||
: keyFromPath(keypairFromSeed[type](seed), path, type);
|
||||
: keyFromPath(PairFromSeed[type](seed), path, type);
|
||||
|
||||
return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', version: '7.7.1' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', version: '8.2.2' };
|
||||
|
||||
@@ -6,8 +6,8 @@ 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, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclOpen, naclSeal, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVrfSign, schnorrkelVrfVerify, secp256k1Compress, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify } from '@polkadot/util-crypto';
|
||||
import { assert, 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';
|
||||
import { encodePair } from './encode';
|
||||
@@ -22,9 +22,9 @@ const SIG_TYPE_NONE = new Uint8Array();
|
||||
|
||||
const TYPE_FROM_SEED = {
|
||||
ecdsa: secp256k1FromSeed,
|
||||
ed25519: naclFromSeed,
|
||||
ed25519: ed25519FromSeed,
|
||||
ethereum: secp256k1FromSeed,
|
||||
sr25519: schnorrkelFromSeed
|
||||
sr25519: sr25519FromSeed
|
||||
};
|
||||
|
||||
const TYPE_PREFIX = {
|
||||
@@ -36,9 +36,9 @@ const TYPE_PREFIX = {
|
||||
|
||||
const TYPE_SIGNATURE = {
|
||||
ecdsa: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'blake2'),
|
||||
ed25519: naclSign,
|
||||
ed25519: ed25519Sign,
|
||||
ethereum: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'keccak'),
|
||||
sr25519: schnorrkelSign
|
||||
sr25519: sr25519Sign
|
||||
};
|
||||
|
||||
const TYPE_ADDRESS = {
|
||||
@@ -181,7 +181,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
secretKey = new Uint8Array();
|
||||
},
|
||||
setMeta: (additional: KeyringPair$Meta): void => {
|
||||
meta = { ...meta, ...additional };
|
||||
meta = objectSpread({}, meta, additional);
|
||||
},
|
||||
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
@@ -215,7 +215,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
|
||||
if (type === 'sr25519') {
|
||||
return schnorrkelVrfSign(message, { secretKey }, context, extra);
|
||||
return sr25519VrfSign(message, { secretKey }, context, extra);
|
||||
}
|
||||
|
||||
const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });
|
||||
@@ -224,7 +224,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
},
|
||||
vrfVerify: (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean => {
|
||||
if (type === 'sr25519') {
|
||||
return schnorrkelVrfVerify(message, vrfResult, publicKey, context, extra);
|
||||
return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);
|
||||
}
|
||||
|
||||
const result = signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](u8aToU8a(signerPublic)));
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
|
||||
import { objectSpread } from '@polkadot/util';
|
||||
import { jsonEncryptFormat } from '@polkadot/util-crypto';
|
||||
|
||||
interface PairStateJson {
|
||||
@@ -12,9 +13,8 @@ interface PairStateJson {
|
||||
}
|
||||
|
||||
export function pairToJson (type: KeypairType, { address, meta }: PairStateJson, encoded: Uint8Array, isEncrypted: boolean): KeyringPair$Json {
|
||||
return {
|
||||
...jsonEncryptFormat(encoded, ['pkcs8', type], isEncrypted),
|
||||
return objectSpread(jsonEncryptFormat(encoded, ['pkcs8', type], isEncrypted), {
|
||||
address,
|
||||
meta
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { KeyringPair } from '../types';
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
import { cryptoWaitReady, encodeAddress as toSS58, naclKeypairFromSeed, randomAsU8a, schnorrkelKeypairFromSeed, secp256k1KeypairFromSeed } from '@polkadot/util-crypto';
|
||||
import { cryptoWaitReady, ed25519PairFromSeed, encodeAddress as toSS58, randomAsU8a, secp256k1PairFromSeed, sr25519PairFromSeed } from '@polkadot/util-crypto';
|
||||
|
||||
import { createPair } from '.';
|
||||
|
||||
@@ -19,9 +19,9 @@ describe('vrf', (): void => {
|
||||
beforeAll(async (): Promise<void> => {
|
||||
await cryptoWaitReady();
|
||||
|
||||
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1KeypairFromSeed(randomAsU8a()));
|
||||
ed25519 = createPair({ toSS58, type: 'ed25519' }, naclKeypairFromSeed(randomAsU8a()));
|
||||
sr25519 = createPair({ toSS58, type: 'sr25519' }, schnorrkelKeypairFromSeed(randomAsU8a()));
|
||||
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1PairFromSeed(randomAsU8a()));
|
||||
ed25519 = createPair({ toSS58, type: 'ed25519' }, ed25519PairFromSeed(randomAsU8a()));
|
||||
sr25519 = createPair({ toSS58, type: 'sr25519' }, sr25519PairFromSeed(randomAsU8a()));
|
||||
});
|
||||
|
||||
it('has deterministic signature values for ecdsa', (): void => {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { KeyringInstance, KeyringOptions } from './types';
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
import { assert, hexToU8a } from '@polkadot/util';
|
||||
import { KeypairType } from '@polkadot/util-crypto/types';
|
||||
|
||||
import { Keyring } from './keyring';
|
||||
@@ -111,6 +111,15 @@ export const PAIRSETHEREUM: PairDef[] = [
|
||||
}
|
||||
];
|
||||
|
||||
function createMeta (name?: string, seed?: string) {
|
||||
assert(name || seed, 'Testing pair should have either a name or a seed');
|
||||
|
||||
return {
|
||||
isTesting: true,
|
||||
name: name || (seed && seed.replace('//', '_').toLowerCase())
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @name testKeyring
|
||||
* @summary Create an instance of Keyring pre-populated with locked test accounts
|
||||
@@ -119,17 +128,12 @@ export const PAIRSETHEREUM: PairDef[] = [
|
||||
*/
|
||||
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
|
||||
const keyring = new Keyring(options);
|
||||
const pairs: PairDef[] = (options.type && options.type === 'ethereum') ? PAIRSETHEREUM : PAIRSSR25519;
|
||||
const pairs = (options.type && options.type === 'ethereum')
|
||||
? PAIRSETHEREUM
|
||||
: PAIRSSR25519;
|
||||
|
||||
for (const { name, publicKey, secretKey, seed, type } of pairs) {
|
||||
if (!name && !seed) {
|
||||
throw new Error('Testing pair should have either a name or a seed');
|
||||
}
|
||||
|
||||
const meta = {
|
||||
isTesting: true,
|
||||
name: name || (seed && seed.replace('//', '_').toLowerCase())
|
||||
};
|
||||
const meta = createMeta(name, seed);
|
||||
const pair = !isDerived && !name && seed
|
||||
? keyring.addFromUri(seed, meta, options.type)
|
||||
: keyring.addPair(
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"references": [
|
||||
{ "path": "../util" },
|
||||
{ "path": "../util-crypto" }
|
||||
]
|
||||
}
|
||||
@@ -17,13 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.15.4"
|
||||
"@babel/runtime": "^7.16.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/util": "7.7.1",
|
||||
"@polkadot/x-fetch": "7.7.1"
|
||||
"@polkadot/hw-ledger": "8.2.2",
|
||||
"@polkadot/util": "8.2.2",
|
||||
"@polkadot/x-fetch": "8.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KnownSubstrate, Ss58Registry } from './types';
|
||||
import type { Ss58Registry } from './types';
|
||||
|
||||
import fs from 'fs';
|
||||
|
||||
import { stringify } from '@polkadot/util';
|
||||
import { objectKeys, stringify } from '@polkadot/util';
|
||||
import { fetch } from '@polkadot/x-fetch';
|
||||
|
||||
import { substrateRegistry } from './defaults';
|
||||
@@ -52,7 +52,7 @@ describe('check latest Substrate ss58 registry', (): void => {
|
||||
});
|
||||
|
||||
it('has the same values as the original', (): void => {
|
||||
const fields = Object.keys(original.schema) as (keyof KnownSubstrate)[];
|
||||
const fields = objectKeys(original.schema);
|
||||
const errors = original.registry
|
||||
.map((n): [string, string[]] => {
|
||||
const other = allNetworks.find(({ prefix }) => prefix === n.prefix);
|
||||
|
||||
@@ -1,25 +1,46 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { ledgerApps } from '@polkadot/hw-ledger/defaults';
|
||||
import { isHex } from '@polkadot/util';
|
||||
|
||||
import { knownGenesis, knownLedger } from './defaults';
|
||||
|
||||
describe('defaults', (): void => {
|
||||
it('has hex values for all genesis chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownGenesis).filter((network) =>
|
||||
!knownGenesis[network].length ||
|
||||
knownGenesis[network].some((g) => !isHex(g, 256))
|
||||
)
|
||||
).toEqual([]);
|
||||
describe('genesis', (): void => {
|
||||
it('has hex values for all genesis chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownGenesis).filter((network) =>
|
||||
!knownGenesis[network].length ||
|
||||
knownGenesis[network].some((g) => !isHex(g, 256))
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('has genesis for all Ledger chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
!knownGenesis[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
it('has genesis for all Ledger chains', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
!knownGenesis[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
describe('Ledger', (): void => {
|
||||
it('has entries for each of the apps (hwledger -> networks)', (): void => {
|
||||
expect(
|
||||
Object.keys(knownLedger).filter((network) =>
|
||||
!ledgerApps[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('has entries for each of the apps (networks -> hwledger)', (): void => {
|
||||
expect(
|
||||
Object.keys(ledgerApps).filter((network) =>
|
||||
!knownLedger[network]
|
||||
)
|
||||
).toEqual([]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -10,6 +10,9 @@ export const substrateRegistry = 'https://raw.githubusercontent.com/paritytech/s
|
||||
// last. This make lookups for the current a simple genesisHash[0]
|
||||
// (See Kusama as an example)
|
||||
export const knownGenesis: KnownGenesis = {
|
||||
acala: [
|
||||
'0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
|
||||
],
|
||||
bifrost: [
|
||||
'0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
|
||||
],
|
||||
@@ -48,6 +51,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
'nodle-chain': [
|
||||
'0xa3d114c2b8d0627c1aa9b134eafcf7d05ca561fdc19fb388bb9457f81809fb23'
|
||||
],
|
||||
picasso: [
|
||||
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
||||
],
|
||||
plasm: [
|
||||
'0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'
|
||||
],
|
||||
@@ -55,7 +61,10 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
|
||||
],
|
||||
polymesh: [
|
||||
'0x9deeb940c92ae02111c3bd5baca89970384f4c9849f02a1b2e53e66414d30f9f'
|
||||
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
|
||||
],
|
||||
sora: [
|
||||
'0x7e4e32d0feafd4f9c9414b0be86373f9a1efa904809b683453a9af6856d38ad5'
|
||||
],
|
||||
stafi: [
|
||||
'0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'
|
||||
@@ -73,6 +82,7 @@ export const knownIcon: KnownIcon = {
|
||||
centrifuge: 'polkadot',
|
||||
kusama: 'polkadot',
|
||||
polkadot: 'polkadot',
|
||||
sora: 'polkadot',
|
||||
statemine: 'polkadot',
|
||||
statemint: 'polkadot',
|
||||
westmint: 'polkadot'
|
||||
@@ -82,6 +92,7 @@ export const knownIcon: KnownIcon = {
|
||||
// and maps to the known slip44 (minus the `0x8` hard derivation flag)
|
||||
// NOTE: Any network here needs to have a genesisHash attached in the config above
|
||||
export const knownLedger: KnownLedger = {
|
||||
bifrost: 0x00000314,
|
||||
centrifuge: 0x000002eb,
|
||||
'dock-mainnet': 0x00000252,
|
||||
edgeware: 0x0000020b,
|
||||
@@ -91,6 +102,7 @@ export const knownLedger: KnownLedger = {
|
||||
'nodle-chain': 0x000003eb,
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253,
|
||||
sora: 0x00000269,
|
||||
statemine: 0x000001b2 // common-good on Kusama, shares derivation
|
||||
};
|
||||
|
||||
@@ -101,5 +113,6 @@ export const knownTestnet: KnownTestnet = {
|
||||
'dock-testnet': true,
|
||||
jupiter: true,
|
||||
'mathchain-testnet': true,
|
||||
subspace_testnet: true,
|
||||
'zero-alphaville': true
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', version: '7.7.1' };
|
||||
export const packageInfo = { name: '@polkadot/networks', version: '8.2.2' };
|
||||
|
||||
@@ -149,7 +149,7 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
network: 'totem',
|
||||
prefix: 14,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['XTX'],
|
||||
symbols: ['TOTEM'],
|
||||
website: 'https://totemaccounting.com'
|
||||
},
|
||||
{
|
||||
@@ -270,13 +270,13 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Dhiway CORD Network',
|
||||
decimals: [12, 12],
|
||||
displayName: 'CORD Network',
|
||||
network: 'cord',
|
||||
prefix: 29,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['DCU'],
|
||||
website: 'https://dhiway.com/'
|
||||
symbols: ['DHI', 'WAY'],
|
||||
website: 'https://cord.network/'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
@@ -467,6 +467,15 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['LAYR'],
|
||||
website: 'https://composable.finance'
|
||||
},
|
||||
{
|
||||
decimals: [9],
|
||||
displayName: 'xx network',
|
||||
network: 'xxnetwork',
|
||||
prefix: 55,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['XX'],
|
||||
website: 'https://xx.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'HydraDX',
|
||||
@@ -495,12 +504,21 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
website: 'https://crust.network'
|
||||
},
|
||||
{
|
||||
decimals: [0, 9, 9, 9, 9, 9, 9, 9],
|
||||
displayName: 'Equilibrium Network',
|
||||
network: 'equilibrium',
|
||||
decimals: [9, 9, 9],
|
||||
displayName: 'Genshiro Network',
|
||||
network: 'genshiro',
|
||||
prefix: 67,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['Unknown', 'USD', 'EQ', 'ETH', 'BTC', 'EOS', 'DOT', 'CRV'],
|
||||
symbols: ['GENS', 'EQD', 'LPT0'],
|
||||
website: 'https://genshiro.equilibrium.io'
|
||||
},
|
||||
{
|
||||
decimals: [9],
|
||||
displayName: 'Equilibrium Network',
|
||||
network: 'equilibrium',
|
||||
prefix: 68,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['EQ'],
|
||||
website: 'https://equilibrium.io'
|
||||
},
|
||||
{
|
||||
@@ -522,12 +540,12 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
website: 'https://zeitgeist.pm'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
decimals: [18],
|
||||
displayName: 'Manta network',
|
||||
network: 'manta',
|
||||
prefix: 77,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['MA'],
|
||||
symbols: ['MANTA'],
|
||||
website: 'https://manta.network'
|
||||
},
|
||||
{
|
||||
@@ -575,6 +593,15 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['TRAC'],
|
||||
website: 'https://origintrail.io'
|
||||
},
|
||||
{
|
||||
decimals: [10],
|
||||
displayName: 'Pontem Network',
|
||||
network: 'pontem-network',
|
||||
prefix: 105,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PONT'],
|
||||
website: 'https://pontem.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Heiko',
|
||||
@@ -638,6 +665,24 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['QTZ'],
|
||||
website: 'https://unique.network'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Pioneer Network by Bit.Country',
|
||||
network: 'pioneer_network',
|
||||
prefix: 268,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['NEER'],
|
||||
website: 'https://bit.country'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Efinity',
|
||||
network: 'efinity',
|
||||
prefix: 1110,
|
||||
standardAccount: 'Sr25519',
|
||||
symbols: ['EFI'],
|
||||
website: 'https://efinity.io/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Moonbeam',
|
||||
@@ -656,6 +701,51 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['MOVR'],
|
||||
website: 'https://moonbeam.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Kapex',
|
||||
network: 'kapex',
|
||||
prefix: 2007,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KAPEX'],
|
||||
website: 'https://totemaccounting.com'
|
||||
},
|
||||
{
|
||||
decimals: [10],
|
||||
displayName: 'Interlay',
|
||||
network: 'interlay',
|
||||
prefix: 2032,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['INTR'],
|
||||
website: 'https://interlay.io/'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Kintsugi',
|
||||
network: 'kintsugi',
|
||||
prefix: 2092,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KINT'],
|
||||
website: 'https://interlay.io/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Subspace testnet',
|
||||
network: 'subspace_testnet',
|
||||
prefix: 2254,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['tSSC'],
|
||||
website: 'https://subspace.network'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Subspace',
|
||||
network: 'subspace',
|
||||
prefix: 6094,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['SSC'],
|
||||
website: 'https://subspace.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Basilisk',
|
||||
@@ -669,7 +759,7 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
decimals: [12],
|
||||
displayName: 'CESS Testnet',
|
||||
network: 'cess-testnet',
|
||||
prefix: 10042,
|
||||
prefix: 11330,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['TCESS'],
|
||||
website: 'https://cess.cloud'
|
||||
@@ -678,7 +768,7 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
decimals: [12],
|
||||
displayName: 'CESS',
|
||||
network: 'cess',
|
||||
prefix: 10043,
|
||||
prefix: 11331,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['CESS'],
|
||||
website: 'https://cess.cloud'
|
||||
|
||||
@@ -37,5 +37,5 @@ export interface Network extends SubstrateNetwork {
|
||||
export interface Ss58Registry {
|
||||
registry: KnownSubstrate[];
|
||||
specification: string;
|
||||
schema: Record<string, string>;
|
||||
schema: Record<keyof KnownSubstrate, string>;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "..",
|
||||
"outDir": "./build",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"references": [
|
||||
{ "path": "../hw-ledger" },
|
||||
{ "path": "../util" },
|
||||
{ "path": "../x-fetch" }
|
||||
]
|
||||
}
|
||||
@@ -22,35 +22,29 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "7.7.1",
|
||||
"version": "8.2.2",
|
||||
"browser": {
|
||||
"crypto": false,
|
||||
"stream": false
|
||||
},
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.15.4",
|
||||
"@polkadot/networks": "7.7.1",
|
||||
"@polkadot/util": "7.7.1",
|
||||
"@polkadot/wasm-crypto": "^4.2.1",
|
||||
"@polkadot/x-randomvalues": "7.7.1",
|
||||
"base-x": "^3.0.9",
|
||||
"base64-js": "^1.5.1",
|
||||
"blakejs": "^1.1.1",
|
||||
"bn.js": "^4.12.0",
|
||||
"create-hash": "^1.2.0",
|
||||
"@babel/runtime": "^7.16.5",
|
||||
"@noble/hashes": "^0.4.5",
|
||||
"@noble/secp256k1": "^1.3.4",
|
||||
"@polkadot/networks": "8.2.2",
|
||||
"@polkadot/util": "8.2.2",
|
||||
"@polkadot/wasm-crypto": "^4.5.1",
|
||||
"@polkadot/x-bigint": "8.2.2",
|
||||
"@polkadot/x-randomvalues": "8.2.2",
|
||||
"ed2curve": "^0.3.0",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.1.7",
|
||||
"js-sha3": "^0.8.0",
|
||||
"scryptsy": "^2.1.0",
|
||||
"tweetnacl": "^1.0.3",
|
||||
"xxhashjs": "^0.2.2"
|
||||
"micro-base": "^0.10.0",
|
||||
"tweetnacl": "^1.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bn.js": "^4.11.6",
|
||||
"@types/create-hash": "^1.2.2",
|
||||
"@types/elliptic": "^6.4.13",
|
||||
"@types/scryptsy": "^2.0.0",
|
||||
"@types/xxhashjs": "^0.2.2"
|
||||
"@types/ed2curve": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "7.7.1"
|
||||
"@polkadot/util": "8.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
import { base58Decode } from '../base58/decode';
|
||||
import { base58Decode } from '../base58';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base58Decode } from '../base58/decode';
|
||||
import { base58Decode } from '../base58';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
|
||||
describe('checkAddressChecksum', (): void => {
|
||||
|
||||
@@ -3,21 +3,15 @@
|
||||
|
||||
import { hexToU8a, stringToU8a, u8aToHex } from '@polkadot/util';
|
||||
|
||||
import { createTestPairs, TestKeyringMap } from '../../../keyring/src/testingPairs';
|
||||
import { ALICE_PUBLIC_SR } from './encode.spec';
|
||||
import { decodeAddress } from '.';
|
||||
|
||||
describe('decodeAddress', (): void => {
|
||||
let keyring: TestKeyringMap;
|
||||
|
||||
beforeAll((): void => {
|
||||
keyring = createTestPairs({ type: 'sr25519' });
|
||||
});
|
||||
|
||||
it('decodes an address', (): void => {
|
||||
expect(
|
||||
decodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
|
||||
).toEqual(
|
||||
keyring.alice.publicKey
|
||||
ALICE_PUBLIC_SR
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import type { Prefix } from './types';
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L6
|
||||
import { assert, isHex, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { base58Decode } from '../base58/decode';
|
||||
import { base58Decode } from '../base58';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import type { Prefix } from './types';
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { keyExtractPath } from '../key';
|
||||
import { schnorrkelDerivePublic } from '../schnorrkel';
|
||||
import { sr25519DerivePublic } from '../sr25519';
|
||||
import { decodeAddress } from './decode';
|
||||
import { encodeAddress } from './encode';
|
||||
|
||||
@@ -30,7 +30,7 @@ export function deriveAddress (who: HexString | Uint8Array | string, suri: strin
|
||||
let publicKey = decodeAddress(who);
|
||||
|
||||
for (const { chainCode } of path) {
|
||||
publicKey = schnorrkelDerivePublic(publicKey, chainCode);
|
||||
publicKey = sr25519DerivePublic(publicKey, chainCode);
|
||||
}
|
||||
|
||||
return encodeAddress(publicKey, ss58Format);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { createTestPairs } from '@polkadot/keyring/testingPairs';
|
||||
|
||||
import { encodeAddress } from '.';
|
||||
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
export const ALICE_PUBLIC_SR = new Uint8Array([212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]);
|
||||
|
||||
export const ALICE_PUBLIC_ED = new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79]);
|
||||
|
||||
const SUBKEY = [
|
||||
{
|
||||
@@ -69,7 +69,7 @@ const SUBKEY = [
|
||||
describe('encode', (): void => {
|
||||
it('encodes an address to a valid value', (): void => {
|
||||
expect(
|
||||
keyring.alice.address
|
||||
encodeAddress(ALICE_PUBLIC_ED)
|
||||
).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
|
||||
});
|
||||
|
||||
@@ -88,7 +88,7 @@ describe('encode', (): void => {
|
||||
it('fails when non-valid publicKey provided', (): void => {
|
||||
expect(
|
||||
(): string => encodeAddress(
|
||||
keyring.alice.publicKey.slice(0, 30)
|
||||
ALICE_PUBLIC_ED.slice(0, 30)
|
||||
)
|
||||
).toThrow(/Expected a valid key/);
|
||||
});
|
||||
@@ -141,7 +141,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes with 2 byte prefix', (): void => {
|
||||
expect(
|
||||
encodeAddress(keyring.alice.publicKey, 255)
|
||||
encodeAddress(ALICE_PUBLIC_ED, 255)
|
||||
).toEqual('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k');
|
||||
});
|
||||
|
||||
@@ -155,19 +155,19 @@ describe('encode', (): void => {
|
||||
|
||||
it('does not encode for > 16,383, < 0', (): void => {
|
||||
expect(
|
||||
() => encodeAddress(keyring.alice.publicKey, -1)
|
||||
() => encodeAddress(ALICE_PUBLIC_ED, -1)
|
||||
).toThrow(/range ss58Format specified/);
|
||||
expect(
|
||||
() => encodeAddress(keyring.alice.publicKey, 16384)
|
||||
() => encodeAddress(ALICE_PUBLIC_ED, 16384)
|
||||
).toThrow(/range ss58Format specified/);
|
||||
});
|
||||
|
||||
it('does not encode reserved', (): void => {
|
||||
expect(
|
||||
() => encodeAddress(keyring.alice.publicKey, 46)
|
||||
() => encodeAddress(ALICE_PUBLIC_ED, 46)
|
||||
).toThrow(/range ss58Format specified/);
|
||||
expect(
|
||||
() => encodeAddress(keyring.alice.publicKey, 47)
|
||||
() => encodeAddress(ALICE_PUBLIC_ED, 47)
|
||||
).toThrow(/range ss58Format specified/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -7,7 +7,7 @@ import type { Prefix } from './types';
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L34
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { base58Encode } from '../base58/encode';
|
||||
import { base58Encode } from '../base58';
|
||||
import { decodeAddress } from './decode';
|
||||
import { defaults } from './defaults';
|
||||
import { sshash } from './sshash';
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { createTestPairs } from '@polkadot/keyring/testingPairs';
|
||||
|
||||
import { ALICE_PUBLIC_SR } from './encode.spec';
|
||||
import { addressEq } from '.';
|
||||
|
||||
describe('addressEq', (): void => {
|
||||
@@ -34,12 +33,10 @@ describe('addressEq', (): void => {
|
||||
});
|
||||
|
||||
it('returns true for equal, address vs publicKey', (): void => {
|
||||
const keyring = createTestPairs({ type: 'sr25519' });
|
||||
|
||||
expect(
|
||||
addressEq(
|
||||
'5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
|
||||
keyring.alice.publicKey
|
||||
ALICE_PUBLIC_SR
|
||||
)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
@@ -5,9 +5,9 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import type { HashType } from '../secp256k1/types';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { secp256k1Hasher } from '../secp256k1/hasher';
|
||||
import { hasher } from '../secp256k1/hasher';
|
||||
import { encodeAddress } from './encode';
|
||||
|
||||
/**
|
||||
@@ -15,15 +15,9 @@ import { encodeAddress } from './encode';
|
||||
* @summary Converts an EVM address to its corresponding SS58 address.
|
||||
*/
|
||||
export function evmToAddress (evmAddress: HexString | string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
|
||||
const wrapError = (message: string) => `Converting ${evmAddress as string}: ${message}`;
|
||||
|
||||
const message = u8aConcat('evm:', evmAddress);
|
||||
|
||||
if (message.length !== 24) {
|
||||
throw new Error(wrapError('Invalid evm address length'));
|
||||
}
|
||||
assert(message.length === 24, () => `Converting ${evmAddress as string}: Invalid evm address length`);
|
||||
|
||||
const address = secp256k1Hasher(hashType, message);
|
||||
|
||||
return encodeAddress(address, ss58Format);
|
||||
return encodeAddress(hasher(hashType, message), ss58Format);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isAddress } from '.';
|
||||
|
||||
describe('isAddress', (): void => {
|
||||
it('decodes an address', (): void => {
|
||||
expect(
|
||||
isAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes the council address', (): void => {
|
||||
expect(
|
||||
isAddress('F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('converts a publicKey (hex) as-is', (): void => {
|
||||
expect(
|
||||
isAddress('0x01020304')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a short address', (): void => {
|
||||
expect(
|
||||
isAddress('F7NZ')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 1-byte accountId (with prefix)', (): void => {
|
||||
expect(
|
||||
isAddress('g4b', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte accountId', (): void => {
|
||||
expect(
|
||||
isAddress('3xygo', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('encodes a 4-byte address', (): void => {
|
||||
expect(
|
||||
isAddress('zswfoZa', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 8-byte address', (): void => {
|
||||
expect(
|
||||
isAddress('848Gh2GcGaZia', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 33-byte address', (): void => {
|
||||
expect(
|
||||
isAddress('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (65)', (): void => {
|
||||
expect(
|
||||
isAddress('cLtA6nCDyvwKcEHH4QkZDSHMhS9s78BvUJUsKUbUAn1Jc2SCF')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (69)', (): void => {
|
||||
expect(
|
||||
isAddress('cnUaoo5wodnTVA4bnr4woSweto8hWZADUvLFXkR9Q6U7BRsbF')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (252)', (): void => {
|
||||
expect(
|
||||
isAddress('xw9Hca4RJTmBRgzJT4ieJBh7XCK9gE3NXBDSEmgGHd4TCrbnG')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (255)', (): void => {
|
||||
expect(
|
||||
isAddress('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (ecdsa, from Substrate)', (): void => {
|
||||
expect(
|
||||
isAddress('4pbsSkWcBaYoFHrKJZp5fDVUKbqSYD9dhZZGvpp3vQ5ysVs5ybV')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('fails when length is invalid', (): void => {
|
||||
expect(
|
||||
isAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('fails when the checksum does not match', (): void => {
|
||||
expect(
|
||||
isAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMa9cj')
|
||||
).toEqual(false);
|
||||
expect(
|
||||
isAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaDwU')
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('fails when invalid base58 encoded address is found', (): void => {
|
||||
expect(
|
||||
isAddress('F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29')
|
||||
).toEqual(false);
|
||||
});
|
||||
});
|
||||
@@ -7,6 +7,7 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
import { BN_LE_16_OPTS } from '../bn';
|
||||
import { decodeAddress } from './decode';
|
||||
|
||||
const PREFIX = stringToU8a('modlpy/utilisuba');
|
||||
@@ -16,7 +17,7 @@ export function createKeyDerived (who: HexString | Uint8Array | string, index: b
|
||||
u8aConcat(
|
||||
PREFIX,
|
||||
decodeAddress(who),
|
||||
bnToU8a(index, { bitLength: 16, isLe: true })
|
||||
bnToU8a(index, BN_LE_16_OPTS)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import { bnToU8a, compactToU8a, stringToU8a, u8aConcat, u8aSorted } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
import { BN_LE_16_OPTS } from '../bn';
|
||||
import { addressToU8a } from './util';
|
||||
|
||||
const PREFIX = stringToU8a('modlpy/utilisuba');
|
||||
@@ -17,7 +18,7 @@ export function createKeyMulti (who: (HexString | Uint8Array | string)[], thresh
|
||||
PREFIX,
|
||||
compactToU8a(who.length),
|
||||
...u8aSorted(who.map(addressToU8a)),
|
||||
bnToU8a(threshold, { bitLength: 16, isLe: true })
|
||||
bnToU8a(threshold, BN_LE_16_OPTS)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { validateAddress } from '.';
|
||||
|
||||
describe('validateAddress', (): void => {
|
||||
it('decodes an address', (): void => {
|
||||
expect(
|
||||
validateAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes the council address', (): void => {
|
||||
expect(
|
||||
validateAddress('F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('converts a publicKey (hex) as-is', (): void => {
|
||||
expect(
|
||||
validateAddress('0x01020304')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a short address', (): void => {
|
||||
expect(
|
||||
validateAddress('F7NZ')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 1-byte accountId (with prefix)', (): void => {
|
||||
expect(
|
||||
validateAddress('g4b', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte accountId', (): void => {
|
||||
expect(
|
||||
validateAddress('3xygo', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('encodes a 4-byte address', (): void => {
|
||||
expect(
|
||||
validateAddress('zswfoZa', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 8-byte address', (): void => {
|
||||
expect(
|
||||
validateAddress('848Gh2GcGaZia', false, 2)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 33-byte address', (): void => {
|
||||
expect(
|
||||
validateAddress('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (65)', (): void => {
|
||||
expect(
|
||||
validateAddress('cLtA6nCDyvwKcEHH4QkZDSHMhS9s78BvUJUsKUbUAn1Jc2SCF')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (69)', (): void => {
|
||||
expect(
|
||||
validateAddress('cnUaoo5wodnTVA4bnr4woSweto8hWZADUvLFXkR9Q6U7BRsbF')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (252)', (): void => {
|
||||
expect(
|
||||
validateAddress('xw9Hca4RJTmBRgzJT4ieJBh7XCK9gE3NXBDSEmgGHd4TCrbnG')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (255)', (): void => {
|
||||
expect(
|
||||
validateAddress('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (ecdsa, from Substrate)', (): void => {
|
||||
expect(
|
||||
validateAddress('4pbsSkWcBaYoFHrKJZp5fDVUKbqSYD9dhZZGvpp3vQ5ysVs5ybV')
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('fails when length is invalid', (): void => {
|
||||
expect(
|
||||
() => validateAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
|
||||
).toThrow(/address length/);
|
||||
});
|
||||
|
||||
it('fails when the checksum does not match', (): void => {
|
||||
expect(
|
||||
() => validateAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMa9cj')
|
||||
).toThrow(/address checksum/);
|
||||
expect(
|
||||
() => validateAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaDwU')
|
||||
).toThrow(/address checksum/);
|
||||
});
|
||||
|
||||
it('fails when invalid base58 encoded address is found', (): void => {
|
||||
expect(
|
||||
() => validateAddress('F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29')
|
||||
).toThrow(/Decoding F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29: Invalid base58 character "I" \(0x49\) at index 4/);
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,53 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// https://github.com/multiformats/js-multibase/blob/master/src/constants.js
|
||||
export const BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
|
||||
export const BITS_PER_CHAR = 5;
|
||||
import { utils } from 'micro-base';
|
||||
|
||||
import { createDecode, createEncode, createIs, createValidate } from './helpers';
|
||||
|
||||
const chars = 'abcdefghijklmnopqrstuvwxyz234567';
|
||||
|
||||
const config = {
|
||||
chars,
|
||||
coder: utils.chain(
|
||||
// We define our own chain, the default base32 has padding
|
||||
utils.radix2(5),
|
||||
utils.alphabet(chars),
|
||||
{
|
||||
decode: (input: string) => input.split(''),
|
||||
encode: (input: string[]) => input.join('')
|
||||
}
|
||||
),
|
||||
ipfs: 'b',
|
||||
type: 'base32'
|
||||
};
|
||||
|
||||
/**
|
||||
* @name base32Validate
|
||||
* @summary Validates a base32 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base32, throwing exceptions if not
|
||||
*/
|
||||
export const base32Validate = createValidate(config);
|
||||
|
||||
/**
|
||||
* @name isBase32
|
||||
* @description Checks if the input is in base32, returning true/false
|
||||
*/
|
||||
export const isBase32 = createIs(base32Validate);
|
||||
|
||||
/**
|
||||
* @name base32Decode
|
||||
* @summary Delookup a base32 value.
|
||||
* @description
|
||||
* From the provided input, decode the base32 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export const base32Decode = createDecode(config, base32Validate);
|
||||
|
||||
/**
|
||||
* @name base32Encode
|
||||
* @summary Creates a base32 value.
|
||||
* @description
|
||||
* From the provided input, create the base32 and return the result as a string.
|
||||
*/
|
||||
export const base32Encode = createEncode(config);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { u8aToString } from '@polkadot/util';
|
||||
|
||||
import { base32Decode } from './';
|
||||
import { base32Decode } from '.';
|
||||
|
||||
describe('base32Decode', (): void => {
|
||||
it('decodes a base32', (): void => {
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// adapted from https://github.com/multiformats/js-multibase/blob/424709195b46ffb1d6f2f69a7707598ebe751e5e/src/rfc4648.js
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { BASE32_ALPHABET, BITS_PER_CHAR } from './bs32';
|
||||
import { base32Validate } from './validate';
|
||||
|
||||
// Build the character lookup table:
|
||||
const LOOKUP = BASE32_ALPHABET.split('').reduce<Record<string, number>>((lookup, a, i) => {
|
||||
lookup[a] = i;
|
||||
|
||||
return lookup;
|
||||
}, {});
|
||||
|
||||
/** @internal */
|
||||
function decode (output: Uint8Array, input: string, offset: number): [Uint8Array, number, number] {
|
||||
let bits = 0;
|
||||
let buffer = 0;
|
||||
let written = 0;
|
||||
|
||||
for (let i = offset; i < input.length; i++) {
|
||||
buffer = (buffer << BITS_PER_CHAR) | LOOKUP[input[i]];
|
||||
bits += BITS_PER_CHAR;
|
||||
|
||||
if (bits >= 8) {
|
||||
bits -= 8;
|
||||
output[written++] = 0xff & (buffer >> bits);
|
||||
}
|
||||
}
|
||||
|
||||
return [output, bits, buffer];
|
||||
}
|
||||
|
||||
/**
|
||||
* @name base32Decode
|
||||
* @summary Delookup a base32 value.
|
||||
* @description
|
||||
* From the provided input, decode the base32 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export function base32Decode (value: string, ipfsCompat = false): Uint8Array {
|
||||
base32Validate(value, ipfsCompat);
|
||||
|
||||
const offset = (ipfsCompat ? 1 : 0);
|
||||
const [output, bits, buffer] = decode(
|
||||
new Uint8Array(((value.length - offset) * BITS_PER_CHAR / 8) | 0),
|
||||
value,
|
||||
offset
|
||||
);
|
||||
|
||||
assert(!(bits >= BITS_PER_CHAR || 0xff & (buffer << (8 - bits))), 'Unexpected end of data');
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base58Decode } from '../base58';
|
||||
import { base32Encode } from './';
|
||||
import { base32Encode } from '.';
|
||||
|
||||
describe('base32Encode', (): void => {
|
||||
it('encodes to a base32', (): void => {
|
||||
@@ -11,6 +11,12 @@ describe('base32Encode', (): void => {
|
||||
).toEqual('irswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb');
|
||||
});
|
||||
|
||||
it('encodes to a base32 (ipfs-compat)', (): void => {
|
||||
expect(
|
||||
base32Encode('Decentralize everything!!', true)
|
||||
).toEqual('birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb');
|
||||
});
|
||||
|
||||
it('encodes a base58 to a base32', (): void => {
|
||||
expect(
|
||||
base32Encode(
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// adapted from https://github.com/multiformats/js-multibase/blob/424709195b46ffb1d6f2f69a7707598ebe751e5e/src/rfc4648.js
|
||||
|
||||
import type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { BASE32_ALPHABET, BITS_PER_CHAR } from './bs32';
|
||||
|
||||
const MASK = (1 << BITS_PER_CHAR) - 1;
|
||||
|
||||
/**
|
||||
* @name base32Encode
|
||||
* @summary Creates a base32 value.
|
||||
* @description
|
||||
* From the provided input, create the base32 and return the result as a string.
|
||||
*/
|
||||
export function base32Encode (value: U8aLike, ipfsCompat = false): string {
|
||||
const u8a = u8aToU8a(value);
|
||||
let out = '';
|
||||
let bits = 0;
|
||||
let buffer = 0;
|
||||
|
||||
for (let i = 0; i < u8a.length; ++i) {
|
||||
buffer = (buffer << 8) | u8a[i];
|
||||
bits += 8;
|
||||
|
||||
while (bits > BITS_PER_CHAR) {
|
||||
bits -= BITS_PER_CHAR;
|
||||
out += BASE32_ALPHABET[MASK & (buffer >> bits)];
|
||||
}
|
||||
}
|
||||
|
||||
if (bits) {
|
||||
out += BASE32_ALPHABET[MASK & (buffer << (BITS_PER_CHAR - bits))];
|
||||
}
|
||||
|
||||
return ipfsCompat
|
||||
? `b${out}`
|
||||
: out;
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
// re-export the type so *.d.ts files don't have ../src imports
|
||||
export type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
interface Coder {
|
||||
decode: (value: string) => Uint8Array;
|
||||
encode: (value: Uint8Array) => string;
|
||||
}
|
||||
|
||||
interface Config {
|
||||
chars: string;
|
||||
coder: Coder;
|
||||
ipfs?: string;
|
||||
regex?: RegExp;
|
||||
type: string;
|
||||
}
|
||||
|
||||
type DecodeFn = (value: string, ipfsCompat?: boolean) => Uint8Array;
|
||||
|
||||
type EncodeFn = (value: U8aLike, ipfsCompat?: boolean) => string;
|
||||
|
||||
type ValidateFn = (value?: unknown, ipfsCompat?: boolean) => value is string;
|
||||
|
||||
export function createDecode ({ coder, ipfs }: Config, validate: ValidateFn): DecodeFn {
|
||||
return (value: string, ipfsCompat?: boolean): Uint8Array => {
|
||||
validate(value, ipfsCompat);
|
||||
|
||||
return coder.decode(
|
||||
ipfs && ipfsCompat
|
||||
? value.substr(1)
|
||||
: value
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
export function createEncode ({ coder, ipfs }: Config): EncodeFn {
|
||||
return (value: U8aLike, ipfsCompat?: boolean): string => {
|
||||
const out = coder.encode(u8aToU8a(value));
|
||||
|
||||
return ipfs && ipfsCompat
|
||||
? `${ipfs}${out}`
|
||||
: out;
|
||||
};
|
||||
}
|
||||
|
||||
export function createIs (validate: ValidateFn): ValidateFn {
|
||||
return (value?: unknown, ipfsCompat?: boolean): value is string => {
|
||||
try {
|
||||
return validate(value, ipfsCompat);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
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`);
|
||||
|
||||
if (ipfs && ipfsCompat) {
|
||||
assert(value[0] === ipfs, () => `Expected ipfs-compatible ${type} to start with '${ipfs}'`);
|
||||
}
|
||||
|
||||
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
|
||||
assert(
|
||||
chars.includes(value[i]) || (
|
||||
value[i] === '=' && (
|
||||
(i === value.length - 1) ||
|
||||
!chars.includes(value[i + 1])
|
||||
)
|
||||
),
|
||||
() => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
}
|
||||
@@ -5,7 +5,4 @@
|
||||
* @summary Encode and decode base32 values
|
||||
*/
|
||||
|
||||
export { base32Decode } from './decode';
|
||||
export { base32Encode } from './encode';
|
||||
export { base32Validate } from './validate';
|
||||
export { isBase32 } from './is';
|
||||
export { base32Decode, base32Encode, base32Validate, isBase32 } from './bs32';
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isBase32 } from '.';
|
||||
|
||||
describe('isBase32', (): void => {
|
||||
it('validates encoded', (): void => {
|
||||
expect(
|
||||
isBase32('afkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', false)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('validates ipfs-compat encoded', (): void => {
|
||||
expect(
|
||||
isBase32('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', false)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('fails on invalid', (): void => {
|
||||
expect(
|
||||
isBase32('not in base32')
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('fails on non-ipfs', (): void => {
|
||||
expect(
|
||||
isBase32('afkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
).toEqual(false);
|
||||
});
|
||||
});
|
||||
@@ -1,16 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base32Validate } from './validate';
|
||||
|
||||
export function testValidator (validate: (value?: string | null, ipfsCompat?: boolean) => boolean, value?: string | null, ipfsCompat?: boolean): boolean {
|
||||
try {
|
||||
return validate(value, ipfsCompat);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function isBase32 (value?: string | null, ipfsCompat?: boolean): value is string {
|
||||
return testValidator(base32Validate, value, ipfsCompat);
|
||||
}
|
||||
@@ -4,9 +4,39 @@
|
||||
import { base32Validate } from '.';
|
||||
|
||||
describe('base32Validate', (): void => {
|
||||
it('validates encoded', (): void => {
|
||||
expect(
|
||||
base32Validate('afkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', false)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('validates ipfs-compat encoded', (): void => {
|
||||
expect(
|
||||
() => base32Validate('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
).not.toThrow();
|
||||
base32Validate('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
it('fails on empty', (): void => {
|
||||
expect(
|
||||
() => base32Validate('')
|
||||
).toThrow(/Expected/);
|
||||
});
|
||||
|
||||
it('fails on non-string', (): void => {
|
||||
expect(
|
||||
() => base32Validate(true)
|
||||
).toThrow(/Expected/);
|
||||
});
|
||||
|
||||
it('fails on invalid', (): void => {
|
||||
expect(
|
||||
() => base32Validate('not in base32')
|
||||
).toThrow(/Invalid/);
|
||||
});
|
||||
|
||||
it('fails on non-ipfs', (): void => {
|
||||
expect(
|
||||
() => base32Validate('afkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
).toThrow(/Expected/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { createValidateFn } from '../base58/validate';
|
||||
import { BASE32_ALPHABET } from './bs32';
|
||||
|
||||
/**
|
||||
* @name base32Validate
|
||||
* @summary Validates a base32 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base32
|
||||
*/
|
||||
export const base32Validate = createValidateFn({ alphabet: BASE32_ALPHABET, ipfsChar: 'b', type: 'base32' });
|
||||
@@ -1,9 +1,43 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import baseX from 'base-x';
|
||||
import { base58 } from 'micro-base';
|
||||
|
||||
// https://github.com/cryptocoinjs/base-x#alphabets
|
||||
export const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
||||
import { createDecode, createEncode, createIs, createValidate } from '../base32/helpers';
|
||||
|
||||
export const bs58 = baseX(BASE58_ALPHABET);
|
||||
const config = {
|
||||
chars: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
|
||||
coder: base58,
|
||||
ipfs: 'z',
|
||||
type: 'base58'
|
||||
};
|
||||
|
||||
/**
|
||||
* @name base58Validate
|
||||
* @summary Validates a base58 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base58, throwing exceptions if not
|
||||
*/
|
||||
export const base58Validate = createValidate(config);
|
||||
|
||||
/**
|
||||
* @name base58Decode
|
||||
* @summary Decodes a base58 value.
|
||||
* @description
|
||||
* From the provided input, decode the base58 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export const base58Decode = createDecode(config, base58Validate);
|
||||
|
||||
/**
|
||||
* @name base58Encode
|
||||
* @summary Creates a base58 value.
|
||||
* @description
|
||||
* From the provided input, create the base58 and return the result as a string.
|
||||
*/
|
||||
export const base58Encode = createEncode(config);
|
||||
|
||||
/**
|
||||
* @name isBase58
|
||||
* @description Checks if the input is in base58, returning true/false
|
||||
*/
|
||||
export const isBase58 = createIs(base58Validate);
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base32Decode } from '../base32';
|
||||
import { base58Decode } from './';
|
||||
|
||||
describe('base58Encode', (): void => {
|
||||
it('encodes a base58 to a base32', (): void => {
|
||||
expect(
|
||||
base58Decode('b2rhk6GMPQF3hfzwXTaNYFLKomMeC6UXdUt6jZKPpeVirLtV')
|
||||
).toEqual(
|
||||
base32Decode('afkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy')
|
||||
);
|
||||
});
|
||||
|
||||
it('encodes a base58 to a base32 (ipfs-compat)', (): void => {
|
||||
expect(
|
||||
base58Decode('zb2rhk6GMPQF3hfzwXTaNYFLKomMeC6UXdUt6jZKPpeVirLtV', true)
|
||||
).toEqual(
|
||||
base32Decode('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,19 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { bufferToU8a } from '@polkadot/util';
|
||||
|
||||
import { bs58 } from './bs58';
|
||||
import { base58Validate } from './validate';
|
||||
|
||||
/**
|
||||
* @name base58Decode
|
||||
* @summary Decodes a base58 value.
|
||||
* @description
|
||||
* From the provided input, decode the base58 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export function base58Decode (value: string, ipfsCompat?: boolean): Uint8Array {
|
||||
base58Validate(value, ipfsCompat);
|
||||
|
||||
return bufferToU8a(bs58.decode(value.substr(ipfsCompat ? 1 : 0)));
|
||||
}
|
||||
@@ -5,7 +5,15 @@ import { base32Decode } from '../base32';
|
||||
import { base58Encode } from './';
|
||||
|
||||
describe('base58Encode', (): void => {
|
||||
it('encodes a base32 to a base38', (): void => {
|
||||
it('encodes a base32 to a base58', (): void => {
|
||||
expect(
|
||||
base58Encode(
|
||||
base32Decode('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true)
|
||||
)
|
||||
).toEqual('b2rhk6GMPQF3hfzwXTaNYFLKomMeC6UXdUt6jZKPpeVirLtV');
|
||||
});
|
||||
|
||||
it('encodes a base32 to a base58 (ipfs-compat)', (): void => {
|
||||
expect(
|
||||
base58Encode(
|
||||
base32Decode('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy', true),
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { bs58 } from './bs58';
|
||||
|
||||
/**
|
||||
* @name base58Encode
|
||||
* @summary Creates a base58 value.
|
||||
* @description
|
||||
* From the provided input, create the base58 and return the result as a string.
|
||||
*/
|
||||
export function base58Encode (value: U8aLike, ipfsCompat?: boolean): string {
|
||||
const out = bs58.encode(u8aToU8a(value));
|
||||
|
||||
return ipfsCompat
|
||||
? `z${out}`
|
||||
: out;
|
||||
}
|
||||
@@ -5,7 +5,4 @@
|
||||
* @summary Encode and decode base58 values
|
||||
*/
|
||||
|
||||
export { base58Decode } from './decode';
|
||||
export { base58Encode } from './encode';
|
||||
export { base58Validate } from './validate';
|
||||
export { isBase58 } from './is';
|
||||
export { base58Decode, base58Encode, base58Validate, isBase58 } from './bs58';
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { testValidator } from '../base32/is';
|
||||
import { base58Validate } from './validate';
|
||||
|
||||
export function isBase58 (value?: string | null, ipfsCompat?: boolean): value is string {
|
||||
return testValidator(base58Validate, value, ipfsCompat);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { BASE58_ALPHABET } from './bs58';
|
||||
|
||||
interface CheckConfig {
|
||||
alphabet: string;
|
||||
ipfsChar: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
export function createValidateFn ({ alphabet, ipfsChar, type }: CheckConfig): (value?: unknown, ipfsCompat?: boolean) => value is string {
|
||||
return (value?: unknown, ipfsCompat?: boolean): value is string => {
|
||||
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
|
||||
assert(!ipfsCompat || value[0] === ipfsChar, () => `Expected ${type} to start with '${ipfsChar}'`);
|
||||
|
||||
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
|
||||
assert(alphabet.includes(value[i]), () => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @name base58Validate
|
||||
* @summary Validates a base58 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base58
|
||||
*/
|
||||
export const base58Validate = createValidateFn({ alphabet: BASE58_ALPHABET, ipfsChar: 'z', type: 'base58' });
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base64 } from 'micro-base';
|
||||
|
||||
import { createDecode, createEncode, createIs, createValidate } from '../base32/helpers';
|
||||
|
||||
const config = {
|
||||
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
||||
coder: base64,
|
||||
type: 'base64'
|
||||
};
|
||||
|
||||
/**
|
||||
* @name base64Validate
|
||||
* @summary Validates a base64 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base64
|
||||
*/
|
||||
export const base64Validate = createValidate(config);
|
||||
|
||||
/**
|
||||
* @name isBase64
|
||||
* @description Checks if the input is in base64, returning true/false
|
||||
*/
|
||||
export const isBase64 = createIs(base64Validate);
|
||||
|
||||
/**
|
||||
* @name base64Decode
|
||||
* @summary Decodes a base64 value.
|
||||
* @description
|
||||
* From the provided input, decode the base64 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export const base64Decode = createDecode(config, base64Validate);
|
||||
|
||||
/**
|
||||
* @name base64Encode
|
||||
* @summary Creates a base64 value.
|
||||
* @description
|
||||
* From the provided input, create the base64 and return the result as a string.
|
||||
*/
|
||||
export const base64Encode = createEncode(config);
|
||||
@@ -6,11 +6,27 @@ import { stringToU8a } from '@polkadot/util';
|
||||
import { base64Decode } from '.';
|
||||
|
||||
describe('base64Decode', (): void => {
|
||||
it('decodes a mixed base64 utf8 string', (): void => {
|
||||
it('decodes a mixed base64 utf8 string (1)', (): void => {
|
||||
expect(
|
||||
base64Decode('aGVsbG8gd29ybGQg0J/RgNC40LLQtdGC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==')
|
||||
).toEqual(
|
||||
stringToU8a('hello world Приветствую ми 你好')
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes a mixed base64 utf8 string (2)', (): void => {
|
||||
expect(
|
||||
base64Decode('4pyTIMOgIGxhIG1vZGU=')
|
||||
).toEqual(
|
||||
stringToU8a('✓ à la mode')
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes a mixed base64 utf8 string (3)', (): void => {
|
||||
expect(
|
||||
base64Decode('SGVsbG8gV29ybGQh')
|
||||
).toEqual(
|
||||
stringToU8a('Hello World!')
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import base64 from 'base64-js';
|
||||
|
||||
import { base64Validate } from './validate';
|
||||
|
||||
/**
|
||||
* @name base64Decode
|
||||
* @summary Decodes a base64 value.
|
||||
* @description
|
||||
* From the provided input, decode the base64 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export function base64Decode (value: string): Uint8Array {
|
||||
base64Validate(value);
|
||||
|
||||
return base64.toByteArray(value);
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
import base64 from 'base64-js';
|
||||
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
|
||||
/**
|
||||
* @name base64Encode
|
||||
* @summary Creates a base64 value.
|
||||
* @description
|
||||
* From the provided input, create the base64 and return the result as a string.
|
||||
*/
|
||||
export function base64Encode (value: U8aLike): string {
|
||||
return base64.fromByteArray(u8aToU8a(value));
|
||||
}
|
||||
@@ -5,9 +5,6 @@
|
||||
* @summary Encode and decode base64 values
|
||||
*/
|
||||
|
||||
export { base64Decode } from './decode';
|
||||
export { base64Encode } from './encode';
|
||||
export { base64Decode, base64Encode, base64Validate, isBase64 } from './bs64';
|
||||
export { base64Pad } from './pad';
|
||||
export { base64Trim } from './trim';
|
||||
export { base64Validate } from './validate';
|
||||
export { isBase64 } from './is';
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { base64Validate } from './validate';
|
||||
|
||||
export function isBase64 (value?: string | null): value is string {
|
||||
try {
|
||||
return base64Validate(value);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* @name base64Pad
|
||||
* @description Adds padding characters for correct length
|
||||
*/
|
||||
export function base64Pad (value: string): string {
|
||||
return value.padEnd(value.length + (value.length % 4), '=');
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* @name base64Trim
|
||||
* @description Trims padding characters
|
||||
*/
|
||||
export function base64Trim (value: string): string {
|
||||
while (value.length && value[value.length - 1] === '=') {
|
||||
value = value.slice(0, -1);
|
||||
|
||||
@@ -7,6 +7,6 @@ describe('base64Validate', (): void => {
|
||||
it('validates a mixed base64 utf8 string', (): void => {
|
||||
expect(
|
||||
() => base64Validate('aGVsbG8gd29ybGQg0J/RgNC40LLQtd^GC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==')
|
||||
).toThrow(/Invalid base64 encoding/);
|
||||
).toThrow(/Invalid base64 character "\^" \(0x5e\) at index 30/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
/**
|
||||
* @name base64Validate
|
||||
* @summary Validates a base64 value.
|
||||
* @description
|
||||
* Validates that the supplied value is valid base64
|
||||
*/
|
||||
export function base64Validate (value?: string | null): value is string {
|
||||
assert(value && typeof value === 'string', 'Expected non-null, non-empty base64 string input');
|
||||
assert(/^(?:[A-Za-z0-9+/]{2}[A-Za-z0-9+/]{2})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value), 'Invalid base64 encoding');
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from './asU8a';
|
||||
|
||||
/**
|
||||
* @name blake2AsHex
|
||||
* @summary Creates a blake2b hex from the input.
|
||||
* @description
|
||||
* From a `Uint8Array` input, create the blake2b and return the result as a hex string with the specified `bitLength`.
|
||||
* @example
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { blake2AsHex } from '@polkadot/util-crypto';
|
||||
*
|
||||
* blake2AsHex('abc'); // => 0xba80a53f981c4d0d
|
||||
* ```
|
||||
*/
|
||||
export function blake2AsHex (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): HexString {
|
||||
return u8aToHex(
|
||||
blake2AsU8a(data, bitLength, key, onlyJs)
|
||||
);
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
import { waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { performanceWasm } from '../test/performance';
|
||||
import { blake2AsU8a } from '.';
|
||||
|
||||
describe('blake2AsU8a', (): void => {
|
||||
@@ -58,4 +59,10 @@ describe('blake2AsU8a', (): void => {
|
||||
|
||||
expect(a).toEqual(b);
|
||||
});
|
||||
|
||||
describe.each([256, 512] as (256 | 512)[])('bitLength=$p', (bitLength): void => {
|
||||
performanceWasm(`blake2AsU8a, bitLength=${bitLength}`, 64000, (input, onlyJs) =>
|
||||
blake2AsU8a(input, bitLength, null, onlyJs)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,11 +3,15 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import js from 'blakejs';
|
||||
import { blake2b as blake2bJs } from '@noble/hashes/lib/blake2b';
|
||||
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { hasBigInt, u8aToU8a } from '@polkadot/util';
|
||||
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.
|
||||
@@ -22,10 +26,17 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto';
|
||||
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d]
|
||||
* ```
|
||||
*/
|
||||
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): Uint8Array {
|
||||
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: BitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
|
||||
const byteLength = Math.ceil(bitLength / 8);
|
||||
const u8a = u8aToU8a(data);
|
||||
|
||||
return isReady() && !onlyJs
|
||||
? blake2b(u8aToU8a(data), u8aToU8a(key), byteLength)
|
||||
: js.blake2b(u8aToU8a(data), key || undefined, byteLength);
|
||||
return !hasBigInt || (!onlyJs && isReady())
|
||||
? blake2b(u8a, u8aToU8a(key), byteLength)
|
||||
: blake2bJs(u8a, { dkLen: byteLength, key: key || undefined });
|
||||
}
|
||||
|
||||
/**
|
||||
* @name blake2AsHex
|
||||
* @description Creates a blake2b hex from the input.
|
||||
*/
|
||||
export const blake2AsHex = createAsHex(blake2AsU8a);
|
||||
|
||||
@@ -5,5 +5,4 @@
|
||||
* @summary Create blake2b values with specified bitlengths
|
||||
*/
|
||||
|
||||
export { blake2AsHex } from './asHex';
|
||||
export { blake2AsU8a } from './asU8a';
|
||||
export { blake2AsHex, blake2AsU8a } from './asU8a';
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export const BN_BE_OPTS = { isLe: false };
|
||||
export const BN_LE_OPTS = { isLe: true };
|
||||
|
||||
export const BN_LE_16_OPTS = { bitLength: 16, isLe: true };
|
||||
|
||||
export const BN_BE_32_OPTS = { bitLength: 32, isLe: false };
|
||||
export const BN_LE_32_OPTS = { bitLength: 32, isLe: true };
|
||||
|
||||
export const BN_BE_256_OPTS = { bitLength: 256, isLe: false };
|
||||
export const BN_LE_256_OPTS = { bitLength: 256, isLe: true };
|
||||
|
||||
export const BN_LE_512_OPTS = { bitLength: 512, isLe: true };
|
||||
@@ -12,6 +12,7 @@ export * from './base58';
|
||||
export * from './base64';
|
||||
export * from './blake2';
|
||||
export * from './crypto';
|
||||
export * from './ed25519';
|
||||
export * from './ethereum';
|
||||
export * from './hd';
|
||||
export * from './hmac';
|
||||
@@ -23,9 +24,9 @@ export * from './networks';
|
||||
export * from './nacl';
|
||||
export * from './pbkdf2';
|
||||
export * from './random';
|
||||
export * from './schnorrkel';
|
||||
export * from './scrypt';
|
||||
export * from './secp256k1';
|
||||
export * from './sha512';
|
||||
export * from './sha';
|
||||
export * from './signature';
|
||||
export * from './sr25519';
|
||||
export * from './xxhash';
|
||||
|
||||
@@ -3,9 +3,7 @@
|
||||
|
||||
import { isReady, waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
export function cryptoIsReady (): boolean {
|
||||
return isReady();
|
||||
}
|
||||
export const cryptoIsReady = isReady;
|
||||
|
||||
export function cryptoWaitReady (): Promise<boolean> {
|
||||
return waitReady()
|
||||
|
||||
@@ -1,7 +1,19 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import '@polkadot/x-bigint/shim';
|
||||
|
||||
import { utils as utilsNobleSecp256k1 } from '@noble/secp256k1';
|
||||
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { cryptoWaitReady } from './crypto';
|
||||
import { hmacSha256AsU8a } from './hmac';
|
||||
|
||||
// Set overrides on the secp256k1 utils
|
||||
// - hmacShaSync - This needs to be set, unset by default
|
||||
utilsNobleSecp256k1.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]) =>
|
||||
hmacSha256AsU8a(key, u8aConcat(...messages));
|
||||
|
||||
// start init process immediately
|
||||
cryptoWaitReady().catch((): void => {
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
|
||||
import { convertPublicKeyToCurve25519, convertSecretKeyToCurve25519 } from '.';
|
||||
|
||||
describe('convertPublicKeyToCurve25519', (): void => {
|
||||
it('converts a known key correctly', (): void => {
|
||||
expect(
|
||||
u8aToHex(convertPublicKeyToCurve25519(
|
||||
new Uint8Array([
|
||||
180, 114, 93, 155, 165, 255, 217, 82,
|
||||
16, 250, 209, 11, 193, 10, 88, 218,
|
||||
190, 190, 41, 193, 236, 252, 1, 152,
|
||||
216, 214, 0, 41, 45, 138, 13, 53
|
||||
])
|
||||
))
|
||||
).toEqual('0x5e05848ceeef4f306d6e285a26faf1a8070cf0c89f8d28ab966002fe4ad17746');
|
||||
});
|
||||
});
|
||||
|
||||
describe('convertSecretKeyToCurve25519', (): void => {
|
||||
it('converts a known key correctly', (): void => {
|
||||
expect(
|
||||
u8aToHex(convertSecretKeyToCurve25519(
|
||||
new Uint8Array([
|
||||
1, 2, 3, 4, 5, 6, 7, 8,
|
||||
1, 2, 3, 4, 5, 6, 7, 8,
|
||||
1, 2, 3, 4, 5, 6, 7, 8,
|
||||
1, 2, 3, 4, 5, 6, 7, 8
|
||||
])
|
||||
))
|
||||
).toEqual('0xd875a82940b9174dabb1c0c895485810cc2870f5808565b59d4ef708bdcf526c');
|
||||
});
|
||||
});
|
||||
+3
-1
@@ -3,10 +3,12 @@
|
||||
|
||||
import ed2curve from 'ed2curve';
|
||||
|
||||
import { assertReturn } from '@polkadot/util';
|
||||
|
||||
export function convertSecretKeyToCurve25519 (secretKey: Uint8Array): Uint8Array {
|
||||
return ed2curve.convertSecretKey(secretKey);
|
||||
}
|
||||
|
||||
export function convertPublicKeyToCurve25519 (publicKey: Uint8Array): Uint8Array {
|
||||
return ed2curve.convertPublicKey(publicKey) as Uint8Array;
|
||||
return assertReturn(ed2curve.convertPublicKey(publicKey), 'Unable to convert publicKey to ed25519');
|
||||
}
|
||||
+1
-1
@@ -7,7 +7,7 @@ import { blake2AsU8a } from '../blake2/asU8a';
|
||||
|
||||
const HDKD = compactAddLength(stringToU8a('Ed25519HDKD'));
|
||||
|
||||
export function naclDeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
|
||||
export function ed25519DeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
|
||||
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
|
||||
|
||||
return blake2AsU8a(
|
||||
@@ -0,0 +1,14 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* @summary Implements ed25519 operations
|
||||
*/
|
||||
export { convertPublicKeyToCurve25519, convertSecretKeyToCurve25519 } from './convertKey';
|
||||
export { ed25519DeriveHard } from './deriveHard';
|
||||
export { ed25519PairFromRandom } from './pair/fromRandom';
|
||||
export { ed25519PairFromSecret } from './pair/fromSecret';
|
||||
export { ed25519PairFromSeed } from './pair/fromSeed';
|
||||
export { ed25519PairFromString } from './pair/fromString';
|
||||
export { ed25519Sign } from './sign';
|
||||
export { ed25519Verify } from './verify';
|
||||
+3
-3
@@ -3,13 +3,13 @@
|
||||
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import { naclKeypairFromRandom } from '..';
|
||||
import { ed25519PairFromRandom } from '..';
|
||||
|
||||
describe('naclKeypairFromRandom', (): void => {
|
||||
describe('ed25519PairFromRandom', (): void => {
|
||||
let keypair: Keypair;
|
||||
|
||||
beforeEach((): void => {
|
||||
keypair = naclKeypairFromRandom();
|
||||
keypair = ed25519PairFromRandom();
|
||||
});
|
||||
|
||||
it('generates a valid publicKey', (): void => {
|
||||
+7
-6
@@ -3,10 +3,11 @@
|
||||
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import nacl from 'tweetnacl';
|
||||
import { randomAsU8a } from '../../random';
|
||||
import { ed25519PairFromSeed } from './fromSeed';
|
||||
|
||||
/**
|
||||
* @name naclKeypairFromRandom
|
||||
* @name ed25519PairFromRandom
|
||||
* @summary Creates a new public/secret keypair.
|
||||
* @description
|
||||
* Returns a new generate object containing a `publicKey` & `secretKey`.
|
||||
@@ -14,11 +15,11 @@ import nacl from 'tweetnacl';
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { naclKeypairFromRandom } from '@polkadot/util-crypto';
|
||||
* import { ed25519PairFromRandom } from '@polkadot/util-crypto';
|
||||
*
|
||||
* naclKeypairFromRandom(); // => { secretKey: [...], publicKey: [...] }
|
||||
* ed25519PairFromRandom(); // => { secretKey: [...], publicKey: [...] }
|
||||
* ```
|
||||
*/
|
||||
export function naclKeypairFromRandom (): Keypair {
|
||||
return nacl.sign.keyPair();
|
||||
export function ed25519PairFromRandom (): Keypair {
|
||||
return ed25519PairFromSeed(randomAsU8a());
|
||||
}
|
||||
+3
-3
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { naclKeypairFromSecret } from '..';
|
||||
import { ed25519PairFromSecret } from '..';
|
||||
|
||||
describe('naclKeypairFromSecret', (): void => {
|
||||
describe('ed25519PairFromSecret', (): void => {
|
||||
const secretKey = new Uint8Array([
|
||||
18, 52, 86, 120, 144, 18, 52, 86,
|
||||
120, 144, 18, 52, 86, 120, 144, 18,
|
||||
@@ -17,7 +17,7 @@ describe('naclKeypairFromSecret', (): void => {
|
||||
|
||||
it('generates a valid publicKey/secretKey pair', (): void => {
|
||||
expect(
|
||||
naclKeypairFromSecret(secretKey)
|
||||
ed25519PairFromSecret(secretKey)
|
||||
).toEqual({
|
||||
publicKey: new Uint8Array([
|
||||
180, 114, 93, 155, 165, 255, 217, 82,
|
||||
+4
-4
@@ -6,7 +6,7 @@ import type { Keypair } from '../../types';
|
||||
import nacl from 'tweetnacl';
|
||||
|
||||
/**
|
||||
* @name naclKeypairFromSecret
|
||||
* @name ed25519PairFromSecret
|
||||
* @summary Creates a new public/secret keypair from a secret.
|
||||
* @description
|
||||
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied secret.
|
||||
@@ -14,11 +14,11 @@ import nacl from 'tweetnacl';
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { naclKeypairFromSecret } from '@polkadot/util-crypto';
|
||||
* import { ed25519PairFromSecret } from '@polkadot/util-crypto';
|
||||
*
|
||||
* naclKeypairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
|
||||
* ed25519PairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
|
||||
* ```
|
||||
*/
|
||||
export function naclKeypairFromSecret (secret: Uint8Array): Keypair {
|
||||
export function ed25519PairFromSecret (secret: Uint8Array): Keypair {
|
||||
return nacl.sign.keyPair.fromSecretKey(secret);
|
||||
}
|
||||
+3
-3
@@ -4,9 +4,9 @@
|
||||
import { stringToU8a } from '@polkadot/util';
|
||||
import { waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import { naclKeypairFromSeed } from '..';
|
||||
import { ed25519PairFromSeed } from '..';
|
||||
|
||||
describe('naclKeypairFromSeed', (): void => {
|
||||
describe('ed25519PairFromSeed', (): void => {
|
||||
// NOTE: Aligned with Rust test, b"12345678901234567890123456789012"
|
||||
const TEST = stringToU8a('12345678901234567890123456789012');
|
||||
const RESULT = {
|
||||
@@ -33,7 +33,7 @@ describe('naclKeypairFromSeed', (): void => {
|
||||
it('generates a valid publicKey/secretKey pair (u8a)', (): void => {
|
||||
[true, false].forEach((onlyJs): void => {
|
||||
expect(
|
||||
naclKeypairFromSeed(TEST, onlyJs)
|
||||
ed25519PairFromSeed(TEST, onlyJs)
|
||||
).toEqual(RESULT);
|
||||
});
|
||||
});
|
||||
+4
-4
@@ -8,7 +8,7 @@ import nacl from 'tweetnacl';
|
||||
import { ed25519KeypairFromSeed, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
* @name naclKeypairFromSeed
|
||||
* @name ed25519PairFromSeed
|
||||
* @summary Creates a new public/secret keypair from a seed.
|
||||
* @description
|
||||
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied seed.
|
||||
@@ -16,12 +16,12 @@ import { ed25519KeypairFromSeed, isReady } from '@polkadot/wasm-crypto';
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { naclKeypairFromSeed } from '@polkadot/util-crypto';
|
||||
* import { ed25519PairFromSeed } from '@polkadot/util-crypto';
|
||||
*
|
||||
* naclKeypairFromSeed(...); // => { secretKey: [...], publicKey: [...] }
|
||||
* ed25519PairFromSeed(...); // => { secretKey: [...], publicKey: [...] }
|
||||
* ```
|
||||
*/
|
||||
export function naclKeypairFromSeed (seed: Uint8Array, onlyJs = false): Keypair {
|
||||
export function ed25519PairFromSeed (seed: Uint8Array, onlyJs?: boolean): Keypair {
|
||||
if (!onlyJs && isReady()) {
|
||||
const full = ed25519KeypairFromSeed(seed);
|
||||
|
||||
+3
-3
@@ -1,12 +1,12 @@
|
||||
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { naclKeypairFromString } from '..';
|
||||
import { ed25519PairFromString } from '..';
|
||||
|
||||
describe('naclKeypairFromSeed', (): void => {
|
||||
describe('ed25519PairFromSeed', (): void => {
|
||||
it('generates a valid publicKey/secretKey pair', (): void => {
|
||||
expect(
|
||||
naclKeypairFromString('test')
|
||||
ed25519PairFromString('test')
|
||||
).toEqual({
|
||||
publicKey: new Uint8Array([188, 108, 179, 142, 36, 142, 76, 87, 77, 193, 147, 139, 254, 110, 196, 217, 117, 233, 167, 165, 250, 150, 247, 237, 198, 68, 129, 4, 211, 209, 136, 48]),
|
||||
secretKey: new Uint8Array([146, 139, 32, 54, 105, 67, 226, 175, 209, 30, 188, 14, 174, 46, 83, 169, 59, 241, 119, 164, 252, 243, 91, 204, 100, 213, 3, 112, 78, 101, 226, 2, 188, 108, 179, 142, 36, 142, 76, 87, 77, 193, 147, 139, 254, 110, 196, 217, 117, 233, 167, 165, 250, 150, 247, 237, 198, 68, 129, 4, 211, 209, 136, 48])
|
||||
+7
-8
@@ -6,10 +6,10 @@ import type { Keypair } from '../../types';
|
||||
import { stringToU8a } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from '../../blake2/asU8a';
|
||||
import { naclKeypairFromSeed } from './fromSeed';
|
||||
import { ed25519PairFromSeed } from './fromSeed';
|
||||
|
||||
/**
|
||||
* @name naclKeypairFromString
|
||||
* @name ed25519PairFromString
|
||||
* @summary Creates a new public/secret keypair from a string.
|
||||
* @description
|
||||
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied string. The string is hashed and the value used as the input seed.
|
||||
@@ -17,16 +17,15 @@ import { naclKeypairFromSeed } from './fromSeed';
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { naclKeypairFromString } from '@polkadot/util-crypto';
|
||||
* import { ed25519PairFromString } from '@polkadot/util-crypto';
|
||||
*
|
||||
* naclKeypairFromString('test'); // => { secretKey: [...], publicKey: [...] }
|
||||
* ed25519PairFromString('test'); // => { secretKey: [...], publicKey: [...] }
|
||||
* ```
|
||||
*/
|
||||
export function naclKeypairFromString (value: string): Keypair {
|
||||
return naclKeypairFromSeed(
|
||||
export function ed25519PairFromString (value: string): Keypair {
|
||||
return ed25519PairFromSeed(
|
||||
blake2AsU8a(
|
||||
stringToU8a(value),
|
||||
256
|
||||
stringToU8a(value)
|
||||
)
|
||||
);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user