Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed70e5c65f | ||
|
|
ca6f157007 | ||
|
|
6c30e328bb | ||
|
|
1f6f3c67a8 | ||
|
|
d19e2c8469 | ||
|
|
92f479e0e5 | ||
|
|
25f9444c53 | ||
|
|
6d46f8b24e | ||
|
|
0189cdabe9 | ||
|
|
9d61c2c96c | ||
|
|
6599b41155 | ||
|
|
9c05257046 | ||
|
|
41e2e67fd0 | ||
|
|
092fbdd923 | ||
|
|
c1cdc80169 | ||
|
|
306bbdea12 | ||
|
|
f41519e185 | ||
|
|
1a3fd344b5 | ||
|
|
f798c1dbd5 | ||
|
|
813d358999 | ||
|
|
e85eb35413 | ||
|
|
8a50cba394 | ||
|
|
20f030e987 | ||
|
|
4a683f41d3 | ||
|
|
ea7f59ab73 | ||
|
|
60498f7f36 | ||
|
|
9ad0c46417 | ||
|
|
0fc140f838 | ||
|
|
cd63bb695d | ||
|
|
7eac688074 | ||
|
|
820a5e4077 | ||
|
|
bc0f69aef0 | ||
|
|
5074adf690 | ||
|
|
8461d105d6 | ||
|
|
cd246e2381 | ||
|
|
8a499bf1bf | ||
|
|
5b2ec8e4d6 | ||
|
|
4a06d1382f | ||
|
|
66ac9e15a6 | ||
|
|
0e55357053 | ||
|
|
b4b80bbf67 | ||
|
|
4355b9b066 | ||
|
|
5c92e095ff | ||
|
|
4fedd594f1 | ||
|
|
6f05fa6634 | ||
|
|
856e93f4a0 | ||
|
|
195e42ec11 | ||
|
|
16e90aadfc | ||
|
|
bcdf5ba26e | ||
|
|
ae9a04e557 | ||
|
|
4b37a82fb3 | ||
|
|
1b69bb9dfa | ||
|
|
e8f703f850 | ||
|
|
3ad4455fe1 | ||
|
|
1f6a263a8e | ||
|
|
73073529bb | ||
|
|
e1bdac1ba5 | ||
|
|
56c619944c | ||
|
|
4c60b98b07 | ||
|
|
2f9f007547 | ||
|
|
d00184fff7 | ||
|
|
e1e3a1699f | ||
|
|
90a1837978 | ||
|
|
c96ad1a34e | ||
|
|
b1eda9efe9 | ||
|
|
2184ae8511 | ||
|
|
ce94314992 | ||
|
|
eea3596847 | ||
|
|
37e78f7abd | ||
|
|
4bb2c83213 | ||
|
|
3828d941a9 | ||
|
|
c92d5cfb20 | ||
|
|
70d2250b3b | ||
|
|
a46279876f | ||
|
|
4267c4ac76 | ||
|
|
e09dfcffbe | ||
|
|
b722291de2 | ||
|
|
4367bb0f68 | ||
|
|
1d71f67e2a | ||
|
|
2d4995b16e | ||
|
|
b96cfd36cf | ||
|
|
9f53838626 | ||
|
|
478dd6ccd9 | ||
|
|
fd313c2e91 | ||
|
|
66b58ea5f2 | ||
|
|
66acbe04af | ||
|
|
2194cc58d7 | ||
|
|
768f64aec7 | ||
|
|
2176bedd50 | ||
|
|
8273eb5441 | ||
|
|
76af1b8822 | ||
|
|
80eb70a382 | ||
|
|
7e01b2b256 | ||
|
|
b30bed8707 | ||
|
|
d79813065f | ||
|
|
7e12949146 | ||
|
|
5ca6575245 | ||
|
|
4cadf3bcb7 | ||
|
|
81f8f16b98 | ||
|
|
8edfb1139f | ||
|
|
69d1d896d1 | ||
|
|
3bc62adf6f |
@@ -1 +0,0 @@
|
||||
9.6.2
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
8
|
||||
2.6.2
|
||||
2.12.2
|
||||
5.2.2
|
||||
5.2.3
|
||||
5.4.2
|
||||
5.4.3
|
||||
5.4.4
|
||||
5.5.2
|
||||
5.6.2
|
||||
5.6.3
|
||||
5.9.2
|
||||
6.0.2
|
||||
6.0.3
|
||||
6.0.4
|
||||
6.0.5
|
||||
|
||||
7.0.2
|
||||
7.0.3
|
||||
7.1.2
|
||||
7.8.2
|
||||
7.9.2
|
||||
8.0.2
|
||||
8.0.3
|
||||
8.0.4
|
||||
8.0.5
|
||||
8.1.2
|
||||
8.2.2
|
||||
8.3.2
|
||||
8.3.3
|
||||
9.6.2
|
||||
+49
-13
@@ -1,50 +1,86 @@
|
||||
<!--
|
||||
|
||||
For general support, howto, coding and bundling questions, please use the Substrate & Polkadot StackExchange at https://substrate.stackexchange.com/ and get other ecosystem developers involved. This issues in this repository are meant for the tracking of feature requests and bug reports.
|
||||
For general support, howto, coding and bundling questions, please
|
||||
use the Substrate & Polkadot StackExchange at
|
||||
|
||||
While all issues are looked at non-bug and non-features would take quite a bit longer to get to and may yield less than satisfactory responses in this format.
|
||||
https://substrate.stackexchange.com/
|
||||
|
||||
Additionally, please ensure you have done a search on the existing and closed issues before logging a new request. This saves time on all sides.
|
||||
and get other ecosystem developers involved. This issues in this
|
||||
repository are meant for the tracking of feature requests and bug
|
||||
reports.
|
||||
|
||||
While all issues are looked at non-bug and non-features would take
|
||||
quite a bit longer to get to and may yield less than satisfactory
|
||||
responses in this format.
|
||||
|
||||
Additionally, please ensure you have done a search on the existing
|
||||
and closed issues before logging a new request. This saves time on
|
||||
all sides.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **I'm submitting a ...**
|
||||
|
||||
<!--- Try and classify your actual report -->
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
Classify the type of report your are submitting
|
||||
|
||||
-->
|
||||
|
||||
- [ ] Bug report
|
||||
- [ ] Feature request
|
||||
- [ ] Support request (please bear the comments above in mind)
|
||||
- [ ] Support request
|
||||
- [ ] Other
|
||||
|
||||
|
||||
* **What is the current behavior and expected behavior?**
|
||||
|
||||
<!--- If you're describing a bug, tell us what should happen -->
|
||||
<!--- If you're suggesting a change/improvement, tell us how it should work -->
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
If you're describing a bug, tell us what should happen. If you're
|
||||
suggesting a change/improvement, tell us how it should work.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **What is the motivation for changing the behavior?**
|
||||
|
||||
<!--- Not obligatory, but suggest a motivation for the request -->
|
||||
<!--- or ideas how to implement the addition or change -->
|
||||
<!---
|
||||
|
||||
OPTIONAL:
|
||||
|
||||
Suggest a motivation for the request or ideas how to implement the
|
||||
addition or change
|
||||
|
||||
-->
|
||||
|
||||
|
||||
* **Please tell us about your environment:**
|
||||
|
||||
<!--- Include as many relevant details about the environment you experienced the issue in -->
|
||||
<!--- Also snsure that you have tested against the latest stable releases if a bug -->
|
||||
<!---
|
||||
|
||||
REQUIRED:
|
||||
|
||||
Include as many relevant details about the environment in which you
|
||||
experienced the issue. Also ensure that you have tested against the
|
||||
latest stable releases if you believe this to be a bug
|
||||
|
||||
-->
|
||||
|
||||
- Version:
|
||||
- Environment:
|
||||
|
||||
- [ ] Node.js
|
||||
- [ ] Browser
|
||||
- [ ] Other (limited support for other environments available)
|
||||
- [ ] Other (limited support for other environments)
|
||||
|
||||
- Language:
|
||||
|
||||
- [ ] JavaScript
|
||||
- [ ] TypeScript
|
||||
- [ ] TypeScript (include tsc --version)
|
||||
- [ ] Other
|
||||
|
||||
@@ -5,7 +5,7 @@ jobs:
|
||||
pr:
|
||||
strategy:
|
||||
matrix:
|
||||
step: ['lint', 'test', 'build']
|
||||
step: ['lint', 'test', 'build', 'deno']
|
||||
name: ${{ matrix.step }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
@@ -13,7 +13,11 @@ jobs:
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: denoland/setup-deno@v1
|
||||
with:
|
||||
deno-version: vx.x.x
|
||||
- name: ${{ matrix.step }}
|
||||
if: always()
|
||||
run: |
|
||||
yarn install --immutable | grep -v 'YN0013'
|
||||
yarn ${{ matrix.step }}
|
||||
|
||||
+3
-7
@@ -1,14 +1,12 @@
|
||||
--test-*
|
||||
_book/
|
||||
build/
|
||||
build-cjs/
|
||||
build-esm/
|
||||
build-deno/
|
||||
build-docs/
|
||||
build-*/
|
||||
coverage/
|
||||
docs/.vuepress/dist/
|
||||
node_modules/
|
||||
tmp/
|
||||
/import_map.json
|
||||
/mod.ts
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
@@ -27,6 +25,4 @@ npm-debug.log*
|
||||
package-lock.json
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
store.db
|
||||
store.db.compacted
|
||||
tsconfig.*buildinfo
|
||||
|
||||
@@ -1,5 +1,68 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 10.1.2 Jul 29, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.1 Jul 21, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `arrayUnzip` as reverse of `arrayZip`
|
||||
- Adjust `objectSpread` to natively handle `Map` entries spreads
|
||||
- Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters
|
||||
- Adjust `nobody` zero-key pair with pre-computed address
|
||||
- Align `objectProperty` & `lazyMethod` call signatures (backwards compatible)
|
||||
- Various internal speed optimizations
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.0.2 Jul 10, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust async import in `x-fetch` to be Jest-friendly
|
||||
|
||||
|
||||
## 10.0.1 Jul 8, 2022
|
||||
|
||||
- **Breaking change** In this major version version previously deprecated function signatures have been removed. If still using the old forms for either `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn` or `u8aToBn`, please update and only pass through an options object as the second parameter.
|
||||
|
||||
Contributed:
|
||||
|
||||
- Ledger support for Stafi (Thanks to https://github.com/kaelnew)
|
||||
- Ledger support for Aleph Zero (Thanks to https://github.com/carlosala)
|
||||
- Add genesis for HydraDX parachain (Thanks to https://github.com/jak-pan)
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove deprecated signatures for `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn`, `u8aToBn`
|
||||
- Align option handling of `n*` (BigInt) functions with `bn*` (BN)
|
||||
- Allow for usage without `@types/node` installed
|
||||
- Adjust for available ESM-only dependencies
|
||||
- Upgrade dependencies to latest stable versions
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.3
|
||||
|
||||
|
||||
## 9.7.2 Jul 4, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.2
|
||||
|
||||
|
||||
## 9.7.1 Jul 1, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Update signatures where `readonly` arrays are used
|
||||
- Upgrade dependencies to latest stable versions
|
||||
- Upgrade to `@polkadot/wasm-crypto` 6.2.1
|
||||
|
||||
|
||||
## 9.6.2 Jun 25, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
+4
-3
@@ -1,10 +1,10 @@
|
||||
1388 Jaco Fix `hexToU8a` where `0x` is not correctly converted (#1567)
|
||||
1435 Jaco 10.1.2 (#1617)
|
||||
9 Antoine Estienne Add eth uri keyring test (#1291)
|
||||
6 Amaury Martiny Add tests from Rust (#283)
|
||||
6 Carlo Sala feat(ledger): add interlay and unique (#1609)
|
||||
5 Jakub Pánik Add HydraDX parachain to genesis (#1583)
|
||||
5 kwingram25 Add BN consts and timeToString (#610)
|
||||
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
||||
4 Carlo Sala add Composable support for ledger (#1515)
|
||||
4 Jakub Pánik Add basilisk 🐍 (#1396)
|
||||
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
||||
3 pan update bifrost genesis hash (#1521)
|
||||
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
||||
@@ -30,6 +30,7 @@
|
||||
1 Jake Naviasky Add evmToAddress and addressToEvm crypto utils. (#705)
|
||||
1 JesseAbram added check if valid address to docs (#440)
|
||||
1 joe petrowski Add example for multisig address creation (#590)
|
||||
1 kaelnew add ledger support for stafi (#1569)
|
||||
1 Lezek123 logger - wildcard include/exclude with DEBUG env (#932)
|
||||
1 Mario Neises remove redudant export (#257)
|
||||
1 Miguel Hervas Add CFG Ledger Support (#1057)
|
||||
|
||||
+11
-6
@@ -10,7 +10,12 @@
|
||||
"url": "https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"version": "9.6.2",
|
||||
"type": "module",
|
||||
"version": "10.1.2",
|
||||
"versions": {
|
||||
"git": "10.1.2",
|
||||
"npm": "10.1.2"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
@@ -19,17 +24,17 @@
|
||||
"build:release": "polkadot-ci-ghact-build",
|
||||
"build:rollup": "polkadot-exec-rollup --config",
|
||||
"clean": "polkadot-dev-clean-build",
|
||||
"deno": "yarn polkadot-dev-deno-map && yarn build && deno check --import-map=import_map.json mod.ts",
|
||||
"lint": "polkadot-dev-run-lint",
|
||||
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
|
||||
"postinstall": "polkadot-dev-yarn-only",
|
||||
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
|
||||
"test": "NODE_OPTIONS=--experimental-vm-modules polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
|
||||
"test:mnemonicCmp": "polkadot-dev-run-test packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts",
|
||||
"test:one": "polkadot-dev-run-test --runInBand"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.18.5",
|
||||
"@polkadot/dev": "^0.67.42",
|
||||
"@types/jest": "^28.1.3"
|
||||
"@babel/core": "^7.18.9",
|
||||
"@polkadot/dev": "^0.67.86",
|
||||
"@types/jest": "^28.1.6"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^4.7.4"
|
||||
|
||||
@@ -16,18 +16,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.1",
|
||||
"@polkadot/util": "9.6.2"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.2",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.2",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.2",
|
||||
"@polkadot/util": "10.1.2"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.1"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@polkadot/hw-ledger-transports": "9.6.2",
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@zondax/ledger-substrate": "^0.31.0"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.2",
|
||||
"@polkadot/hw-ledger-transports": "10.1.2",
|
||||
"@polkadot/util": "10.1.2",
|
||||
"@zondax/ledger-substrate": "^0.33.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,12 @@
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { newAcalaApp, newAstarApp, newBifrostApp, newCentrifugeApp, newComposableApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp, newStatemintApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||
import { newAcalaApp, newAlephZeroApp, newAstarApp, newBifrostApp, newCentrifugeApp, newComposableApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newInterlayApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStafiApp, newStatemineApp, newStatemintApp, newUniqueApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
||||
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
acala: newAcalaApp,
|
||||
'aleph-node': newAlephZeroApp,
|
||||
astar: newAstarApp,
|
||||
bifrost: newBifrostApp,
|
||||
centrifuge: newCentrifugeApp,
|
||||
@@ -17,6 +18,7 @@ export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp>
|
||||
edgeware: newEdgewareApp,
|
||||
equilibrium: newEquilibriumApp,
|
||||
genshiro: newGenshiroApp,
|
||||
'interlay-parachain': newInterlayApp,
|
||||
karura: newKaruraApp,
|
||||
kusama: newKusamaApp,
|
||||
'nodle-para': newNodleApp,
|
||||
@@ -25,7 +27,9 @@ export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp>
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp,
|
||||
sora: newSoraApp,
|
||||
stafi: newStafiApp,
|
||||
statemine: newStatemineApp,
|
||||
statemint: newStatemintApp,
|
||||
unique: newUniqueApp,
|
||||
xxnetwork: newXXNetworkApp
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -20,15 +20,15 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@polkadot/util-crypto": "9.6.2"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.2",
|
||||
"@polkadot/util-crypto": "10.1.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@polkadot/util-crypto": "9.6.2"
|
||||
"@polkadot/util": "10.1.2",
|
||||
"@polkadot/util-crypto": "10.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, u8aEq } from '@polkadot/util';
|
||||
import { u8aEq } from '@polkadot/util';
|
||||
import { jsonDecryptData } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
|
||||
@@ -22,7 +22,9 @@ export function decodePair (passphrase?: string, encrypted?: Uint8Array | null,
|
||||
const decrypted = jsonDecryptData(encrypted, passphrase, encType);
|
||||
const header = decrypted.subarray(0, PKCS8_HEADER.length);
|
||||
|
||||
assert(u8aEq(header, PKCS8_HEADER), 'Invalid Pkcs8 header found in body');
|
||||
if (!u8aEq(header, PKCS8_HEADER)) {
|
||||
throw new Error('Invalid Pkcs8 header found in body');
|
||||
}
|
||||
|
||||
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
|
||||
let divOffset = SEED_OFFSET + SEC_LENGTH;
|
||||
@@ -34,7 +36,9 @@ export function decodePair (passphrase?: string, encrypted?: Uint8Array | null,
|
||||
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
|
||||
divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
|
||||
|
||||
assert(u8aEq(divider, PKCS8_DIVIDER), 'Invalid Pkcs8 divider found in body');
|
||||
if (!u8aEq(divider, PKCS8_DIVIDER)) {
|
||||
throw new Error('Invalid Pkcs8 divider found in body');
|
||||
}
|
||||
}
|
||||
|
||||
const pubOffset = divOffset + PKCS8_DIVIDER.length;
|
||||
|
||||
@@ -3,13 +3,15 @@
|
||||
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
|
||||
|
||||
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
|
||||
assert(secretKey, 'Expected a valid secretKey to be passed to encode');
|
||||
if (!secretKey) {
|
||||
throw new Error('Expected a valid secretKey to be passed to encode');
|
||||
}
|
||||
|
||||
const encoded = u8aConcat(
|
||||
PKCS8_HEADER,
|
||||
|
||||
@@ -217,11 +217,11 @@ describe('pair', (): void => {
|
||||
});
|
||||
|
||||
it('allows derivation on the pair', (): void => {
|
||||
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: PAIRSSR25519[0].publicKey, secretKey: PAIRSSR25519[0].secretKey }, {});
|
||||
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: hexToU8a(PAIRSSR25519[0].p), secretKey: hexToU8a(PAIRSSR25519[0].s) }, {});
|
||||
const stash = alice.derive('//stash');
|
||||
const soft = alice.derive('//funding/0');
|
||||
|
||||
expect(stash.publicKey).toEqual(PAIRSSR25519[1].publicKey);
|
||||
expect(stash.publicKey).toEqual(hexToU8a(PAIRSSR25519[1].p));
|
||||
expect(soft.address).toEqual('5ECQNn7UueWHPFda5qUi4fTmTtyCnPvGnuoyVVSj5CboJh9J');
|
||||
});
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclOpen, naclSeal, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';
|
||||
|
||||
import { decodePair } from './decode';
|
||||
@@ -145,8 +145,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
// eslint-disable-next-line sort-keys
|
||||
decodePkcs8,
|
||||
decryptMessage: (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null => {
|
||||
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
|
||||
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot encrypt with a locked key pair');
|
||||
} else if (['ecdsa', 'ethereum'].includes(type)) {
|
||||
throw new Error('Secp256k1 not supported yet');
|
||||
}
|
||||
|
||||
const messageU8a = u8aToU8a(encryptedMessageWithNonce);
|
||||
|
||||
@@ -158,8 +161,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
);
|
||||
},
|
||||
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair => {
|
||||
assert(type !== 'ethereum', 'Unable to derive on this keypair');
|
||||
assert(!isLocked(secretKey), 'Cannot derive on a locked keypair');
|
||||
if (type === 'ethereum') {
|
||||
throw new Error('Unable to derive on this keypair');
|
||||
} else if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot derive on a locked keypair');
|
||||
}
|
||||
|
||||
const { path } = keyExtractPath(suri);
|
||||
const derived = keyFromPath({ publicKey, secretKey }, path, type);
|
||||
@@ -170,8 +176,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
return recode(passphrase);
|
||||
},
|
||||
encryptMessage: (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
|
||||
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot encrypt with a locked key pair');
|
||||
} else if (['ecdsa', 'ethereum'].includes(type)) {
|
||||
throw new Error('Secp256k1 not supported yet');
|
||||
}
|
||||
|
||||
const { nonce, sealed } = naclSeal(u8aToU8a(message), convertSecretKeyToCurve25519(secretKey), convertPublicKeyToCurve25519(u8aToU8a(recipientPublicKey)), nonceIn);
|
||||
|
||||
@@ -184,7 +193,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
meta = objectSpread({}, meta, additional);
|
||||
},
|
||||
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
|
||||
return u8aConcat(
|
||||
options.withType
|
||||
@@ -212,7 +223,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
|
||||
return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;
|
||||
},
|
||||
vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
if (isLocked(secretKey)) {
|
||||
throw new Error('Cannot sign with a locked key pair');
|
||||
}
|
||||
|
||||
if (type === 'sr25519') {
|
||||
return sr25519VrfSign(message, { secretKey }, context, extra);
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
|
||||
import { encodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
// empty publicKey
|
||||
const publicKey = new Uint8Array(32);
|
||||
const address = encodeAddress(publicKey);
|
||||
|
||||
// pre-computed via encodeAddress(publicKey)
|
||||
const address = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
|
||||
|
||||
const meta = {
|
||||
isTesting: true,
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
// Copyright 2017-2022 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringInstance, KeyringOptions } from './types';
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
import { KeypairType } from '@polkadot/util-crypto/types';
|
||||
|
||||
import { Keyring } from './keyring';
|
||||
import { createPair } from './pair';
|
||||
|
||||
interface PairDef {
|
||||
name?: string;
|
||||
publicKey: Uint8Array;
|
||||
p: HexString;
|
||||
s: HexString;
|
||||
seed?: string;
|
||||
secretKey?: Uint8Array;
|
||||
type: KeypairType
|
||||
}
|
||||
|
||||
@@ -23,50 +24,50 @@ interface PairDef {
|
||||
// adding the keys when only the keyring is used.
|
||||
export const PAIRSSR25519: PairDef[] = [
|
||||
{
|
||||
publicKey: hexToU8a('0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'),
|
||||
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'), // nosemgrep
|
||||
p: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
|
||||
s: '0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011', // nosemgrep
|
||||
seed: 'Alice',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'),
|
||||
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'), // nosemgrep
|
||||
p: '0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f',
|
||||
s: '0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd', // nosemgrep
|
||||
seed: 'Alice//stash',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48'),
|
||||
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'), // nosemgrep
|
||||
p: '0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48',
|
||||
s: '0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325', // nosemgrep
|
||||
seed: 'Bob',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e'),
|
||||
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'), // nosemgrep
|
||||
p: '0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e',
|
||||
s: '0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde', // nosemgrep
|
||||
seed: 'Bob//stash',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22'),
|
||||
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'), // nosemgrep
|
||||
p: '0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22',
|
||||
s: '0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c', // nosemgrep
|
||||
seed: 'Charlie',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20'),
|
||||
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'), // nosemgrep
|
||||
p: '0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20',
|
||||
s: '0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568', // nosemgrep
|
||||
seed: 'Dave',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e'),
|
||||
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'), // nosemgrep
|
||||
p: '0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e',
|
||||
s: '0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587', // nosemgrep
|
||||
seed: 'Eve',
|
||||
type: 'sr25519'
|
||||
},
|
||||
{
|
||||
publicKey: hexToU8a('0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c'),
|
||||
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'), // nosemgrep
|
||||
p: '0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c',
|
||||
s: '0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426', // nosemgrep
|
||||
seed: 'Ferdie',
|
||||
type: 'sr25519'
|
||||
}
|
||||
@@ -75,38 +76,38 @@ export const PAIRSSR25519: PairDef[] = [
|
||||
export const PAIRSETHEREUM: PairDef[] = [
|
||||
{
|
||||
name: 'Alith',
|
||||
publicKey: hexToU8a('0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f'),
|
||||
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'), // nosemgrep
|
||||
p: '0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f',
|
||||
s: '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Baltathar',
|
||||
publicKey: hexToU8a('0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518'),
|
||||
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'), // nosemgrep
|
||||
p: '0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518',
|
||||
s: '0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Charleth',
|
||||
publicKey: hexToU8a('0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e'),
|
||||
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'), // nosemgrep
|
||||
p: '0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e',
|
||||
s: '0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Dorothy',
|
||||
publicKey: hexToU8a('0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c'),
|
||||
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'), // nosemgrep
|
||||
p: '0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c',
|
||||
s: '0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Ethan',
|
||||
publicKey: hexToU8a('0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa'),
|
||||
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'), // nosemgrep
|
||||
p: '0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa',
|
||||
s: '0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4', // nosemgrep
|
||||
type: 'ethereum'
|
||||
},
|
||||
{
|
||||
name: 'Faith',
|
||||
publicKey: hexToU8a('0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74'),
|
||||
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'), // nosemgrep
|
||||
p: '0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74',
|
||||
s: '0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df', // nosemgrep
|
||||
type: 'ethereum'
|
||||
}
|
||||
];
|
||||
@@ -130,16 +131,20 @@ function createMeta (name?: string, seed?: string) {
|
||||
*/
|
||||
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
|
||||
const keyring = new Keyring(options);
|
||||
const pairs = (options.type && options.type === 'ethereum')
|
||||
const pairs = options.type === 'ethereum'
|
||||
? PAIRSETHEREUM
|
||||
: PAIRSSR25519;
|
||||
|
||||
for (const { name, publicKey, secretKey, seed, type } of pairs) {
|
||||
for (const { name, p, s, seed, type } of pairs) {
|
||||
const meta = createMeta(name, seed);
|
||||
const pair = !isDerived && !name && seed
|
||||
? keyring.addFromUri(seed, meta, options.type)
|
||||
: keyring.addPair(
|
||||
createPair({ toSS58: keyring.encodeAddress, type }, { publicKey, secretKey }, meta)
|
||||
createPair(
|
||||
{ toSS58: keyring.encodeAddress, type },
|
||||
{ publicKey: hexToU8a(p), secretKey: hexToU8a(s) },
|
||||
meta
|
||||
)
|
||||
);
|
||||
|
||||
pair.lock = (): void => {
|
||||
|
||||
@@ -17,15 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@substrate/ss58-registry": "^1.22.0"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.2",
|
||||
"@substrate/ss58-registry": "^1.25.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/hw-ledger": "9.6.2",
|
||||
"@polkadot/x-fetch": "9.6.2"
|
||||
"@polkadot/hw-ledger": "10.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
// Copyright 2017-2022 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Ss58Registry } from './types';
|
||||
|
||||
import fs from 'fs';
|
||||
|
||||
import { objectKeys, stringify } from '@polkadot/util';
|
||||
import { fetch } from '@polkadot/x-fetch';
|
||||
|
||||
import { allNetworks } from './';
|
||||
|
||||
const REGISTRY = 'https://raw.githubusercontent.com/paritytech/ss58-registry/main/ss58-registry.json';
|
||||
const OUTPUT = './.github/ss58-check.md';
|
||||
|
||||
function assertAndLog (check: boolean, error: string): void {
|
||||
if (!check) {
|
||||
process.env.CI_LOG && fs.appendFileSync(OUTPUT, `
|
||||
|
||||
${error}
|
||||
`);
|
||||
|
||||
throw new Error(error);
|
||||
}
|
||||
}
|
||||
|
||||
describe('check latest Substrate ss58 registry', (): void => {
|
||||
let original: Ss58Registry;
|
||||
|
||||
beforeAll(async (): Promise<void> => {
|
||||
original = (await (await fetch(REGISTRY)).json()) as Ss58Registry;
|
||||
});
|
||||
|
||||
it('has the same number as the original', (): void => {
|
||||
assertAndLog(allNetworks.length === original.registry.length, `Number of entries mismatched:: Expected ${original.registry.length} found ${allNetworks.length}`);
|
||||
});
|
||||
|
||||
it('has no missing any entries', (): void => {
|
||||
const missing = original.registry
|
||||
.filter(({ prefix }) => !allNetworks.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has no extra entries', (): void => {
|
||||
const missing = allNetworks
|
||||
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has the same values as the original', (): void => {
|
||||
const fields = objectKeys(original.schema);
|
||||
const errors = original.registry
|
||||
.map((n): [string, string[]] => {
|
||||
const other = allNetworks.find(({ prefix }) => prefix === n.prefix);
|
||||
|
||||
return [
|
||||
`${n.displayName} (${n.prefix})`,
|
||||
other
|
||||
? fields.filter((f) =>
|
||||
['decimals', 'symbols'].includes(f)
|
||||
? stringify(n[f] || []) !== stringify(other[f] || [])
|
||||
: stringify(n[f]) !== stringify(other[f])
|
||||
)
|
||||
: []
|
||||
];
|
||||
})
|
||||
.filter(([, fields]) => fields.length);
|
||||
|
||||
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
|
||||
});
|
||||
});
|
||||
@@ -11,6 +11,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
acala: [
|
||||
'0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
|
||||
],
|
||||
'aleph-node': [
|
||||
'0x70255b4d28de0fc4e1a193d7e175ad1ccef431598211c55538f1018651a0344e'
|
||||
],
|
||||
astar: [
|
||||
'0x9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6'
|
||||
],
|
||||
@@ -41,11 +44,15 @@ export const knownGenesis: KnownGenesis = {
|
||||
'0x9b8cefc0eb5c568b527998bdd76c184e2b76ae561be76e4667072230217ea243'
|
||||
],
|
||||
hydradx: [
|
||||
'0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', // HydraDX Parachain
|
||||
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
|
||||
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
|
||||
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
|
||||
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
|
||||
],
|
||||
'interlay-parachain': [
|
||||
'0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
|
||||
],
|
||||
karura: [
|
||||
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
|
||||
],
|
||||
@@ -104,6 +111,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
subsocial: [
|
||||
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
|
||||
],
|
||||
unique: [
|
||||
'0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
|
||||
],
|
||||
westend: [
|
||||
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
|
||||
],
|
||||
|
||||
@@ -9,6 +9,7 @@ import type { KnownLedger } from '../types';
|
||||
// NOTE: Any network here needs to have a genesisHash attached in the ./genesis.ts config
|
||||
export const knownLedger: KnownLedger = {
|
||||
acala: 0x00000313,
|
||||
'aleph-node': 0x00000283,
|
||||
astar: 0x0000032a,
|
||||
bifrost: 0x00000314,
|
||||
centrifuge: 0x000002eb,
|
||||
@@ -17,6 +18,7 @@ export const knownLedger: KnownLedger = {
|
||||
edgeware: 0x0000020b,
|
||||
equilibrium: 0x05f5e0fd,
|
||||
genshiro: 0x05f5e0fc,
|
||||
'interlay-parachain': 0x00000162,
|
||||
karura: 0x000002ae,
|
||||
kusama: 0x000001b2,
|
||||
'nodle-para': 0x000003eb,
|
||||
@@ -25,7 +27,9 @@ export const knownLedger: KnownLedger = {
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253,
|
||||
sora: 0x00000269,
|
||||
stafi: 0x0000038b,
|
||||
statemine: 0x000001b2, // common-good on Kusama, shares derivation
|
||||
statemint: 0x00000162, // common-good on Polkadot, shares derivation
|
||||
unique: 0x00000162,
|
||||
xxnetwork: 0x000007a3
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -438,7 +438,7 @@
|
||||
"NODL"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
11
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://nodle.io/"
|
||||
@@ -659,6 +659,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://xx.network"
|
||||
},
|
||||
{
|
||||
"prefix": 56,
|
||||
"network": "pendulum",
|
||||
"displayName": "Pendulum chain",
|
||||
"symbols": [
|
||||
"PEN"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://pendulumchain.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 57,
|
||||
"network": "amplitude",
|
||||
"displayName": "Amplitude chain",
|
||||
"symbols": [
|
||||
"AMPE"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://pendulumchain.org/"
|
||||
},
|
||||
{
|
||||
"prefix": 63,
|
||||
"network": "hydradx",
|
||||
@@ -906,6 +932,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://invarch.network"
|
||||
},
|
||||
{
|
||||
"prefix": 126,
|
||||
"network": "joystream",
|
||||
"displayName": "Joystream",
|
||||
"symbols": [
|
||||
"JOY"
|
||||
],
|
||||
"decimals": [
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.joystream.org"
|
||||
},
|
||||
{
|
||||
"prefix": 128,
|
||||
"network": "clover",
|
||||
@@ -1036,6 +1075,32 @@
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://efinity.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 1221,
|
||||
"network": "peaq",
|
||||
"displayName": "Peaq Network",
|
||||
"symbols": [
|
||||
"PEAQ"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://www.peaq.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 1222,
|
||||
"network": "apex",
|
||||
"displayName": "Apex Network",
|
||||
"symbols": [
|
||||
"APEX"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "Sr25519",
|
||||
"website": "https://www.peaq.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 1284,
|
||||
"network": "moonbeam",
|
||||
@@ -1127,6 +1192,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://interlay.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 2207,
|
||||
"network": "SNOW",
|
||||
"displayName": "SNOW: ICE Canary Network",
|
||||
"symbols": [
|
||||
"ICZ"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 2208,
|
||||
"network": "ICE",
|
||||
"displayName": "ICE Network",
|
||||
"symbols": [
|
||||
"ICY"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 2254,
|
||||
"network": "subspace_testnet",
|
||||
@@ -1158,7 +1249,7 @@
|
||||
"network": "tidefi",
|
||||
"displayName": "Tidefi",
|
||||
"symbols": [
|
||||
"TIFI"
|
||||
"TDFY"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../hw-ledger/tsconfig.build.json" },
|
||||
{ "path": "../util/tsconfig.build.json" },
|
||||
{ "path": "../x-fetch/tsconfig.build.json" }
|
||||
{ "path": "../util/tsconfig.build.json" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -22,21 +22,21 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"browser": {
|
||||
"crypto": false,
|
||||
"stream": false
|
||||
},
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@noble/hashes": "1.1.2",
|
||||
"@noble/secp256k1": "1.6.0",
|
||||
"@polkadot/networks": "9.6.2",
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@polkadot/wasm-crypto": "^6.1.5",
|
||||
"@polkadot/x-bigint": "9.6.2",
|
||||
"@polkadot/x-randomvalues": "9.6.2",
|
||||
"@noble/secp256k1": "1.6.3",
|
||||
"@polkadot/networks": "10.1.2",
|
||||
"@polkadot/util": "10.1.2",
|
||||
"@polkadot/wasm-crypto": "^6.3.1",
|
||||
"@polkadot/x-bigint": "10.1.2",
|
||||
"@polkadot/x-randomvalues": "10.1.2",
|
||||
"@scure/base": "1.1.1",
|
||||
"ed2curve": "^0.3.0",
|
||||
"tweetnacl": "^1.0.3"
|
||||
@@ -45,6 +45,6 @@
|
||||
"@types/ed2curve": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "9.6.2"
|
||||
"@polkadot/util": "10.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export {};
|
||||
|
||||
describe('cryptoWaitReady', (): void => {
|
||||
it('should return false when it cannot initialize', async (): Promise<void> => {
|
||||
const old = global.WebAssembly;
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -34,19 +34,18 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/x-bigint": "9.6.2",
|
||||
"@polkadot/x-global": "9.6.2",
|
||||
"@polkadot/x-textdecoder": "9.6.2",
|
||||
"@polkadot/x-textencoder": "9.6.2",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-bigint": "10.1.2",
|
||||
"@polkadot/x-global": "10.1.2",
|
||||
"@polkadot/x-textdecoder": "10.1.2",
|
||||
"@polkadot/x-textencoder": "10.1.2",
|
||||
"@types/bn.js": "^5.1.0",
|
||||
"bn.js": "^5.2.1",
|
||||
"ip-regex": "^4.3.0"
|
||||
"bn.js": "^5.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/x-randomvalues": "9.6.2"
|
||||
"@polkadot/x-randomvalues": "10.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* arrayFilter([0, void 0, true, null, false, ''], false); // [0, true, false, '']
|
||||
* ```
|
||||
*/
|
||||
export function arrayFilter <T = unknown> (array: (T | null | undefined)[], allowNulls = true): T[] {
|
||||
export function arrayFilter <T = unknown> (array: readonly (T | null | undefined)[], allowNulls = true): T[] {
|
||||
return array.filter((v): v is T =>
|
||||
v !== undefined &&
|
||||
(allowNulls || v !== null)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* arrayFlatten([[1, 2], [3, 4], [5]]); // [1, 2, 3, 4, 5]
|
||||
* ```
|
||||
*/
|
||||
export function arrayFlatten <T> (arrays: T[][]): T[] {
|
||||
export function arrayFlatten <T> (arrays: readonly T[][]): T[] {
|
||||
// noop for the single-entry case
|
||||
if (arrays.length === 1) {
|
||||
return arrays[0];
|
||||
|
||||
@@ -10,4 +10,5 @@ export { arrayFilter } from './filter';
|
||||
export { arrayFlatten } from './flatten';
|
||||
export { arrayRange } from './range';
|
||||
export { arrayShuffle } from './shuffle';
|
||||
export { arrayUnzip } from './unzip';
|
||||
export { arrayZip } from './zip';
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @name arrayShuffle
|
||||
* @description Shuffles the input array (unlike sort, this is not done in-place)
|
||||
*/
|
||||
export function arrayShuffle <T> (input: T[]): T[] {
|
||||
export function arrayShuffle <T> (input: readonly T[]): T[] {
|
||||
const result = input.slice();
|
||||
let curr = result.length;
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { arrayUnzip } from '.';
|
||||
|
||||
describe('arrayUnzip', (): void => {
|
||||
it('unzips entries', (): void => {
|
||||
expect(
|
||||
arrayUnzip([['a', 1], ['b', 2], ['c', 3]])
|
||||
).toEqual([['a', 'b', 'c'], [1, 2, 3]]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,17 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* @name arrayUnzip
|
||||
* @description Splits a single [K, V][] into [K[], V[]]
|
||||
*/
|
||||
export function arrayUnzip <K, V> (entries: readonly [K, V][]): [K[], V[]] {
|
||||
const keys = new Array<K>(entries.length);
|
||||
const values = new Array<V>(entries.length);
|
||||
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
[keys[i], values[i]] = entries[i];
|
||||
}
|
||||
|
||||
return [keys, values];
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* @name arrayZip
|
||||
* @description Combines 2 distinct key/value arrays into a single [K, V] array
|
||||
*/
|
||||
export function arrayZip <K, V> (keys: K[], values: V[]): [K, V][] {
|
||||
export function arrayZip <K, V> (keys: readonly K[], values: readonly V[]): [K, V][] {
|
||||
const result = new Array<[K, V]>(keys.length);
|
||||
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { BN } from '../bn';
|
||||
import { SQRT_MAX_SAFE_INTEGER } from './sqrt';
|
||||
import { nSqrt } from '.';
|
||||
|
||||
const TESTS: [string | number | BN | bigint, string | number][] = [
|
||||
export const SQRT_TESTS: [string | number | BN | bigint, string | number][] = [
|
||||
[0, 0],
|
||||
[1, 1],
|
||||
[4, 2],
|
||||
@@ -45,7 +45,7 @@ describe('nSqrt', (): void => {
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
TESTS.forEach(([value, expected], index): void => {
|
||||
SQRT_TESTS.forEach(([value, expected], index): void => {
|
||||
it(`calcs for test #${index}`, (): void => {
|
||||
expect(
|
||||
nSqrt(value) === BigInt(expected)
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
import type { BN } from '../bn/bn';
|
||||
import type { HexString, NumberOptions, ToBigInt, ToBn } from '../types';
|
||||
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { u8aToHex } from '../u8a';
|
||||
import { nToU8a } from './toU8a';
|
||||
|
||||
@@ -15,14 +14,8 @@ const ZERO_STR = '0x00';
|
||||
* @name nToHex
|
||||
* @summary Creates a hex value from a bigint object.
|
||||
*/
|
||||
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): HexString {
|
||||
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, { bitLength, isLe = false, isNegative = false }: NumberOptions = {}): HexString {
|
||||
return !value
|
||||
? ZERO_STR
|
||||
: u8aToHex(
|
||||
nToU8a(value, objectSpread(
|
||||
// We spread here, the default for hex values is BE (JSONRPC via substrate)
|
||||
{ isLe: false, isNegative: false },
|
||||
options
|
||||
))
|
||||
);
|
||||
: u8aToHex(nToU8a(value, { bitLength, isLe, isNegative }));
|
||||
}
|
||||
|
||||
@@ -6,14 +6,13 @@ import type { NumberOptions, ToBigInt, ToBn } from '../types';
|
||||
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { _0n, _1n } from './consts';
|
||||
import { nToBigInt } from './toBigInt';
|
||||
|
||||
const DIV = BigInt(256);
|
||||
const NEG_MASK = BigInt(0xff);
|
||||
|
||||
function toU8a (value: bigint, { isLe, isNegative }: NumberOptions): Uint8Array {
|
||||
function toU8a (value: bigint, isLe: boolean, isNegative: boolean): Uint8Array {
|
||||
const arr: number[] = [];
|
||||
|
||||
if (isNegative) {
|
||||
@@ -44,34 +43,29 @@ function toU8a (value: bigint, { isLe, isNegative }: NumberOptions): Uint8Array
|
||||
* @name nToU8a
|
||||
* @summary Creates a Uint8Array object from a bigint.
|
||||
*/
|
||||
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): Uint8Array {
|
||||
const opts: NumberOptions = objectSpread(
|
||||
{ bitLength: -1, isLe: true, isNegative: false },
|
||||
options
|
||||
);
|
||||
|
||||
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, { bitLength = -1, isLe = true, isNegative = false }: NumberOptions = {}): Uint8Array {
|
||||
const valueBi = nToBigInt(value);
|
||||
|
||||
if (valueBi === _0n) {
|
||||
return opts.bitLength === -1
|
||||
return bitLength === -1
|
||||
? new Uint8Array()
|
||||
: new Uint8Array(Math.ceil((opts.bitLength || 0) / 8));
|
||||
: new Uint8Array(Math.ceil((bitLength || 0) / 8));
|
||||
}
|
||||
|
||||
const u8a = toU8a(valueBi, opts);
|
||||
const u8a = toU8a(valueBi, isLe, isNegative);
|
||||
|
||||
if (opts.bitLength === -1) {
|
||||
if (bitLength === -1) {
|
||||
return u8a;
|
||||
}
|
||||
|
||||
const byteLength = Math.ceil((opts.bitLength || 0) / 8);
|
||||
const byteLength = Math.ceil((bitLength || 0) / 8);
|
||||
const output = new Uint8Array(byteLength);
|
||||
|
||||
if (opts.isNegative) {
|
||||
if (isNegative) {
|
||||
output.fill(0xff);
|
||||
}
|
||||
|
||||
output.set(u8a, opts.isLe ? 0 : byteLength - u8a.length);
|
||||
output.set(u8a, isLe ? 0 : byteLength - u8a.length);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -1,32 +1,10 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { SQRT_TESTS } from '../bi/sqrt.spec';
|
||||
import { SQRT_MAX_SAFE_INTEGER } from './sqrt';
|
||||
import { BN, bnSqrt } from '.';
|
||||
|
||||
const TESTS: [string | number | BN | bigint, string | number][] = [
|
||||
[0, 0],
|
||||
[1, 1],
|
||||
[4, 2],
|
||||
[256 * 256, 256],
|
||||
[Number.MAX_SAFE_INTEGER, 94906265],
|
||||
[new BN(Number.MAX_SAFE_INTEGER).iaddn(256), 94906265],
|
||||
[12345678n * 12345679n, 12345678],
|
||||
// test cases below from https://github.com/Aisse-258/bigint-isqrt/blob/f5254b9750841959022461c1353437a07a08f501/test/sqrt-test.js
|
||||
[
|
||||
'54866395443885995655625',
|
||||
'234235768925'
|
||||
],
|
||||
[
|
||||
'82120471531550314555681345949499512621827274120673745141541602816614526075010755373654280259022317599142038423759320355177481886719814621305828811322920076213800348341464996337890625',
|
||||
'9062034624274524065844376014975805577107171799890766992670739972241112960081909332275390625'
|
||||
],
|
||||
[
|
||||
'2068290204957779940494571454815902632050207752627007664813877111611972735314294907791993008455381265730624848057015476004143868408297250386512042711005577373327434315310235583583151773358353534031397385969275475421659036494173765903706963544628565027679444680637920371210258368358706248446698622704138943704561842220533563976838506992543814273403403362954987589637283890281226038798503294069403370486523697009383229578343444337394508531937972775639593763364402389410142290440075517598007930025487176173228232153685095699851764630884360483051570513804913157899314303269924424908606245851172031453725690942288677622973423417902662711606364188470325930406288190754356367655606430407552275285889968860367977288564364154999338284288438279464648663835830140826171534470717958048887869721791862539529444820484648908879364324577951008050851801647916673254009490596379549192296404841454780884358889449367135382779230574781333008561195244620152128505091883408484094800737142399855337799331037607433934520934135669364954550499058123797911762228642423567268540444910163468496805547450495819213412636594319148417857753712526066272727725420886898680432958409892237191284583904066400736417812258327303739879128916456683685232170600928808798462776174857486589598776587550843543720784829419478239563366491666155716208452087857080883906200829769222868347286071365156305396955420561718593130305703074908891135467193627721682044757187980688062367562451981939375400543212890625',
|
||||
'45478458691536369397924851088318871329614555665525810477032568598360481742967756704524034986984134271202405190906906195123751965012732122548540879928668891416468847696038707003466943811913626146981446753434347552196868717612248915137033581428310504778371173112125038060138252719589122657221314190626986951627417768579641354255445988772645883238873672997347648890137913979299598785628581961589739331483895853398160785485300758458294999124984266041998145956341386549681176624661615465976970855592467853824812945820721933491609237311130118125761849911376495970746282571994312288380577879004620824004760109618074670810797544446334767103935754106103208789391060008291027361311679876439695844637933763721093782805837690830230712890625'
|
||||
]
|
||||
];
|
||||
|
||||
describe('bnSqrt', (): void => {
|
||||
it('fails on < 0 roots', (): void => {
|
||||
expect(
|
||||
@@ -46,7 +24,7 @@ describe('bnSqrt', (): void => {
|
||||
).toEqual(true);
|
||||
});
|
||||
|
||||
TESTS.forEach(([value, expected], index): void => {
|
||||
SQRT_TESTS.forEach(([value, expected], index): void => {
|
||||
it(`calcs for test #${index}`, (): void => {
|
||||
expect(
|
||||
bnSqrt(value).eq(new BN(expected))
|
||||
|
||||
@@ -18,16 +18,10 @@ describe('bnToHex', (): void => {
|
||||
|
||||
it('converts BN values to a prefixed hex representation (bitLength)', (): void => {
|
||||
expect(
|
||||
bnToHex(new BN(128), 16)
|
||||
bnToHex(new BN(128), { bitLength: 16 })
|
||||
).toBe('0x0080');
|
||||
});
|
||||
|
||||
it('converts BN values to a prefixed hex representation (bitLength + le)', (): void => {
|
||||
expect(
|
||||
bnToHex(new BN(128), 16, true)
|
||||
).toBe('0x8000');
|
||||
});
|
||||
|
||||
it('converts BN values to a prefixed hex representation (LE)', (): void => {
|
||||
expect(
|
||||
bnToHex(new BN(128), { bitLength: 16, isLe: true })
|
||||
@@ -45,12 +39,4 @@ describe('bnToHex', (): void => {
|
||||
bnToHex(new BN(-1234), { bitLength: 32, isNegative: true })
|
||||
).toBe('0xfffffb2e');
|
||||
});
|
||||
|
||||
it('handles legacy compatibility', (): void => {
|
||||
expect(
|
||||
bnToHex(new BN(1234), 32)
|
||||
).toBe(
|
||||
bnToHex(new BN(1234), { bitLength: 32 })
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,13 +4,10 @@
|
||||
import type { HexString, NumberOptions, ToBn } from '../types';
|
||||
import type { BN } from './bn';
|
||||
|
||||
import { isNumber } from '../is/number';
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { u8aToHex } from '../u8a';
|
||||
import { bnToU8a } from './toU8a';
|
||||
|
||||
const ZERO_STR = '0x00';
|
||||
const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: false, isNegative: false };
|
||||
|
||||
/**
|
||||
* @name bnToHex
|
||||
@@ -27,22 +24,8 @@ const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: false, isNegative: fa
|
||||
* bnToHex(new BN(0x123456)); // => '0x123456'
|
||||
* ```
|
||||
*/
|
||||
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): HexString;
|
||||
/** @deprecated Use bnToHex (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions) */
|
||||
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): HexString;
|
||||
/** @deprecated Use bnToHex (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions) */
|
||||
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, arg1: number | NumberOptions = DEFAULT_OPTS, arg2 = false): HexString {
|
||||
export function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, { bitLength = -1, isLe = false, isNegative = false }: NumberOptions = {}): HexString {
|
||||
return !value
|
||||
? ZERO_STR
|
||||
: u8aToHex(
|
||||
bnToU8a(value, objectSpread(
|
||||
// We spread here, the default for hex values is BE (JSONRPC via substrate)
|
||||
{ isLe: false, isNegative: false },
|
||||
isNumber(arg1)
|
||||
? { bitLength: arg1, isLe: arg2 }
|
||||
: arg1
|
||||
))
|
||||
);
|
||||
: u8aToHex(bnToU8a(value, { bitLength, isLe, isNegative }));
|
||||
}
|
||||
|
||||
export { bnToHex };
|
||||
|
||||
@@ -10,42 +10,34 @@ const ptest = arrayRange(65536).map((v) => [v]);
|
||||
describe('bnToU8a', (): void => {
|
||||
it('converts null values to 0x00', (): void => {
|
||||
expect(
|
||||
bnToU8a(null, -1, false)
|
||||
bnToU8a(null)
|
||||
).toEqual(new Uint8Array());
|
||||
});
|
||||
|
||||
it('converts null values to 0x00000000 (bitLength)', (): void => {
|
||||
expect(
|
||||
bnToU8a(null, 32, false)
|
||||
bnToU8a(null, { bitLength: 32 })
|
||||
).toEqual(new Uint8Array([0, 0, 0, 0]));
|
||||
});
|
||||
|
||||
it('converts BN values to a prefixed hex representation', (): void => {
|
||||
expect(
|
||||
bnToU8a(new BN(0x123456), -1, false)
|
||||
bnToU8a(new BN(0x123456), { isLe: false })
|
||||
).toEqual(new Uint8Array([0x12, 0x34, 0x56]));
|
||||
});
|
||||
|
||||
it('converts BN values to a prefixed hex representation (bitLength)', (): void => {
|
||||
expect(
|
||||
bnToU8a(new BN(0x123456), 32, false)
|
||||
bnToU8a(new BN(0x123456), { bitLength: 32, isLe: false })
|
||||
).toEqual(new Uint8Array([0x00, 0x12, 0x34, 0x56]));
|
||||
});
|
||||
|
||||
it('converts using little endian (as set)', (): void => {
|
||||
expect(
|
||||
bnToU8a(new BN(0x123456), 32, true)
|
||||
bnToU8a(new BN(0x123456), { bitLength: 32, isLe: true })
|
||||
).toEqual(new Uint8Array([0x56, 0x34, 0x12, 0x00]));
|
||||
});
|
||||
|
||||
it('handles backwards compatibility', (): void => {
|
||||
expect(
|
||||
bnToU8a(new BN(1234), 32, false)
|
||||
).toEqual(
|
||||
bnToU8a(new BN(1234), { bitLength: 32, isLe: false })
|
||||
);
|
||||
});
|
||||
|
||||
describe('signed', (): void => {
|
||||
it('converts negative numbers (BE)', (): void => {
|
||||
expect(
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
import type { NumberOptions, ToBn } from '../types';
|
||||
import type { BN } from './bn';
|
||||
|
||||
import { isNumber } from '../is/number';
|
||||
import { bnToBn } from './toBn';
|
||||
|
||||
const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: true, isNegative: false };
|
||||
@@ -23,15 +22,7 @@ const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: true, isNegative: fal
|
||||
* bnToU8a(new BN(0x1234)); // => [0x12, 0x34]
|
||||
* ```
|
||||
*/
|
||||
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): Uint8Array;
|
||||
/** @deprecated Use bnToU8a(value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions) */
|
||||
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): Uint8Array;
|
||||
/** @deprecated Use bnToU8a(value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions) */
|
||||
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, arg1: number | NumberOptions = DEFAULT_OPTS, arg2 = true): Uint8Array {
|
||||
const { bitLength = -1, isLe = true, isNegative = false } = isNumber(arg1)
|
||||
? { bitLength: arg1, isLe: arg2 }
|
||||
: arg1;
|
||||
|
||||
export function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, { bitLength = -1, isLe = true, isNegative = false } = DEFAULT_OPTS): Uint8Array {
|
||||
const valueBn = bnToBn(value);
|
||||
const byteLength = bitLength === -1
|
||||
? Math.ceil(valueBn.bitLength() / 8)
|
||||
@@ -52,5 +43,3 @@ function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
export { bnToU8a };
|
||||
|
||||
@@ -33,16 +33,10 @@ describe('formatBalance', (): void => {
|
||||
|
||||
it('formats 123,456,789,000 (decimals=15, old style)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true }, 15)
|
||||
formatBalance(TESTVAL, { decimals: 15, withSi: true })
|
||||
).toEqual('123.4567 µUnit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=36, option)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { decimals: 36, withSi: true })
|
||||
).toEqual('0.1234 yUnit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=15, Compact)', (): void => {
|
||||
const compact = {
|
||||
something: 'else',
|
||||
@@ -63,85 +57,85 @@ describe('formatBalance', (): void => {
|
||||
|
||||
it('formats 123,456,789,000 (decimals=9)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true }, 9)
|
||||
formatBalance(TESTVAL, { decimals: 9, withSi: true })
|
||||
).toEqual('123.4567 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=9, no unit)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true, withUnit: false }, 9)
|
||||
formatBalance(TESTVAL, { decimals: 9, withSi: true, withUnit: false })
|
||||
).toEqual('123.4567');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=9, unit given)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true, withUnit: 'FOO' }, 9)
|
||||
formatBalance(TESTVAL, { decimals: 9, withSi: true, withUnit: 'FOO' })
|
||||
).toEqual('123.4567 FOO');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=12, no SI)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: false }, 12)
|
||||
formatBalance(TESTVAL, { decimals: 12, withSi: false })
|
||||
).toEqual('123.4567');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=12, full SI)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSiFull: true }, 12)
|
||||
formatBalance(TESTVAL, { decimals: 12, withSiFull: true })
|
||||
).toEqual('123.4567 milli Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=12, full SI, no unit)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSiFull: true, withUnit: false }, 12)
|
||||
formatBalance(TESTVAL, { decimals: 12, withSiFull: true, withUnit: false })
|
||||
).toEqual('123.4567 milli');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=9, full SI)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSiFull: true }, 9)
|
||||
formatBalance(TESTVAL, { decimals: 9, withSiFull: true })
|
||||
).toEqual('123.4567 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=6)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true }, 6)
|
||||
formatBalance(TESTVAL, { decimals: 6, withSi: true })
|
||||
).toEqual('123.4567 kUnit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=6, unit specified)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true, withUnit: 'BAR' }, 6)
|
||||
formatBalance(TESTVAL, { decimals: 6, withSi: true, withUnit: 'BAR' })
|
||||
).toEqual('123.4567 kBAR');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=0, unit specified)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { withSi: true, withUnit: 'BAR' }, 0)
|
||||
formatBalance(TESTVAL, { decimals: 0, withSi: true, withUnit: 'BAR' })
|
||||
).toEqual('123.4567 BBAR');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 * 10 (decimals=12)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL.muln(10), { withSi: true }, 12)
|
||||
formatBalance(TESTVAL.muln(10), { decimals: 12, withSi: true })
|
||||
).toEqual('1.2345 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 * 100 (decimals=12)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL.muln(100), { withSi: true }, 12)
|
||||
formatBalance(TESTVAL.muln(100), { decimals: 12, withSi: true })
|
||||
).toEqual('12.3456 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 * 1000 (decimals=12)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL.muln(1000), { withSi: true }, 12)
|
||||
formatBalance(TESTVAL.muln(1000), { decimals: 12, withSi: true })
|
||||
).toEqual('123.4567 Unit');
|
||||
});
|
||||
|
||||
it('formats -123,456,789,000 (decimals=15)', (): void => {
|
||||
expect(
|
||||
formatBalance(new BN('-123456789000'), { withSi: true }, 15)
|
||||
formatBalance(new BN('-123456789000'), { decimals: 15, withSi: true })
|
||||
).toEqual('-123.4567 µUnit');
|
||||
});
|
||||
});
|
||||
@@ -149,25 +143,25 @@ describe('formatBalance', (): void => {
|
||||
describe('Forced formatting', (): void => {
|
||||
it('formats 123,456,789,000 (decimals=12, forceUnit=base)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { forceUnit: '-' }, 12)
|
||||
formatBalance(TESTVAL, { decimals: 12, forceUnit: '-' })
|
||||
).toEqual('0.1234 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=9, forceUnit=base)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { forceUnit: '-' }, 9)
|
||||
formatBalance(TESTVAL, { decimals: 9, forceUnit: '-' })
|
||||
).toEqual('123.4567 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=7, forceUnit=base)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { forceUnit: '-' }, 7)
|
||||
formatBalance(TESTVAL, { decimals: 7, forceUnit: '-' })
|
||||
).toEqual('12,345.6789 Unit');
|
||||
});
|
||||
|
||||
it('formats 123,456,789,000 (decimals=15, forceUnit=µ)', (): void => {
|
||||
expect(
|
||||
formatBalance(TESTVAL, { forceUnit: 'µ' }, 15)
|
||||
formatBalance(TESTVAL, { decimals: 15, forceUnit: 'µ' })
|
||||
).toEqual('123.4567 µUnit');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -44,10 +44,6 @@ interface Options {
|
||||
|
||||
interface BalanceFormatter {
|
||||
<ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, options?: Options): string;
|
||||
/** @deprecated Use balanceFormat(input?: number | string | BN | bigint | ExtToBn, options?: Options) */
|
||||
<ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, options?: boolean, decimals?: number): string;
|
||||
/** @deprecated Use balanceFormat(input?: number | string | BN | bigint | ExtToBn, options?: Options) */
|
||||
<ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, options?: Options, decimals?: number): string;
|
||||
calcSi (text: string, decimals?: number): SiDef;
|
||||
findSi (type: string): SiDef;
|
||||
getDefaults (): Defaults;
|
||||
@@ -89,18 +85,13 @@ function getPrePost (text: string, decimals: number, forceUnit?: string): [SiDef
|
||||
}
|
||||
|
||||
// Formats a string/number with <prefix>.<postfix><type> notation
|
||||
function _formatBalance <ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, options: Options | boolean = true, optDecimals: number = defaultDecimals): string {
|
||||
function _formatBalance <ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, { decimals = defaultDecimals, forceUnit, withSi = true, withSiFull = false, withUnit = true }: Options = {}): string {
|
||||
let text = bnToBn(input).toString();
|
||||
|
||||
if (text.length === 0 || text === '0') {
|
||||
return '0';
|
||||
}
|
||||
|
||||
// extract options - the boolean case is for backwards-compat
|
||||
const { decimals = optDecimals, forceUnit = undefined, withSi = true, withSiFull = false, withUnit = true } = isBoolean(options)
|
||||
? { withSi: options }
|
||||
: options;
|
||||
|
||||
// strip the negative sign so we can work with clean groupings, re-add this in the
|
||||
// end when we return the result (from here on we work with positive numbers)
|
||||
let sign = '';
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
// Since we run in very different environments, we have to ensure we have all
|
||||
// the types used here for detection (some of these may require Node definitions,
|
||||
// which are not available in Deno/browser)
|
||||
declare const __dirname: unknown;
|
||||
declare const Buffer: unknown;
|
||||
declare const module: unknown;
|
||||
declare const process: unknown;
|
||||
declare const require: unknown;
|
||||
|
||||
/** true if the environment has proper BigInt support */
|
||||
export const hasBigInt = typeof BigInt === 'function' && typeof BigInt.asIntN === 'function';
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import type { ToBnOptions } from '../types';
|
||||
|
||||
import { BigInt } from '@polkadot/x-bigint';
|
||||
|
||||
import { objectSpread } from '../object/spread';
|
||||
import { u8aToBigInt } from '../u8a/toBigInt';
|
||||
import { hexToU8a } from './toU8a';
|
||||
|
||||
@@ -13,11 +12,8 @@ import { hexToU8a } from './toU8a';
|
||||
* @name hexToBigInt
|
||||
* @summary Creates a BigInt instance object from a hex string.
|
||||
*/
|
||||
export function hexToBigInt (value?: string | null, options: ToBnOptions = {}): bigint {
|
||||
export function hexToBigInt (value?: string | null, { isLe = false, isNegative = false }: ToBnOptions = {}): bigint {
|
||||
return !value || value === '0x'
|
||||
? BigInt(0)
|
||||
: u8aToBigInt(
|
||||
hexToU8a(value),
|
||||
objectSpread({ isLe: false, isNegative: false }, options)
|
||||
);
|
||||
: u8aToBigInt(hexToU8a(value), { isLe, isNegative });
|
||||
}
|
||||
|
||||
@@ -69,17 +69,4 @@ describe('hexToBn', (): void => {
|
||||
hexToBn('0x0001000000000000', { isLe: true }).toNumber()
|
||||
).toBe(256);
|
||||
});
|
||||
|
||||
it('handles legacy compatibility', (): void => {
|
||||
expect(
|
||||
hexToBn('0x0001000000000000', false).eq(
|
||||
hexToBn('0x0001000000000000', { isLe: false })
|
||||
)
|
||||
).toBe(true);
|
||||
expect(
|
||||
hexToBn('0x0001000000000000', true).eq(
|
||||
hexToBn('0x0001000000000000', { isLe: true })
|
||||
)
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
import type { ToBnOptions } from '../types';
|
||||
|
||||
import { BN } from '../bn/bn';
|
||||
import { isBoolean } from '../is/boolean';
|
||||
import { hexStripPrefix } from './stripPrefix';
|
||||
|
||||
/**
|
||||
@@ -25,19 +24,11 @@ import { hexStripPrefix } from './stripPrefix';
|
||||
* hexToBn('0x123480001f'); // => BN(0x123480001f)
|
||||
* ```
|
||||
*/
|
||||
function hexToBn (value?: string | null, options?: ToBnOptions): BN;
|
||||
/** @deprecated Use hexToBn (value?: string | null, options?: ToBnOptions) */
|
||||
function hexToBn (value?: string | null, options?: boolean): BN;
|
||||
/** @deprecated Use hexToBn (value?: string | null, options?: ToBnOptions) */
|
||||
function hexToBn (value?: string | null, options: ToBnOptions | boolean = {}): BN {
|
||||
export function hexToBn (value?: string | null, { isLe = false, isNegative = false }: ToBnOptions = {}): BN {
|
||||
if (!value || value === '0x') {
|
||||
return new BN(0);
|
||||
}
|
||||
|
||||
// For hex, default to BE
|
||||
const { isLe = false, isNegative = false } = isBoolean(options)
|
||||
? { isLe: options }
|
||||
: options;
|
||||
const stripped = hexStripPrefix(value);
|
||||
const bn = new BN(stripped, 16, isLe ? 'le' : 'be');
|
||||
|
||||
@@ -47,5 +38,3 @@ function hexToBn (value?: string | null, options: ToBnOptions | boolean = {}): B
|
||||
? bn.fromTwos(stripped.length * 4)
|
||||
: bn;
|
||||
}
|
||||
|
||||
export { hexToBn };
|
||||
|
||||
@@ -48,13 +48,25 @@ describe('hexToU8a', (): void => {
|
||||
);
|
||||
});
|
||||
|
||||
it('converts a non-aligned string', (): void => {
|
||||
expect(
|
||||
hexToU8a('0x123')
|
||||
).toEqual(new Uint8Array([0x12, 0x30]));
|
||||
});
|
||||
|
||||
it('converts known bytes to their correct values', (): void => {
|
||||
expect(
|
||||
hexToU8a('0x68656c6c6f20776f726c64') // hello world (11 bytes, non-aligned)
|
||||
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
|
||||
});
|
||||
|
||||
it('fails when non-hex value provided', (): void => {
|
||||
it('converts known bytes to their correct values (upper/lower)', (): void => {
|
||||
expect(
|
||||
hexToU8a('0x68656C6c6f20776F726c64') // hello world (11 bytes, non-aligned)
|
||||
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
|
||||
});
|
||||
|
||||
it.skip('fails when non-hex value provided', (): void => {
|
||||
expect(
|
||||
() => hexToU8a('notahex')
|
||||
).toThrow(/hex value to convert/);
|
||||
|
||||
@@ -3,16 +3,23 @@
|
||||
|
||||
import type { HexString } from '../types';
|
||||
|
||||
import { REGEX_HEX_NOPREFIX, REGEX_HEX_PREFIXED } from '../is/hex';
|
||||
const CHR = '0123456789abcdef';
|
||||
const U8 = new Array<number>(256);
|
||||
const U16 = new Array<number>(256 * 256);
|
||||
|
||||
const CHARS = '0123456789abcdef';
|
||||
const UNHEX = new Array<number>(256);
|
||||
|
||||
for (let i = 0; i < CHARS.length; i++) {
|
||||
UNHEX[CHARS[i].charCodeAt(0)] = i;
|
||||
for (let i = 0; i < CHR.length; i++) {
|
||||
U8[CHR[i].charCodeAt(0) | 0] = i | 0;
|
||||
|
||||
if (i > 9) {
|
||||
UNHEX[CHARS[i].toUpperCase().charCodeAt(0)] = i;
|
||||
U8[CHR[i].toUpperCase().charCodeAt(0) | 0] = i | 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < 256; i++) {
|
||||
const s = i << 8;
|
||||
|
||||
for (let j = 0; j < 256; j++) {
|
||||
U16[s | j] = (U8[i] << 4) | U8[j];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,30 +39,23 @@ for (let i = 0; i < CHARS.length; i++) {
|
||||
* ```
|
||||
*/
|
||||
export function hexToU8a (value?: HexString | string | null, bitLength = -1): Uint8Array {
|
||||
if (!value || value === '0x') {
|
||||
if (!value) {
|
||||
return new Uint8Array();
|
||||
}
|
||||
|
||||
let s = 0;
|
||||
let s = value.startsWith('0x')
|
||||
? 2
|
||||
: 0;
|
||||
|
||||
// we don't use hexStringPrefix here - that has substring which adds
|
||||
// additional overhead. Instead we duplicate the logic, just incrementing
|
||||
// the sactual string pointer, ignoring the prefix as required
|
||||
if (REGEX_HEX_PREFIXED.test(value)) {
|
||||
s = 2;
|
||||
} else if (!REGEX_HEX_NOPREFIX.test(value)) {
|
||||
throw new Error(`Expected hex value to convert, found '${value}'`);
|
||||
}
|
||||
|
||||
const strLength = (value.length - s) / 2;
|
||||
const decLength = Math.ceil((value.length - s) / 2);
|
||||
const endLength = Math.ceil(
|
||||
bitLength === -1
|
||||
? strLength
|
||||
? decLength
|
||||
: bitLength / 8
|
||||
);
|
||||
const result = new Uint8Array(endLength);
|
||||
const offset = endLength > strLength
|
||||
? endLength - strLength
|
||||
const offset = endLength > decLength
|
||||
? endLength - decLength
|
||||
: 0;
|
||||
|
||||
for (let i = offset; i < endLength; i++, s += 2) {
|
||||
@@ -63,7 +63,7 @@ export function hexToU8a (value?: HexString | string | null, bitLength = -1): Ui
|
||||
// HEX_TO_U16[value.substring()] we get an 10x slowdown. In the
|
||||
// same vein using charCodeAt (as opposed to value[s] or value.charAt(s)) is
|
||||
// also the faster operation by at least 2x with the character map above
|
||||
result[i] = (UNHEX[value.charCodeAt(s)] << 4) + UNHEX[value.charCodeAt(s + 1)];
|
||||
result[i] = U16[(value.charCodeAt(s) << 8) | value.charCodeAt(s + 1)];
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -34,7 +34,7 @@ describe('hexToU8a', (): void => {
|
||||
);
|
||||
});
|
||||
|
||||
it('fails when non-hex value provided', (): void => {
|
||||
it.skip('fails when non-hex value provided', (): void => {
|
||||
expect(
|
||||
() => hexToU8a('notahex')
|
||||
).toThrow(/hex value to convert/);
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
|
||||
import type { HexString } from '../types';
|
||||
|
||||
import { hexStripPrefix } from './stripPrefix';
|
||||
|
||||
/**
|
||||
* @name hexToU8a
|
||||
* @summary Creates a Uint8Array object from a hex string.
|
||||
@@ -25,7 +23,9 @@ export function hexToU8a (_value?: HexString | string | null, bitLength = -1): U
|
||||
return new Uint8Array();
|
||||
}
|
||||
|
||||
const value = hexStripPrefix(_value);
|
||||
const value = _value.startsWith('0x')
|
||||
? _value.substring(2)
|
||||
: _value;
|
||||
const buf = Buffer.from(value, 'hex');
|
||||
const valLength = value.length / 2;
|
||||
const resultLength = Math.ceil(
|
||||
|
||||
@@ -7,7 +7,11 @@ import { isAscii } from '.';
|
||||
|
||||
describe('isAscii', (): void => {
|
||||
it('returns true for an ASCII string', (): void => {
|
||||
expect(isAscii('Hello\tWorld!\n\rTesting')).toEqual(true);
|
||||
expect(isAscii('Hello World! Testing')).toEqual(true);
|
||||
});
|
||||
|
||||
it('returns false for an ASCII string (with formatters)', (): void => {
|
||||
expect(isAscii('Hello\tWorld!\n\rTesting')).toEqual(false);
|
||||
});
|
||||
|
||||
it('returns false on an non-ascii string', (): void => {
|
||||
@@ -15,7 +19,7 @@ describe('isAscii', (): void => {
|
||||
});
|
||||
|
||||
it('returns true for ASCII bytes', (): void => {
|
||||
expect(isAscii(new Uint8Array([0x31, 0x32, 0x20, 10]))).toEqual(true);
|
||||
expect(isAscii(stringToU8a('Hello World! Testing'))).toEqual(true);
|
||||
});
|
||||
|
||||
it('returns true for empty string inputs', (): void => {
|
||||
@@ -38,6 +42,6 @@ describe('isAscii', (): void => {
|
||||
expect(isAscii('0x010203')).toEqual(false);
|
||||
});
|
||||
|
||||
perf('isAscii (str)', 2_000_000, [['Hello\tWorld!\n\rTesting']], isAscii);
|
||||
perf('isAscii (u8a)', 200_000, [[[stringToU8a('Hello\tWorld!\n\rTesting')]]], isAscii);
|
||||
perf('isAscii (str)', 2_000_000, [['Hello World! Testing']], isAscii);
|
||||
perf('isAscii (u8a)', 200_000, [[[stringToU8a('Hello World! Testing')]]], isAscii);
|
||||
});
|
||||
|
||||
@@ -9,13 +9,13 @@ import { isString } from './string';
|
||||
|
||||
/** @internal */
|
||||
function isAsciiStr (str: AnyString): boolean {
|
||||
const count = str.length;
|
||||
const count = str.length | 0;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const b = str.charCodeAt(i);
|
||||
|
||||
// check is inlined here, it is faster than making a call
|
||||
if (!((b < 127) && ((b >= 32) || (b === 10) || (b === 9) || (b === 13)))) {
|
||||
if (b < 32 || b > 126) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -25,13 +25,13 @@ function isAsciiStr (str: AnyString): boolean {
|
||||
|
||||
/** @internal */
|
||||
function isAsciiBytes (u8a: Uint8Array | Buffer | number[]): boolean {
|
||||
const count = u8a.length;
|
||||
const count = u8a.length | 0;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const b = u8a[i];
|
||||
const b = u8a[i] | 0;
|
||||
|
||||
// check is inlined here, it is faster than making a call
|
||||
if (!((b < 127) && ((b >= 32) || (b === 10) || (b === 9) || (b === 13)))) {
|
||||
if (b < 32 || b > 126) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,34 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import ipRegex from 'ip-regex';
|
||||
// The regex patterns below were copied as-is from the ip-regex package 5.0.0,
|
||||
// https://github.com/sindresorhus/ip-regex/blob/a2a44dfa7f776528158c2a5ff9d8a1be435ec1b9/index.js#L1
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
//
|
||||
// Changes made:
|
||||
// - boundary support option has been dropped
|
||||
// - only exact matching is used (isIp always passed exact: true)
|
||||
// - the newest ip-regex is ESM-only, we compile to all platforms
|
||||
const v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}';
|
||||
const v6s = '[a-fA-F\\d]{1,4}';
|
||||
const v6 = `
|
||||
(?:
|
||||
(?:${v6s}:){7}(?:${v6s}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
|
||||
(?:${v6s}:){6}(?:${v4}|:${v6s}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
|
||||
(?:${v6s}:){5}(?::${v4}|(?::${v6s}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
|
||||
(?:${v6s}:){4}(?:(?::${v6s}){0,1}:${v4}|(?::${v6s}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
|
||||
(?:${v6s}:){3}(?:(?::${v6s}){0,2}:${v4}|(?::${v6s}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
|
||||
(?:${v6s}:){2}(?:(?::${v6s}){0,3}:${v4}|(?::${v6s}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
|
||||
(?:${v6s}:){1}(?:(?::${v6s}){0,4}:${v4}|(?::${v6s}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
|
||||
(?::(?:(?::${v6s}){0,5}:${v4}|(?::${v6s}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
|
||||
)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
|
||||
`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim();
|
||||
|
||||
type IpTypes = 'v4' | 'v6';
|
||||
const v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);
|
||||
const v4exact = new RegExp(`^${v4}$`);
|
||||
const v6exact = new RegExp(`^${v6}$`);
|
||||
|
||||
/**
|
||||
* @name isIp
|
||||
@@ -22,12 +47,10 @@ type IpTypes = 'v4' | 'v6';
|
||||
* isIp('1:2:3:4:5:6:7:8', 'v4'); // => false
|
||||
* ```
|
||||
*/
|
||||
export function isIp (value: string, type?: IpTypes): boolean {
|
||||
if (type === 'v4') {
|
||||
return ipRegex.v4({ exact: true }).test(value);
|
||||
} else if (type === 'v6') {
|
||||
return ipRegex.v6({ exact: true }).test(value);
|
||||
export function isIp (value: string, type?: 'v4' | 'v6'): boolean {
|
||||
switch (type) {
|
||||
case 'v4': return v4exact.test(value);
|
||||
case 'v6': return v6exact.test(value);
|
||||
default: return v46Exact.test(value);
|
||||
}
|
||||
|
||||
return ipRegex({ exact: true }).test(value);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ describe('lazyMethod', (): void => {
|
||||
expect(Object.prototype.hasOwnProperty.call(test, 'a')).toEqual(true);
|
||||
expect(getter).not.toHaveBeenCalled();
|
||||
expect(test.a).toEqual(123);
|
||||
expect(getter).toHaveBeenCalledWith('a');
|
||||
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
|
||||
});
|
||||
|
||||
it('calls the getter a single time', (): void => {
|
||||
@@ -46,7 +46,7 @@ describe('lazyMethod', (): void => {
|
||||
|
||||
expect(getter).not.toHaveBeenCalled();
|
||||
expect(test.a).toEqual(123);
|
||||
expect(getter).toHaveBeenCalledWith('a');
|
||||
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
|
||||
expect(test.a).toEqual(123);
|
||||
expect(getter).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
@@ -10,9 +10,9 @@ type WithToString = { toString: () => string };
|
||||
* @description
|
||||
* Creates a lazy, on-demand getter for the specific value. Upon get the value will be evaluated.
|
||||
*/
|
||||
export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, creator: (d: K) => T, getName?: (d: K) => string): void {
|
||||
export function lazyMethod <T, K, S> (result: Record<string, T> | AnyFn, item: K, creator: (item: K, index: number, self: S) => T, getName?: (item: K, index: number) => string, index = 0): void {
|
||||
const name = getName
|
||||
? getName(item)
|
||||
? getName(item, index)
|
||||
: (item as WithToString).toString();
|
||||
let value: T | undefined;
|
||||
|
||||
@@ -30,7 +30,7 @@ export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, c
|
||||
// with a value below ... however we ensure we are quire vigilant against
|
||||
// all environment failures, so we are rather be safe than sorry
|
||||
if (value === undefined) {
|
||||
value = creator(item);
|
||||
value = creator(item, index, this as S);
|
||||
|
||||
try {
|
||||
// re-define the property as a value, next time around this
|
||||
@@ -54,9 +54,9 @@ export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, c
|
||||
* @description
|
||||
* Creates lazy, on-demand getters for the specific values.
|
||||
*/
|
||||
export function lazyMethods <T, K> (result: Record<string, T>, items: K[], creator: (v: K) => T, getName?: (m: K) => string): Record<string, T> {
|
||||
export function lazyMethods <T, K, S> (result: Record<string, T>, items: readonly K[], creator: (item: K, index: number, self: S) => T, getName?: (item: K, index: number) => string): Record<string, T> {
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
lazyMethod(result, items[i], creator, getName);
|
||||
lazyMethod(result, items[i], creator, getName, i);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -13,6 +13,8 @@ import { u8aToHex } from './u8a/toHex';
|
||||
import { u8aToU8a } from './u8a/toU8a';
|
||||
import { hasProcess } from './has';
|
||||
|
||||
declare const process: { env: Record<string, string> };
|
||||
|
||||
type ConsoleType = 'error' | 'log' | 'warn';
|
||||
type LogType = ConsoleType | 'debug';
|
||||
|
||||
@@ -107,7 +109,7 @@ function isDebugOff (e: string, type: string): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
function getDebugFlag (env: string[], type: string): boolean {
|
||||
function getDebugFlag (env: readonly string[], type: string): boolean {
|
||||
let flag = false;
|
||||
|
||||
for (const e of env) {
|
||||
|
||||
@@ -128,7 +128,7 @@ describe('objectProperty/objectProperties', (): void => {
|
||||
|
||||
expect(getter).not.toHaveBeenCalled();
|
||||
expect(test.a).toEqual(123);
|
||||
expect(getter).toHaveBeenCalledWith('a');
|
||||
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
|
||||
});
|
||||
|
||||
it('calls back with the key name & index (numtiple)', (): void => {
|
||||
@@ -139,7 +139,7 @@ describe('objectProperty/objectProperties', (): void => {
|
||||
|
||||
expect(getter).not.toHaveBeenCalled();
|
||||
expect(test.b).toEqual(123);
|
||||
expect(getter).toHaveBeenCalledWith('b', 1);
|
||||
expect(getter).toHaveBeenCalledWith('b', 1, expect.objectContaining({}));
|
||||
});
|
||||
|
||||
perf('objectProperties (obj)', 50_000, [[]], () => objectProperties({}, ['foo', 'bar', 'baz'], (k) => k));
|
||||
|
||||
@@ -5,19 +5,25 @@
|
||||
* @name objectProperty
|
||||
* @summary Assign a get property on the input object
|
||||
*/
|
||||
export function objectProperty (that: object, key: string, getter: (k: string) => unknown): void {
|
||||
export function objectProperty <S> (that: object, key: string, getter: (key: string, index: number, self: S) => unknown, getName?: (key: string, index: number) => string, index = 0): void {
|
||||
const name = getName
|
||||
? getName(key, index)
|
||||
: key;
|
||||
|
||||
// There are 3 approaches here -
|
||||
// - Object.prototype.hasOwnProperty.call(that, key) - this only checks the current class, i.e
|
||||
// will retuirn false if the property is set in the parent class
|
||||
// - isUndefined(...) - this may yield a false positive when the property is there, but not set.
|
||||
// Additionally, on pre-defined getters it may make a call
|
||||
// - key in that - Does not need to be combined with either of the above and checks the full chain
|
||||
if (!(key in that)) {
|
||||
Object.defineProperty(that, key, {
|
||||
if (!(name in that)) {
|
||||
Object.defineProperty(that, name, {
|
||||
enumerable: true,
|
||||
// Unlike in lazy, we always call into the upper function, i.e. this method
|
||||
// does not cache old values (it is expected to be used for dynamic values)
|
||||
get: () => getter(key)
|
||||
get: function (): unknown {
|
||||
return getter(key, index, this as S);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -26,8 +32,8 @@ export function objectProperty (that: object, key: string, getter: (k: string) =
|
||||
* @name objectProperties
|
||||
* @summary Assign get properties on the input object
|
||||
*/
|
||||
export function objectProperties (that: object, keys: string[], getter: (k: string, i: number) => unknown): void {
|
||||
export function objectProperties <S> (that: object, keys: string[], getter: (key: string, index: number, self: S) => unknown, getName?: (key: string, index: number) => string): void {
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
objectProperty(that, keys[i], (k) => getter(k, i));
|
||||
objectProperty(that, keys[i], getter, getName, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,10 +5,22 @@ import { perf } from '../test/performance';
|
||||
import { objectSpread } from '.';
|
||||
|
||||
describe('objectSpread', (): void => {
|
||||
it('spreads obj sources', (): void => {
|
||||
expect(
|
||||
objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 })
|
||||
).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 });
|
||||
});
|
||||
|
||||
it('spreads map sources', (): void => {
|
||||
expect(
|
||||
objectSpread({}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]]))
|
||||
).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 });
|
||||
});
|
||||
|
||||
it('spreads an object from multiple sources', (): void => {
|
||||
expect(
|
||||
objectSpread({ a: 1 }, { b: 2 }, { a: 2, c: { d: 3, e: 4 } })
|
||||
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
|
||||
objectSpread({ a: 1 }, { b: 2 }, { a: 2, c: { d: 3, e: 4 } }, new Map<string, unknown>([['f', 5], ['g', 6], ['h', { i: 7, k: 8 }]]))
|
||||
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 }, f: 5, g: 6, h: { i: 7, k: 8 } });
|
||||
});
|
||||
|
||||
it('spreads an object from multiple sources (with null & undefined)', (): void => {
|
||||
@@ -17,5 +29,6 @@ describe('objectSpread', (): void => {
|
||||
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
|
||||
});
|
||||
|
||||
perf('objectSpread', 500_000, [[]], () => objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }));
|
||||
perf('objectSpread (obj)', 350_000, [[{}, { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 }]], objectSpread);
|
||||
perf('objectSpread (map)', 350_000, [[{}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]])]], objectSpread);
|
||||
});
|
||||
|
||||
@@ -10,7 +10,13 @@ export function objectSpread <T extends object> (dest: object, ...sources: (obje
|
||||
const src = sources[i];
|
||||
|
||||
if (src) {
|
||||
Object.assign(dest, src);
|
||||
if (typeof (src as Map<string, unknown>).entries === 'function') {
|
||||
for (const [key, value] of (src as Map<string, unknown>).entries()) {
|
||||
(dest as Record<string, unknown>)[key] = value;
|
||||
}
|
||||
} else {
|
||||
Object.assign(dest, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { AnyString } from '../types';
|
||||
import { CC_TO_LO, CC_TO_UP } from './camelCase';
|
||||
|
||||
/** @internal */
|
||||
function converter (map: string[]): (value?: AnyString | null) => string {
|
||||
function converter (map: readonly string[]): (value?: AnyString | null) => string {
|
||||
return (value?: AnyString | null): string =>
|
||||
value
|
||||
? map[value.charCodeAt(0)] + value.slice(1)
|
||||
|
||||
@@ -9,7 +9,7 @@ type ExecFn = (...params: any[]) => unknown;
|
||||
const NUM_PAD = 16;
|
||||
const PRE_PAD = 32;
|
||||
|
||||
function loop (count: number, inputs: unknown[][], exec: ExecFn): [number, unknown[]] {
|
||||
function loop (count: number, inputs: readonly unknown[][], exec: ExecFn): [number, unknown[]] {
|
||||
const start = performance.now();
|
||||
const results = new Array<unknown>(inputs.length);
|
||||
|
||||
@@ -39,23 +39,27 @@ ${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s
|
||||
${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`;
|
||||
}
|
||||
|
||||
export function perf (name: string, count: number, inputs: unknown[][], exec: ExecFn): void {
|
||||
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn, withLog?: boolean): void {
|
||||
if (process.env.GITHUB_REPOSITORY) {
|
||||
return;
|
||||
}
|
||||
|
||||
it(`performance: ${name}`, (): void => {
|
||||
const [time] = loop(count, inputs, exec);
|
||||
const [time, results] = loop(count, inputs, exec);
|
||||
|
||||
console.log(`
|
||||
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
||||
|
||||
${`${name}:`.padStart(PRE_PAD)} ${time.toFixed(2).padStart(NUM_PAD)} ms${formatOps(count, time)}
|
||||
`);
|
||||
|
||||
if (withLog) {
|
||||
console.log(results);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function perfCmp (name: string, [first, second]: [string, string], count: number, inputs: unknown[][], exec: ExecFn): void {
|
||||
export function perfCmp (name: string, [first, second]: [string, string], count: number, inputs: readonly unknown[][], exec: ExecFn): void {
|
||||
if (process.env.GITHUB_REPOSITORY) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,25 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { perf } from '../test/performance';
|
||||
import { u8aCmp } from '.';
|
||||
|
||||
const ltest = new Uint8Array(32768);
|
||||
const stest = new Uint8Array(256);
|
||||
const ztest = new Uint8Array(64);
|
||||
|
||||
for (let i = 0; i < ltest.length; i++) {
|
||||
if (i < ztest.length) {
|
||||
ztest[i] = i % 256;
|
||||
}
|
||||
|
||||
if (i < stest.length) {
|
||||
stest[i] = i % 256;
|
||||
}
|
||||
|
||||
ltest[i] = i % 256;
|
||||
}
|
||||
|
||||
describe('u8aCmp', (): void => {
|
||||
it('has the same result as localCompare (equal length)', (): void => {
|
||||
const a = 'test abc';
|
||||
@@ -36,4 +53,8 @@ describe('u8aCmp', (): void => {
|
||||
)
|
||||
).toEqual(0);
|
||||
});
|
||||
|
||||
perf('u8aCmp (64 cmp)', 100_000, [[ztest, ztest]], u8aCmp);
|
||||
perf('u8aCmp (256 cmp)', 50_000, [[stest, stest]], u8aCmp);
|
||||
perf('u8aCmp (32k cmp)', 500, [[ltest, ltest]], u8aCmp);
|
||||
});
|
||||
|
||||
@@ -22,7 +22,7 @@ import { u8aToU8a } from './toU8a';
|
||||
* ); // [1, 2, 3, 4, 5, 6]
|
||||
* ```
|
||||
*/
|
||||
export function u8aConcat (...list: U8aLike[]): Uint8Array {
|
||||
export function u8aConcat (...list: readonly U8aLike[]): Uint8Array {
|
||||
const u8as = new Array<Uint8Array>(list.length);
|
||||
let length = 0;
|
||||
|
||||
@@ -38,7 +38,7 @@ export function u8aConcat (...list: U8aLike[]): Uint8Array {
|
||||
* @name u8aConcatStrict
|
||||
* @description A strict version of [[u8aConcat]], accepting only Uint8Array inputs
|
||||
*/
|
||||
export function u8aConcatStrict (u8as: Uint8Array[], length = 0): Uint8Array {
|
||||
export function u8aConcatStrict (u8as: readonly Uint8Array[], length = 0): Uint8Array {
|
||||
let offset = 0;
|
||||
|
||||
if (!length) {
|
||||
|
||||
@@ -22,7 +22,7 @@ import { u8aToU8a } from './toU8a';
|
||||
* ); // [1, 2, 3, 4, 5, 6]
|
||||
* ```
|
||||
*/
|
||||
export function u8aConcat (...list: U8aLike[]): Uint8Array {
|
||||
export function u8aConcat (...list: readonly U8aLike[]): Uint8Array {
|
||||
const u8as = new Array<Uint8Array>(list.length);
|
||||
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
import { perf } from '../test/performance';
|
||||
import { u8aEmpty } from '.';
|
||||
|
||||
const ztest = new Uint8Array(32);
|
||||
|
||||
describe('u8aEmpty', (): void => {
|
||||
it('returns true on zero length', (): void => {
|
||||
expect(
|
||||
@@ -25,5 +23,22 @@ describe('u8aEmpty', (): void => {
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
perf('u8aEmpty (32 cmp)', 1000000, [[ztest]], u8aEmpty);
|
||||
it('returns false when value is found (256)', (): void => {
|
||||
const test = new Uint8Array(256);
|
||||
|
||||
expect(
|
||||
u8aEmpty(test)
|
||||
).toEqual(true);
|
||||
|
||||
test[128] = 1;
|
||||
|
||||
expect(
|
||||
u8aEmpty(test)
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
perf('u8aEmpty (32 cmp)', 1_000_000, [[new Uint8Array(32)]], u8aEmpty);
|
||||
perf('u8aEmpty (64 cmp)', 500_000, [[new Uint8Array(64)]], u8aEmpty);
|
||||
perf('u8aEmpty (128 cmp)', 250_000, [[new Uint8Array(128)]], u8aEmpty);
|
||||
perf('u8aEmpty (256 cmp)', 125_000, [[new Uint8Array(256)]], u8aEmpty);
|
||||
});
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
* Checks to see if the input `Uint8Array` has zero length or contains all 0 values.
|
||||
*/
|
||||
export function u8aEmpty (value: Uint8Array): boolean {
|
||||
// on smaller values < 64 bytes, the byte-by-byte compare is faster than
|
||||
// allocating yet another object for DataView (on large buffers the DataView
|
||||
// is much faster)
|
||||
for (let i = 0; i < value.length; i++) {
|
||||
if (value[i]) {
|
||||
const len = value.length | 0;
|
||||
|
||||
// on smaller sizes, the byte-by-byte compare is faster than allocating
|
||||
// another object for DataView (on very large arrays the DataView is faster)
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (value[i] | 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,8 @@ export function u8aEq (a: HexString | Uint8Array | string, b: HexString | Uint8A
|
||||
if (u8aa.length === u8ab.length) {
|
||||
const dvA = new DataView(u8aa.buffer, u8aa.byteOffset);
|
||||
const dvB = new DataView(u8ab.buffer, u8ab.byteOffset);
|
||||
const mod = u8aa.length % 4;
|
||||
const length = u8aa.length - mod;
|
||||
const mod = (u8aa.length % 4) | 0;
|
||||
const length = (u8aa.length - mod) | 0;
|
||||
|
||||
for (let i = 0; i < length; i += 4) {
|
||||
if (dvA.getUint32(i) !== dvB.getUint32(i)) {
|
||||
|
||||
@@ -5,21 +5,6 @@ import { perf } from '../test/performance';
|
||||
import { u8aToBn } from '.';
|
||||
|
||||
describe('u8aToBn', (): void => {
|
||||
it('supports legacy compatibility', (): void => {
|
||||
expect(
|
||||
u8aToBn(
|
||||
new Uint8Array([0x12, 0x34]),
|
||||
true
|
||||
).toString(16)
|
||||
).toBe('3412');
|
||||
expect(
|
||||
u8aToBn(
|
||||
new Uint8Array([0x12, 0x34]),
|
||||
false
|
||||
).toString(16)
|
||||
).toBe('1234');
|
||||
});
|
||||
|
||||
it('converts little-endian by default', (): void => {
|
||||
expect(
|
||||
u8aToBn(
|
||||
@@ -274,31 +259,6 @@ describe('u8aToBn', (): void => {
|
||||
).toBe(256);
|
||||
});
|
||||
|
||||
it('handles backward compatibility)', (): void => {
|
||||
expect(
|
||||
u8aToBn(
|
||||
new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0]),
|
||||
false
|
||||
).eq(
|
||||
u8aToBn(
|
||||
new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0]),
|
||||
{ isLe: false }
|
||||
)
|
||||
)
|
||||
).toBe(true);
|
||||
expect(
|
||||
u8aToBn(
|
||||
new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0]),
|
||||
true
|
||||
).eq(
|
||||
u8aToBn(
|
||||
new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0]),
|
||||
{ isLe: true }
|
||||
)
|
||||
)
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
perf('u8aToBn (u32)', 1_000_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c])]], u8aToBn);
|
||||
perf('u8aToBn (i32)', 1_000_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c])]], (v: Uint8Array) => u8aToBn(v, { isNegative: true }));
|
||||
perf('u8aToBn (u64)', 500_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c])]], u8aToBn);
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
import type { ToBnOptions } from '../types';
|
||||
|
||||
import { BN } from '../bn/bn';
|
||||
import { isBoolean } from '../is/boolean';
|
||||
|
||||
/**
|
||||
* @name u8aToBn
|
||||
@@ -24,16 +23,7 @@ import { isBoolean } from '../is/boolean';
|
||||
* u8aToHex(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0xf])); // 0x68656c0f
|
||||
* ```
|
||||
*/
|
||||
function u8aToBn (value: Uint8Array, options?: ToBnOptions): BN;
|
||||
/** @deprecated Use u8aToBn(value: Uint8Array, options?: ToBnOptions) */
|
||||
function u8aToBn (value: Uint8Array, options?: boolean): BN;
|
||||
/** @deprecated Use u8aToBn (value?: string | null, options?: ToBnOptions) */
|
||||
function u8aToBn (value: Uint8Array, options: ToBnOptions | boolean = {}): BN {
|
||||
// NOTE: This is the same process as followed in the hexToBn conversion
|
||||
// For Uint8Array, default to LE
|
||||
const { isLe = true, isNegative = false } = isBoolean(options)
|
||||
? { isLe: options }
|
||||
: options;
|
||||
export function u8aToBn (value: Uint8Array, { isLe = true, isNegative = false }: ToBnOptions = {}): BN {
|
||||
const count = value.length;
|
||||
|
||||
// shortcut for <= u48 values - in this case the manual conversion
|
||||
@@ -130,5 +120,3 @@ function u8aToBn (value: Uint8Array, options: ToBnOptions | boolean = {}): BN {
|
||||
? new BN(value, isLe ? 'le' : 'be').fromTwos(value.length * 8)
|
||||
: new BN(value, isLe ? 'le' : 'be');
|
||||
}
|
||||
|
||||
export { u8aToBn };
|
||||
|
||||
@@ -78,12 +78,12 @@ describe('u8aToHex', (): void => {
|
||||
).toEqual('0x68656c6c6f20776f726c64');
|
||||
});
|
||||
|
||||
perfCmp('u8aToHex (32k)', ['u8aToHexBuffer', 'u8aToHex'], 2000, [[ptest32k]], (s: Uint8Array, isSecond) =>
|
||||
perfCmp('u8aToHex (32k)', ['u8aToHexBuffer', 'u8aToHex'], 1000, [[ptest32k]], (s: Uint8Array, isSecond) =>
|
||||
isSecond
|
||||
? u8aToHex(s)
|
||||
: u8aToHexBuffer(s)
|
||||
);
|
||||
perfCmp('u8aToHex (128)', ['u8aToHexBuffer', 'u8aToHex'], 100000, [[ptest256]], (s: Uint8Array, isSecond) =>
|
||||
perfCmp('u8aToHex (128)', ['u8aToHexBuffer', 'u8aToHex'], 200_000, [[ptest256]], (s: Uint8Array, isSecond) =>
|
||||
isSecond
|
||||
? u8aToHex(s)
|
||||
: u8aToHexBuffer(s)
|
||||
|
||||
@@ -19,20 +19,16 @@ for (let i = 0; i < 256; i++) {
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
function hex (value: Uint8Array): string {
|
||||
const mod = value.length % 2;
|
||||
const length = value.length - mod;
|
||||
const dv = new DataView(value.buffer, value.byteOffset);
|
||||
let result = '';
|
||||
function hex (value: Uint8Array, result: HexString): HexString {
|
||||
const mod = (value.length % 2) | 0;
|
||||
const length = (value.length - mod) | 0;
|
||||
|
||||
for (let i = 0; i < length; i += 2) {
|
||||
// we only use getUint16 here instead of getUint32 - at least in our
|
||||
// tests this is faster to execute (both long & short strings tested)
|
||||
result += U16[dv.getUint16(i)];
|
||||
result += U16[(value[i] << 8) | value[i + 1]];
|
||||
}
|
||||
|
||||
if (mod) {
|
||||
result += U8[dv.getUint8(length)];
|
||||
result += U8[value[length] | 0];
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -53,13 +49,20 @@ function hex (value: Uint8Array): string {
|
||||
* ```
|
||||
*/
|
||||
export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed = true): HexString {
|
||||
const length = Math.ceil(bitLength / 8);
|
||||
// this is not 100% correct sinmce we support isPrefixed = false....
|
||||
const empty = isPrefixed
|
||||
? '0x'
|
||||
: '' as HexString;
|
||||
|
||||
return `${isPrefixed ? '0x' : ''}${
|
||||
!value || !value.length
|
||||
? ''
|
||||
: (bitLength > 0 && value.length > length)
|
||||
? `${hex(value.subarray(0, length / 2))}…${hex(value.subarray(value.length - length / 2))}`
|
||||
: hex(value)
|
||||
}` as HexString;
|
||||
if (!value || !value.length) {
|
||||
return empty;
|
||||
} else if (bitLength > 0) {
|
||||
const length = Math.ceil(bitLength / 8);
|
||||
|
||||
if (value.length > length) {
|
||||
return `${hex(value.subarray(0, length / 2), empty)}…${hex(value.subarray(value.length - length / 2), '' as HexString)}`;
|
||||
}
|
||||
}
|
||||
|
||||
return hex(value, empty);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ interface PjsChecks extends This {
|
||||
__polkadotjs: Record<string, VersionPath[]>;
|
||||
}
|
||||
|
||||
type PjsGlobal = (Window & This) & PjsChecks;
|
||||
type PjsGlobal = This & PjsChecks & Record<string, unknown>;
|
||||
type FnString = () => string | undefined;
|
||||
|
||||
const DEDUPE = 'Either remove and explicitly install matching versions or dedupe using your package manager.\nThe following conflicting packages were found:';
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
"./shim.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/x-global": "9.6.2"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/x-bigint authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { xglobal } from '@polkadot/x-global';
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const BigInt = xglobal.BigInt;
|
||||
const _BigInt = BigInt;
|
||||
|
||||
export { _BigInt as BigInt };
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/util": "9.6.2",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.2",
|
||||
"buffer-es6": "^4.9.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/x-global": "9.6.2",
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.2",
|
||||
"@types/node-fetch": "^2.6.2",
|
||||
"node-fetch": "^2.6.7"
|
||||
"node-fetch": "^3.2.9"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/x-fetch authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './browser';
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
const _fetch = fetch;
|
||||
|
||||
export { _fetch as fetch };
|
||||
|
||||
@@ -1,10 +1,33 @@
|
||||
// Copyright 2017-2022 @polkadot/x-fetch authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import nodeFetch from 'node-fetch';
|
||||
|
||||
import { extractGlobal } from '@polkadot/x-global';
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
// This is an ESM module, use the async import(...) syntax to pull it
|
||||
// in. Logically we would like it in nodeFetch(...) itself, however
|
||||
// while it is all-ok on Node itself, it does create issues in Jest,
|
||||
// possibly due to the Jest 28 need for --experimental-vm-modules
|
||||
const importFetch = import('node-fetch').catch(() => null);
|
||||
|
||||
// keep track of the resolved import value
|
||||
let modFn: typeof fetch | null = null;
|
||||
|
||||
async function nodeFetch (...args: Parameters<typeof fetch>): Promise<Response> {
|
||||
if (modFn) {
|
||||
return modFn(...args);
|
||||
}
|
||||
|
||||
const mod = await importFetch;
|
||||
|
||||
if (!mod || !mod.default) {
|
||||
throw new Error('Unable to import node-fetch in this environment');
|
||||
}
|
||||
|
||||
modFn = mod.default as unknown as typeof fetch;
|
||||
|
||||
return modFn(...args);
|
||||
}
|
||||
|
||||
export const fetch = extractGlobal('fetch', nodeFetch);
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3"
|
||||
"@babel/runtime": "^7.18.9"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,14 +3,21 @@
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
type GlobalThis = typeof globalThis;
|
||||
// Ensure that we are able to run this without any @types/node definitions
|
||||
// and without having lib: ['dom'] in our TypeScript configuration
|
||||
// (may not be available in all environments, e.g. Deno springs to mind)
|
||||
declare const global: unknown;
|
||||
declare const self: unknown;
|
||||
declare const window: unknown;
|
||||
|
||||
type GlobalNames = keyof typeof window;
|
||||
type GlobalThis = typeof globalThis & Record<string, unknown>;
|
||||
|
||||
type GlobalType<T extends keyof typeof window> = typeof window[T];
|
||||
type GlobalNames = keyof typeof globalThis;
|
||||
|
||||
function evaluateThis (fn: (code: string) => unknown): GlobalThis {
|
||||
return fn('return this') as GlobalThis;
|
||||
type GlobalType<N extends GlobalNames> = typeof globalThis[N];
|
||||
|
||||
function evaluateThis (fn: (code: string) => unknown): unknown {
|
||||
return fn('return this');
|
||||
}
|
||||
|
||||
export const xglobal = (
|
||||
@@ -23,7 +30,7 @@ export const xglobal = (
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: evaluateThis(Function)
|
||||
);
|
||||
) as GlobalThis;
|
||||
|
||||
export function extractGlobal <N extends GlobalNames, T extends GlobalType<N>> (name: N, fallback: unknown): T {
|
||||
// Not quite sure why this is here - snuck in with TS 4.7.2 with no real idea
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -17,15 +17,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/x-global": "9.6.2"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-native": "^0.68.0"
|
||||
"@types/react-native": "^0.69.3"
|
||||
},
|
||||
"denoDependencies": {
|
||||
"crypto": "std@0.148.0/node/crypto.ts"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/x-randomvalues authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './browser';
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export function getRandomValues <T extends Uint8Array> (arr: T): T {
|
||||
return crypto.getRandomValues(arr);
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', path: 'auto', type: 'auto', version: '9.6.2' };
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', path: 'auto', type: 'auto', version: '10.1.2' };
|
||||
|
||||
@@ -17,12 +17,15 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "9.6.2",
|
||||
"version": "10.1.2",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@polkadot/x-global": "9.6.2"
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.2"
|
||||
},
|
||||
"denoDependencies": {
|
||||
"util": "std@0.148.0/node/util.ts"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright 2017-2022 @polkadot/x-textencoder authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { xglobal } from '@polkadot/x-global';
|
||||
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const TextDecoder = xglobal.TextDecoder;
|
||||
const _TextDecoder = TextDecoder;
|
||||
|
||||
export { _TextDecoder as TextDecoder };
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user