Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cefeb0bb51 | ||
|
|
1d675ec803 | ||
|
|
7596dfa65c | ||
|
|
508e997c64 | ||
|
|
89563ee05c | ||
|
|
8b72584d53 | ||
|
|
4ae62c114b | ||
|
|
823fb51d18 | ||
|
|
a840b815bd | ||
|
|
fbf973dc2a | ||
|
|
2698f6779f | ||
|
|
3b5de80c54 | ||
|
|
041f5a7c2b | ||
|
|
cb8f1130af | ||
|
|
f480df7504 | ||
|
|
51763d3bf9 | ||
|
|
d2b7e88060 | ||
|
|
b20df563ce | ||
|
|
5ada180d66 | ||
|
|
a4256de444 | ||
|
|
bce5553a4b | ||
|
|
670743cbcf | ||
|
|
ffed9ceb6d | ||
|
|
bbacb1b80a | ||
|
|
5ea38c9898 | ||
|
|
7177722a49 | ||
|
|
6083923604 | ||
|
|
7a3e1c23aa | ||
|
|
cab50dbf7a | ||
|
|
9964b308ce | ||
|
|
247a0e7227 | ||
|
|
f2dba8aff8 | ||
|
|
2ef18335e3 | ||
|
|
fa0818d088 | ||
|
|
2106626f22 | ||
|
|
fceab0becc | ||
|
|
bdf42368f7 | ||
|
|
36ab5ea5e2 | ||
|
|
c5c8469038 | ||
|
|
83d0121a28 | ||
|
|
aff74ebde3 | ||
|
|
be4619ba3d | ||
|
|
17bc2e9fa0 | ||
|
|
66e2382f26 | ||
|
|
6c299f81c6 | ||
|
|
a4fcba6ff6 | ||
|
|
1a3507366e | ||
|
|
65939dbe9d | ||
|
|
6914411232 | ||
|
|
c79f46aaa2 | ||
|
|
cea09b2c8b | ||
|
|
bc23ed9fc9 | ||
|
|
a4f286e89a | ||
|
|
f112f9eb5e | ||
|
|
010552ca44 | ||
|
|
9ae4b1066e | ||
|
|
1a57abde6e | ||
|
|
cf4b44940e | ||
|
|
81e19aace4 | ||
|
|
7341c32df5 | ||
|
|
bb1ed6cfcd | ||
|
|
55dcfb5e18 | ||
|
|
2fe9e5a125 | ||
|
|
e24385213d | ||
|
|
9cd81a23e7 | ||
|
|
64348860cb | ||
|
|
ecfceb5d0a | ||
|
|
cc840c37a2 | ||
|
|
527af12b0f | ||
|
|
9f2b98d5a8 | ||
|
|
4bd767fb62 | ||
|
|
cff29dfd2d | ||
|
|
d26b80905c | ||
|
|
4249679882 | ||
|
|
ff27055808 | ||
|
|
54f8acb27f | ||
|
|
017bebe8bb | ||
|
|
89f5670d8b | ||
|
|
b9e2293bee | ||
|
|
3b45418e47 | ||
|
|
6af7f6ef24 | ||
|
|
a0b85ee7f8 | ||
|
|
2e0c6c3368 | ||
|
|
1d36284369 | ||
|
|
94788692bb | ||
|
|
1f3f5d5980 | ||
|
|
90c2638221 | ||
|
|
98e02a0baa | ||
|
|
e96a204bb5 | ||
|
|
0dc4ec48da | ||
|
|
5d5c7e4c0a | ||
|
|
76c973f5c5 | ||
|
|
7608f2eed9 | ||
|
|
e585aa1899 | ||
|
|
82152352ea | ||
|
|
515e1d62af | ||
|
|
2d2e6bc1bf | ||
|
|
5bb89db279 |
@@ -1,6 +1,8 @@
|
|||||||
--test-*
|
--test-*
|
||||||
_book/
|
_book/
|
||||||
build/
|
build/
|
||||||
|
build-cjs/
|
||||||
|
build-esm/
|
||||||
build-docs/
|
build-docs/
|
||||||
coverage/
|
coverage/
|
||||||
docs/.vuepress/dist/
|
docs/.vuepress/dist/
|
||||||
|
|||||||
@@ -1,5 +1,65 @@
|
|||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
|
## 9.3.1 May 29, 2022
|
||||||
|
|
||||||
|
Contributed:
|
||||||
|
|
||||||
|
- Add Ledger support for Parallel (Thanks to https://github.com/carlosala)
|
||||||
|
- Add Ledger support for Astar & Polkadex (Thanks to https://github.com/carlosala)
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
- Adjust `u8aToU8a` checks with better `isU8a` shortcut
|
||||||
|
- Adjust compact conversion with unrolled loops
|
||||||
|
- Adjust `string{Camel, Pascal}Case` with loop (no map)
|
||||||
|
- Add `compactFromU8aLim` variant with Uint8Array-only inputs
|
||||||
|
- Add `u8aConcatStrict` variant with Uint8Array-only inputs
|
||||||
|
- Internal code maintainability enhancements
|
||||||
|
- Upgrade dependencies to latest stable versions
|
||||||
|
|
||||||
|
|
||||||
|
## 9.2.1 May 13, 2022
|
||||||
|
|
||||||
|
Contributed:
|
||||||
|
|
||||||
|
- Add Ledger support for Acala (Thanks to https://github.com/ntduan)
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
- Optimize `u8aToHex` with direct (non-hex) conversion
|
||||||
|
- Change all occurences of `.substr(...)` to `.substring(...)`
|
||||||
|
- Sync with upstream Substrate ss58 registry
|
||||||
|
- Mark deprecated function signatures (no removals)
|
||||||
|
- Re-enable auto init of `cryptoWaitReady()`
|
||||||
|
- Upgrade to `@polkadot/wasm-crypto` 6.1.1
|
||||||
|
|
||||||
|
|
||||||
|
## 9.1.1 Apr 30, 2022
|
||||||
|
|
||||||
|
Contributed:
|
||||||
|
|
||||||
|
- Add Ledger support for Statemint (Thanks to https://github.com/carlosala)
|
||||||
|
- Add Ledger support for xxnetwork (Thanks to https://github.com/xx-labs)
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
- Adjust/dedupe output from `detectPackage`
|
||||||
|
- Adjust `isHex` performance test
|
||||||
|
- Add field-level comments to some `*Options` structures
|
||||||
|
- Add new Rococo genesisHash (reset)
|
||||||
|
|
||||||
|
|
||||||
|
## 9.0.1 Apr 9, 2022
|
||||||
|
|
||||||
|
- **Breaking change** In this major version the commonjs outputs are moved to a sub-folder. Since the export map and main field in package.json does reflect this change, there should be no usage changes. However the packages here will all need to be on the same version for internal linkage.
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
- Be explicit in `@polkadot/util-crypto` re-exports from `@polkadot/networks`
|
||||||
|
- Output commonjs files under the `cjs/**` root
|
||||||
|
- Upgrade to `@polkadot/wasm-crypto` 6.0.1
|
||||||
|
|
||||||
|
|
||||||
## 8.7.1 Mar 27, 2022
|
## 8.7.1 Mar 27, 2022
|
||||||
|
|
||||||
Changes:
|
Changes:
|
||||||
|
|||||||
+4
-1
@@ -1,9 +1,10 @@
|
|||||||
1288 Jaco 8.7.1 (#1449)
|
1332 Jaco 9.3.1 (#1507)
|
||||||
9 Antoine Estienne Add eth uri keyring test (#1291)
|
9 Antoine Estienne Add eth uri keyring test (#1291)
|
||||||
6 Amaury Martiny Add tests from Rust (#283)
|
6 Amaury Martiny Add tests from Rust (#283)
|
||||||
5 kwingram25 Add BN consts and timeToString (#610)
|
5 kwingram25 Add BN consts and timeToString (#610)
|
||||||
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
||||||
4 Jakub Pánik Add basilisk 🐍 (#1396)
|
4 Jakub Pánik Add basilisk 🐍 (#1396)
|
||||||
|
3 Carlo Sala some changes to KnownLedger (#1497)
|
||||||
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
||||||
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
||||||
2 Gav Wood Fix stake:unstake (#182)
|
2 Gav Wood Fix stake:unstake (#182)
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
1 Mario Neises remove redudant export (#257)
|
1 Mario Neises remove redudant export (#257)
|
||||||
1 Miguel Hervas Add CFG Ledger Support (#1057)
|
1 Miguel Hervas Add CFG Ledger Support (#1057)
|
||||||
1 nahuseyoum Reserving 65 for Aventus based on the new extended range (#871)
|
1 nahuseyoum Reserving 65 for Aventus based on the new extended range (#871)
|
||||||
|
1 Nantian add acala ledger config (#1485)
|
||||||
1 qwer951123 Add acala genesis (#1161)
|
1 qwer951123 Add acala genesis (#1161)
|
||||||
1 Raoul Millais Fix yarn add instructions in x-global README (#873)
|
1 Raoul Millais Fix yarn add instructions in x-global README (#873)
|
||||||
1 Raymond Zhong Add Edgeware ledger app (#1006)
|
1 Raymond Zhong Add Edgeware ledger app (#1006)
|
||||||
@@ -44,4 +46,5 @@
|
|||||||
1 Tore19 Add stafi genesis hash (#1096)
|
1 Tore19 Add stafi genesis hash (#1096)
|
||||||
1 Wei Tang ss58: add Kulupu prefix to the list (#595)
|
1 Wei Tang ss58: add Kulupu prefix to the list (#595)
|
||||||
1 WoeOm Handing high precision scenes (#450)
|
1 WoeOm Handing high precision scenes (#450)
|
||||||
|
1 xx network Add xxnetwork genesis hash and ledger app (#1463)
|
||||||
1 Yuri Extra check for process for browser bundles (#923)
|
1 Yuri Extra check for process for browser bundles (#923)
|
||||||
+5
-5
@@ -10,7 +10,7 @@
|
|||||||
"url": "https://github.com/polkadot-js/common.git"
|
"url": "https://github.com/polkadot-js/common.git"
|
||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
],
|
],
|
||||||
@@ -27,11 +27,11 @@
|
|||||||
"test:one": "polkadot-dev-run-test --runInBand"
|
"test:one": "polkadot-dev-run-test --runInBand"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.17.8",
|
"@babel/core": "^7.18.2",
|
||||||
"@polkadot/dev": "^0.65.101",
|
"@polkadot/dev": "^0.66.30",
|
||||||
"@types/jest": "^27.4.1"
|
"@types/jest": "^27.5.1"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"typescript": "^4.6.3"
|
"typescript": "^4.6.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,18 +16,18 @@
|
|||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"browser": "browser.js",
|
"browser": "browser.js",
|
||||||
"main": "node.js",
|
"main": "node.js",
|
||||||
"react-native": "react-native.js",
|
"react-native": "react-native.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@ledgerhq/hw-transport": "^6.24.1",
|
"@ledgerhq/hw-transport": "^6.27.1",
|
||||||
"@ledgerhq/hw-transport-webhid": "^6.24.1",
|
"@ledgerhq/hw-transport-webhid": "^6.27.1",
|
||||||
"@ledgerhq/hw-transport-webusb": "^6.24.1",
|
"@ledgerhq/hw-transport-webusb": "^6.27.1",
|
||||||
"@polkadot/util": "8.7.1"
|
"@polkadot/util": "9.3.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.26.0"
|
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -19,13 +19,13 @@
|
|||||||
"./detectPackage.cjs"
|
"./detectPackage.cjs"
|
||||||
],
|
],
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@ledgerhq/hw-transport": "^6.24.1",
|
"@ledgerhq/hw-transport": "^6.27.1",
|
||||||
"@polkadot/hw-ledger-transports": "8.7.1",
|
"@polkadot/hw-ledger-transports": "9.3.1",
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"@zondax/ledger-substrate": "^0.24.0"
|
"@zondax/ledger-substrate": "^0.29.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,20 +4,27 @@
|
|||||||
import type Transport from '@ledgerhq/hw-transport';
|
import type Transport from '@ledgerhq/hw-transport';
|
||||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||||
|
|
||||||
import { newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp } from '@zondax/ledger-substrate';
|
import { newAcalaApp, newAstarApp, newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp, newStatemintApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||||
|
|
||||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
// 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> = {
|
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||||
|
acala: newAcalaApp,
|
||||||
|
astar: newAstarApp,
|
||||||
bifrost: newBifrostApp,
|
bifrost: newBifrostApp,
|
||||||
centrifuge: newCentrifugeApp,
|
centrifuge: newCentrifugeApp,
|
||||||
'dock-mainnet': newDockApp,
|
'dock-mainnet': newDockApp,
|
||||||
edgeware: newEdgewareApp,
|
edgeware: newEdgewareApp,
|
||||||
equilibrium: newEquilibriumApp,
|
equilibrium: newEquilibriumApp,
|
||||||
genshiro: newGenshiroApp,
|
genshiro: newGenshiroApp,
|
||||||
|
karura: newKaruraApp,
|
||||||
kusama: newKusamaApp,
|
kusama: newKusamaApp,
|
||||||
'nodle-chain': newNodleApp,
|
'nodle-para': newNodleApp,
|
||||||
|
parallel: newParallelApp,
|
||||||
|
polkadex: newPolkadexApp,
|
||||||
polkadot: newPolkadotApp,
|
polkadot: newPolkadotApp,
|
||||||
polymesh: newPolymeshApp,
|
polymesh: newPolymeshApp,
|
||||||
sora: newSoraApp,
|
sora: newSoraApp,
|
||||||
statemine: newStatemineApp
|
statemine: newStatemineApp,
|
||||||
|
statemint: newStatemintApp,
|
||||||
|
xxnetwork: newXXNetworkApp
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export interface AccountOptions {
|
|||||||
|
|
||||||
export interface LedgerAddress {
|
export interface LedgerAddress {
|
||||||
address: string;
|
address: string;
|
||||||
publicKey: string;
|
publicKey: HexString;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LedgerSignature {
|
export interface LedgerSignature {
|
||||||
@@ -23,5 +23,8 @@ export interface LedgerSignature {
|
|||||||
export interface LedgerVersion {
|
export interface LedgerVersion {
|
||||||
isLocked: boolean;
|
isLocked: boolean;
|
||||||
isTestMode: boolean;
|
isTestMode: boolean;
|
||||||
|
/**
|
||||||
|
* @description Tuple with major, minor, patch
|
||||||
|
*/
|
||||||
version: [number, number, number];
|
version: [number, number, number];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,15 +20,15 @@
|
|||||||
"./detectPackage.cjs"
|
"./detectPackage.cjs"
|
||||||
],
|
],
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"@polkadot/util-crypto": "8.7.1"
|
"@polkadot/util-crypto": "9.3.1"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"@polkadot/util-crypto": "8.7.1"
|
"@polkadot/util-crypto": "9.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -5,7 +5,13 @@ import type { HexString } from '@polkadot/util/types';
|
|||||||
import type { EncryptedJson, Keypair, KeypairType, Prefix } from '@polkadot/util-crypto/types';
|
import type { EncryptedJson, Keypair, KeypairType, Prefix } from '@polkadot/util-crypto/types';
|
||||||
|
|
||||||
export interface KeyringOptions {
|
export interface KeyringOptions {
|
||||||
|
/**
|
||||||
|
* @description The ss58Format to use for address encoding (defaults to 42)
|
||||||
|
*/
|
||||||
ss58Format?: Prefix;
|
ss58Format?: Prefix;
|
||||||
|
/**
|
||||||
|
* @description The type of keyring to create (defaults to ed25519)
|
||||||
|
*/
|
||||||
type?: KeypairType;
|
type?: KeypairType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,6 +23,9 @@ export interface KeyringPair$Json extends EncryptedJson {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface SignOptions {
|
export interface SignOptions {
|
||||||
|
/**
|
||||||
|
* @description Create a MultiSignature-compatible output with an indicator type
|
||||||
|
**/
|
||||||
withType?: boolean;
|
withType?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,15 +17,15 @@
|
|||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"@substrate/ss58-registry": "^1.17.0"
|
"@substrate/ss58-registry": "^1.20.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@polkadot/hw-ledger": "8.7.1",
|
"@polkadot/hw-ledger": "9.3.1",
|
||||||
"@polkadot/x-fetch": "8.7.1"
|
"@polkadot/x-fetch": "9.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,12 +53,18 @@ export const knownGenesis: KnownGenesis = {
|
|||||||
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
|
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
|
||||||
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
|
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
|
||||||
],
|
],
|
||||||
'nodle-chain': [
|
'nodle-para': [
|
||||||
'0xa3d114c2b8d0627c1aa9b134eafcf7d05ca561fdc19fb388bb9457f81809fb23'
|
'0x97da7ede98d7bad4e36b4d734b6055425a3be036da2a332ea5a7037656427a21'
|
||||||
|
],
|
||||||
|
parallel: [
|
||||||
|
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
|
||||||
],
|
],
|
||||||
picasso: [
|
picasso: [
|
||||||
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
||||||
],
|
],
|
||||||
|
polkadex: [
|
||||||
|
'0x3920bcb4960a1eef5580cd5367ff3f430eef052774f78468852f7b9cb39f8a3c'
|
||||||
|
],
|
||||||
polkadot: [
|
polkadot: [
|
||||||
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
|
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
|
||||||
],
|
],
|
||||||
@@ -66,6 +72,7 @@ export const knownGenesis: KnownGenesis = {
|
|||||||
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
|
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
|
||||||
],
|
],
|
||||||
rococo: [
|
rococo: [
|
||||||
|
'0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e',
|
||||||
'0xaaf2cd1b74b5f726895921259421b534124726263982522174147046b8827897',
|
'0xaaf2cd1b74b5f726895921259421b534124726263982522174147046b8827897',
|
||||||
'0x037f5f3c8e67b314062025fc886fcd6238ea25a4a9b45dce8d246815c9ebe770',
|
'0x037f5f3c8e67b314062025fc886fcd6238ea25a4a9b45dce8d246815c9ebe770',
|
||||||
'0xc196f81260cf1686172b47a79cf002120735d7cb0eb1474e8adce56618456fff',
|
'0xc196f81260cf1686172b47a79cf002120735d7cb0eb1474e8adce56618456fff',
|
||||||
@@ -87,10 +94,16 @@ export const knownGenesis: KnownGenesis = {
|
|||||||
statemine: [
|
statemine: [
|
||||||
'0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'
|
'0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'
|
||||||
],
|
],
|
||||||
|
statemint: [
|
||||||
|
'0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f'
|
||||||
|
],
|
||||||
subsocial: [
|
subsocial: [
|
||||||
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
|
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
|
||||||
],
|
],
|
||||||
westend: [
|
westend: [
|
||||||
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
|
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
|
||||||
|
],
|
||||||
|
xxnetwork: [
|
||||||
|
'0x50dd5d206917bf10502c68fb4d18a59fc8aa31586f4e8856b493e43544aa82aa'
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,16 +8,23 @@ import type { KnownLedger } from '../types';
|
|||||||
//
|
//
|
||||||
// NOTE: Any network here needs to have a genesisHash attached in the ./genesis.ts config
|
// NOTE: Any network here needs to have a genesisHash attached in the ./genesis.ts config
|
||||||
export const knownLedger: KnownLedger = {
|
export const knownLedger: KnownLedger = {
|
||||||
|
acala: 0x00000313,
|
||||||
|
astar: 0x0000032a,
|
||||||
bifrost: 0x00000314,
|
bifrost: 0x00000314,
|
||||||
centrifuge: 0x000002eb,
|
centrifuge: 0x000002eb,
|
||||||
'dock-mainnet': 0x00000252,
|
'dock-mainnet': 0x00000252,
|
||||||
edgeware: 0x0000020b,
|
edgeware: 0x0000020b,
|
||||||
equilibrium: 0x05f5e0fd,
|
equilibrium: 0x05f5e0fd,
|
||||||
genshiro: 0x05f5e0fc,
|
genshiro: 0x05f5e0fc,
|
||||||
|
karura: 0x000002ae,
|
||||||
kusama: 0x000001b2,
|
kusama: 0x000001b2,
|
||||||
'nodle-chain': 0x000003eb,
|
'nodle-para': 0x000003eb,
|
||||||
|
parallel: 0x00000162,
|
||||||
|
polkadex: 0x0000031f,
|
||||||
polkadot: 0x00000162,
|
polkadot: 0x00000162,
|
||||||
polymesh: 0x00000253,
|
polymesh: 0x00000253,
|
||||||
sora: 0x00000269,
|
sora: 0x00000269,
|
||||||
statemine: 0x000001b2 // common-good on Kusama, shares derivation
|
statemine: 0x000001b2, // common-good on Kusama, shares derivation
|
||||||
|
statemint: 0x00000162, // common-good on Polkadot, shares derivation
|
||||||
|
xxnetwork: 0x000007a3
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -113,6 +113,6 @@ describe('selectableNetworks', (): void => {
|
|||||||
|
|
||||||
it('has a sorted list (first external, last external)', (): void => {
|
it('has a sorted list (first external, last external)', (): void => {
|
||||||
expect(selectableNetworks[3].displayName).toEqual('Acala');
|
expect(selectableNetworks[3].displayName).toEqual('Acala');
|
||||||
expect(selectableNetworks[selectableNetworks.length - 1].displayName).toEqual('Stafi');
|
expect(selectableNetworks[selectableNetworks.length - 1].displayName).toEqual('xx network');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
// Copyright 2017-2022 @polkadot/networks authors & contributors
|
// Copyright 2017-2022 @polkadot/networks authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
// TODO: This was removed, really cannot recall the reason...
|
||||||
|
// ... put it back, but keep it removed
|
||||||
|
// import './detectPackage';
|
||||||
|
|
||||||
export * from './interfaces';
|
export * from './interfaces';
|
||||||
export { packageInfo } from './packageInfo';
|
export { packageInfo } from './packageInfo';
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -245,22 +245,9 @@
|
|||||||
"standardAccount": "*25519",
|
"standardAccount": "*25519",
|
||||||
"website": "https://stafi.io"
|
"website": "https://stafi.io"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"prefix": 21,
|
|
||||||
"network": "dock-testnet",
|
|
||||||
"displayName": "Dock Testnet",
|
|
||||||
"symbols": [
|
|
||||||
"DCK"
|
|
||||||
],
|
|
||||||
"decimals": [
|
|
||||||
6
|
|
||||||
],
|
|
||||||
"standardAccount": "*25519",
|
|
||||||
"website": "https://dock.io"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"prefix": 22,
|
"prefix": 22,
|
||||||
"network": "dock-mainnet",
|
"network": "dock-pos-mainnet",
|
||||||
"displayName": "Dock Mainnet",
|
"displayName": "Dock Mainnet",
|
||||||
"symbols": [
|
"symbols": [
|
||||||
"DCK"
|
"DCK"
|
||||||
@@ -459,12 +446,12 @@
|
|||||||
{
|
{
|
||||||
"prefix": 38,
|
"prefix": 38,
|
||||||
"network": "kilt",
|
"network": "kilt",
|
||||||
"displayName": "KILT Chain",
|
"displayName": "KILT Spiritnet",
|
||||||
"symbols": [
|
"symbols": [
|
||||||
"KILT"
|
"KILT"
|
||||||
],
|
],
|
||||||
"decimals": [
|
"decimals": [
|
||||||
18
|
15
|
||||||
],
|
],
|
||||||
"standardAccount": "*25519",
|
"standardAccount": "*25519",
|
||||||
"website": "https://kilt.io/"
|
"website": "https://kilt.io/"
|
||||||
@@ -793,6 +780,32 @@
|
|||||||
"standardAccount": "*25519",
|
"standardAccount": "*25519",
|
||||||
"website": "https://polkadex.trade"
|
"website": "https://polkadex.trade"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"prefix": 89,
|
||||||
|
"network": "polkadexparachain",
|
||||||
|
"displayName": "Polkadex Parachain",
|
||||||
|
"symbols": [
|
||||||
|
"PDEX"
|
||||||
|
],
|
||||||
|
"decimals": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"standardAccount": "*25519",
|
||||||
|
"website": "https://polkadex.trade"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefix": 93,
|
||||||
|
"network": "fragnova",
|
||||||
|
"displayName": "Fragnova Network",
|
||||||
|
"symbols": [
|
||||||
|
"NOVA"
|
||||||
|
],
|
||||||
|
"decimals": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"standardAccount": "*25519",
|
||||||
|
"website": "https://fragnova.com"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"prefix": 98,
|
"prefix": 98,
|
||||||
"network": "polkasmith",
|
"network": "polkasmith",
|
||||||
@@ -824,13 +837,13 @@
|
|||||||
"network": "origintrail-parachain",
|
"network": "origintrail-parachain",
|
||||||
"displayName": "OriginTrail Parachain",
|
"displayName": "OriginTrail Parachain",
|
||||||
"symbols": [
|
"symbols": [
|
||||||
"TRAC"
|
"OTP"
|
||||||
],
|
],
|
||||||
"decimals": [
|
"decimals": [
|
||||||
18
|
12
|
||||||
],
|
],
|
||||||
"standardAccount": "secp256k1",
|
"standardAccount": "*25519",
|
||||||
"website": "https://origintrail.io"
|
"website": "https://parachain.origintrail.io/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"prefix": 105,
|
"prefix": 105,
|
||||||
@@ -867,6 +880,19 @@
|
|||||||
"standardAccount": "*25519",
|
"standardAccount": "*25519",
|
||||||
"website": "https://integritee.network"
|
"website": "https://integritee.network"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"prefix": 117,
|
||||||
|
"network": "tinker",
|
||||||
|
"displayName": "Tinker",
|
||||||
|
"symbols": [
|
||||||
|
"TNKR"
|
||||||
|
],
|
||||||
|
"decimals": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"standardAccount": "*25519",
|
||||||
|
"website": "https://invarch.network"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"prefix": 128,
|
"prefix": 128,
|
||||||
"network": "clover",
|
"network": "clover",
|
||||||
@@ -1024,7 +1050,7 @@
|
|||||||
"website": "https://moonbeam.network"
|
"website": "https://moonbeam.network"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"prefix": 1337,
|
"prefix": 1328,
|
||||||
"network": "ajuna",
|
"network": "ajuna",
|
||||||
"displayName": "Ajuna Network",
|
"displayName": "Ajuna Network",
|
||||||
"symbols": [
|
"symbols": [
|
||||||
@@ -1033,7 +1059,20 @@
|
|||||||
"decimals": [
|
"decimals": [
|
||||||
12
|
12
|
||||||
],
|
],
|
||||||
"standardAccount": "Sr25519",
|
"standardAccount": "*25519",
|
||||||
|
"website": "https://ajuna.io"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefix": 1337,
|
||||||
|
"network": "bajun",
|
||||||
|
"displayName": "Bajun Network",
|
||||||
|
"symbols": [
|
||||||
|
"BAJU"
|
||||||
|
],
|
||||||
|
"decimals": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"standardAccount": "*25519",
|
||||||
"website": "https://ajuna.io"
|
"website": "https://ajuna.io"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,21 +22,21 @@
|
|||||||
"./detectPackage.cjs"
|
"./detectPackage.cjs"
|
||||||
],
|
],
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"browser": {
|
"browser": {
|
||||||
"crypto": false,
|
"crypto": false,
|
||||||
"stream": false
|
"stream": false
|
||||||
},
|
},
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@noble/hashes": "1.0.0",
|
"@noble/hashes": "1.0.0",
|
||||||
"@noble/secp256k1": "1.5.5",
|
"@noble/secp256k1": "1.5.5",
|
||||||
"@polkadot/networks": "8.7.1",
|
"@polkadot/networks": "9.3.1",
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"@polkadot/wasm-crypto": "^5.1.1",
|
"@polkadot/wasm-crypto": "^6.1.1",
|
||||||
"@polkadot/x-bigint": "8.7.1",
|
"@polkadot/x-bigint": "9.3.1",
|
||||||
"@polkadot/x-randomvalues": "8.7.1",
|
"@polkadot/x-randomvalues": "9.3.1",
|
||||||
"@scure/base": "1.0.0",
|
"@scure/base": "1.0.0",
|
||||||
"ed2curve": "^0.3.0",
|
"ed2curve": "^0.3.0",
|
||||||
"tweetnacl": "^1.0.3"
|
"tweetnacl": "^1.0.3"
|
||||||
@@ -45,6 +45,6 @@
|
|||||||
"@types/ed2curve": "^0.2.2"
|
"@types/ed2curve": "^0.2.2"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@polkadot/util": "8.7.1"
|
"@polkadot/util": "9.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,5 @@ import { decodeAddress } from './decode';
|
|||||||
* @summary Converts an SS58 address to its corresponding EVM address.
|
* @summary Converts an SS58 address to its corresponding EVM address.
|
||||||
*/
|
*/
|
||||||
export function addressToEvm (address: HexString | string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
export function addressToEvm (address: HexString | string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||||
const decoded = decodeAddress(address, ignoreChecksum);
|
return decodeAddress(address, ignoreChecksum).subarray(0, 20);
|
||||||
|
|
||||||
return decoded.subarray(0, 20);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,12 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { Network } from '@polkadot/networks/types';
|
|
||||||
|
|
||||||
import { availableNetworks } from '../networks';
|
import { availableNetworks } from '../networks';
|
||||||
|
|
||||||
function networkToPrefix ({ prefix }: Network): number {
|
|
||||||
return prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaults = {
|
export const defaults = {
|
||||||
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
|
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
|
||||||
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
|
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
|
||||||
allowedEncodedLengths: [3, 4, 6, 10, 35, 36, 37, 38],
|
allowedEncodedLengths: [3, 4, 6, 10, 35, 36, 37, 38],
|
||||||
allowedPrefix: availableNetworks.map(networkToPrefix),
|
allowedPrefix: availableNetworks.map(({ prefix }) => prefix),
|
||||||
prefix: 42
|
prefix: 42
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const l = logger('setSS58Format');
|
|||||||
* @deprecated Use keyring.setSS58Format
|
* @deprecated Use keyring.setSS58Format
|
||||||
*/
|
*/
|
||||||
export function setSS58Format (prefix: Prefix): void {
|
export function setSS58Format (prefix: Prefix): void {
|
||||||
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as pat of the address encode function');
|
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as part of the address encode function');
|
||||||
|
|
||||||
defaults.prefix = prefix;
|
defaults.prefix = prefix;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export function createDecode ({ coder, ipfs }: Config, validate: ValidateFn): De
|
|||||||
|
|
||||||
return coder.decode(
|
return coder.decode(
|
||||||
ipfs && ipfsCompat
|
ipfs && ipfsCompat
|
||||||
? value.substr(1)
|
? value.substring(1)
|
||||||
: value
|
: value
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto';
|
|||||||
|
|
||||||
import { createAsHex } from '../helpers';
|
import { createAsHex } from '../helpers';
|
||||||
|
|
||||||
type BitLength = 64 | 128 | 256 | 384 | 512;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name blake2AsU8a
|
* @name blake2AsU8a
|
||||||
* @summary Creates a blake2b u8a from the input.
|
* @summary Creates a blake2b u8a from the input.
|
||||||
@@ -26,7 +24,7 @@ type BitLength = 64 | 128 | 256 | 384 | 512;
|
|||||||
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d]
|
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d]
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: BitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
|
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: 64 | 128 | 256 | 384 | 512 = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
|
||||||
const byteLength = Math.ceil(bitLength / 8);
|
const byteLength = Math.ceil(bitLength / 8);
|
||||||
const u8a = u8aToU8a(data);
|
const u8a = u8aToU8a(data);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { utils as utilsNobleSecp256k1 } from '@noble/secp256k1';
|
|||||||
|
|
||||||
import { u8aConcat } from '@polkadot/util';
|
import { u8aConcat } from '@polkadot/util';
|
||||||
|
|
||||||
// import { cryptoWaitReady } from './crypto';
|
import { cryptoWaitReady } from './crypto';
|
||||||
import { hmacSha256AsU8a } from './hmac';
|
import { hmacSha256AsU8a } from './hmac';
|
||||||
|
|
||||||
// Set overrides on the secp256k1 utils
|
// Set overrides on the secp256k1 utils
|
||||||
@@ -15,7 +15,7 @@ import { hmacSha256AsU8a } from './hmac';
|
|||||||
utilsNobleSecp256k1.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]) =>
|
utilsNobleSecp256k1.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]) =>
|
||||||
hmacSha256AsU8a(key, u8aConcat(...messages));
|
hmacSha256AsU8a(key, u8aConcat(...messages));
|
||||||
|
|
||||||
// // start init process immediately
|
// start init process immediately
|
||||||
// cryptoWaitReady().catch((): void => {
|
cryptoWaitReady().catch((): void => {
|
||||||
// // shouldn't happen, logged above
|
// shouldn't happen, logged and caught inside cryptoWaitReady
|
||||||
// });
|
});
|
||||||
|
|||||||
@@ -14,13 +14,12 @@ interface DualHash {
|
|||||||
512: (u8a: Uint8Array) => Uint8Array;
|
512: (u8a: Uint8Array) => Uint8Array;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
export function createAsHex <T extends (...args: never[]) => Uint8Array> (fn: T): (...args: Parameters<T>) => HexString {
|
||||||
export function createAsHex <T extends (...args: any[]) => Uint8Array> (fn: T): (...args: Parameters<T>) => HexString {
|
|
||||||
return (...args: Parameters<T>): HexString =>
|
return (...args: Parameters<T>): HexString =>
|
||||||
u8aToHex(fn(...args));
|
u8aToHex(fn(...args));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createBitHasher <T> (bitLength: T, fn: (data: HexString | Buffer | Uint8Array | string, bitLength: T, onlyJs?: boolean) => Uint8Array): (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array {
|
export function createBitHasher (bitLength: 256 | 512, fn: (data: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512, onlyJs?: boolean) => Uint8Array): (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array {
|
||||||
return (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array =>
|
return (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array =>
|
||||||
fn(data, bitLength, onlyJs);
|
fn(data, bitLength, onlyJs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import { sha512 } from '@noble/hashes/sha512';
|
|||||||
import { hasBigInt, u8aToU8a } from '@polkadot/util';
|
import { hasBigInt, u8aToU8a } from '@polkadot/util';
|
||||||
import { hmacSha256, hmacSha512, isReady } from '@polkadot/wasm-crypto';
|
import { hmacSha256, hmacSha512, isReady } from '@polkadot/wasm-crypto';
|
||||||
|
|
||||||
type BitLength = 256 | 512;
|
|
||||||
|
|
||||||
const JS_HASH = {
|
const JS_HASH = {
|
||||||
256: sha256,
|
256: sha256,
|
||||||
512: sha512
|
512: sha512
|
||||||
@@ -20,7 +18,7 @@ const WA_MHAC = {
|
|||||||
512: hmacSha512
|
512: hmacSha512
|
||||||
};
|
};
|
||||||
|
|
||||||
function createSha (bitLength: BitLength): (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array {
|
function createSha (bitLength: 256 | 512): (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array {
|
||||||
return (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean): Uint8Array =>
|
return (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean): Uint8Array =>
|
||||||
hmacShaAsU8a(key, data, bitLength, onlyJs);
|
hmacShaAsU8a(key, data, bitLength, onlyJs);
|
||||||
}
|
}
|
||||||
@@ -29,7 +27,7 @@ function createSha (bitLength: BitLength): (key: Uint8Array | string, data: Uint
|
|||||||
* @name hmacShaAsU8a
|
* @name hmacShaAsU8a
|
||||||
* @description creates a Hmac Sha (256/512) Uint8Array from the key & data
|
* @description creates a Hmac Sha (256/512) Uint8Array from the key & data
|
||||||
*/
|
*/
|
||||||
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: BitLength = 256, onlyJs?: boolean): Uint8Array {
|
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array {
|
||||||
const u8aKey = u8aToU8a(key);
|
const u8aKey = u8aToU8a(key);
|
||||||
|
|
||||||
return !hasBigInt || (!onlyJs && isReady())
|
return !hasBigInt || (!onlyJs && isReady())
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export class DeriveJunction {
|
|||||||
public static from (value: string): DeriveJunction {
|
public static from (value: string): DeriveJunction {
|
||||||
const result = new DeriveJunction();
|
const result = new DeriveJunction();
|
||||||
const [code, isHard] = value.startsWith('/')
|
const [code, isHard] = value.startsWith('/')
|
||||||
? [value.substr(1), true]
|
? [value.substring(1), true]
|
||||||
: [value, false];
|
: [value, false];
|
||||||
|
|
||||||
result.soft(
|
result.soft(
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export function keyExtractPath (derivePath: string): ExtractResult {
|
|||||||
constructed = parts.join('');
|
constructed = parts.join('');
|
||||||
|
|
||||||
for (const p of parts) {
|
for (const p of parts) {
|
||||||
path.push(DeriveJunction.from(p.substr(1)));
|
path.push(DeriveJunction.from(p.substring(1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
// - Use util-crypto randomAsU8a (instead of randombytes)
|
// - Use util-crypto randomAsU8a (instead of randombytes)
|
||||||
// - Remove setting of wordlist passing of wordlist in functions
|
// - Remove setting of wordlist passing of wordlist in functions
|
||||||
// - Remove mnemonicToSeed (we only use the sync variant)
|
// - Remove mnemonicToSeed (we only use the sync variant)
|
||||||
|
// - generateMnemonic takes number of words (instead of strength)
|
||||||
|
|
||||||
import { assert, stringToU8a, u8aToU8a } from '@polkadot/util';
|
import { assert, stringToU8a, u8aToU8a } from '@polkadot/util';
|
||||||
|
|
||||||
@@ -73,7 +74,7 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
|||||||
// calculate the checksum and compare
|
// calculate the checksum and compare
|
||||||
const entropyBytes = entropyBits.match(/(.{1,8})/g)?.map(binaryToByte);
|
const entropyBytes = entropyBits.match(/(.{1,8})/g)?.map(binaryToByte);
|
||||||
|
|
||||||
assert(entropyBytes && entropyBytes.length % 4 === 0 && entropyBytes.length >= 16 && entropyBytes.length <= 32, INVALID_ENTROPY);
|
assert(entropyBytes && (entropyBytes.length % 4 === 0) && (entropyBytes.length >= 16) && (entropyBytes.length <= 32), INVALID_ENTROPY);
|
||||||
|
|
||||||
const entropy = u8aToU8a(entropyBytes);
|
const entropy = u8aToU8a(entropyBytes);
|
||||||
const newChecksum = deriveChecksumBits(entropy);
|
const newChecksum = deriveChecksumBits(entropy);
|
||||||
@@ -85,7 +86,7 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
|||||||
|
|
||||||
export function entropyToMnemonic (entropy: Uint8Array): string {
|
export function entropyToMnemonic (entropy: Uint8Array): string {
|
||||||
// 128 <= ENT <= 256
|
// 128 <= ENT <= 256
|
||||||
assert(entropy.length % 4 === 0 && entropy.length >= 16 && entropy.length <= 32, INVALID_ENTROPY);
|
assert((entropy.length % 4 === 0) && (entropy.length >= 16) && (entropy.length <= 32), INVALID_ENTROPY);
|
||||||
|
|
||||||
const entropyBits = bytesToBinary(Array.from(entropy));
|
const entropyBits = bytesToBinary(Array.from(entropy));
|
||||||
const checksumBits = deriveChecksumBits(entropy);
|
const checksumBits = deriveChecksumBits(entropy);
|
||||||
@@ -97,12 +98,8 @@ export function entropyToMnemonic (entropy: Uint8Array): string {
|
|||||||
.join(' ');
|
.join(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateMnemonic (strength?: number): string {
|
export function generateMnemonic (numWords: 12 | 15 | 18 | 21 | 24): string {
|
||||||
strength = strength || 128;
|
return entropyToMnemonic(randomAsU8a((numWords / 3) * 4));
|
||||||
|
|
||||||
assert(strength % 32 === 0, INVALID_ENTROPY);
|
|
||||||
|
|
||||||
return entropyToMnemonic(randomAsU8a(strength / 8));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function validateMnemonic (mnemonic: string): boolean {
|
export function validateMnemonic (mnemonic: string): boolean {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import { cryptoWaitReady } from '..';
|
import { cryptoWaitReady } from '..';
|
||||||
import { mnemonicGenerate, WordCount } from './generate';
|
import { mnemonicGenerate } from './generate';
|
||||||
import { mnemonicValidate } from './validate';
|
import { mnemonicValidate } from './validate';
|
||||||
|
|
||||||
describe('mnemonicGenerate', (): void => {
|
describe('mnemonicGenerate', (): void => {
|
||||||
@@ -17,7 +17,7 @@ describe('mnemonicGenerate', (): void => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
|
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
|
||||||
it.each([12, 15, 18, 21, 24] as WordCount[])('generates a valid mnemonic (%p words)', (num): void => {
|
it.each([12, 15, 18, 21, 24] as 12[])('generates a valid mnemonic (%p words)', (num): void => {
|
||||||
const mnemonic = mnemonicGenerate(num, onlyJs);
|
const mnemonic = mnemonicGenerate(num, onlyJs);
|
||||||
const isValid = mnemonicValidate(mnemonic);
|
const isValid = mnemonicValidate(mnemonic);
|
||||||
|
|
||||||
|
|||||||
@@ -6,17 +6,6 @@ import { bip39Generate, isReady } from '@polkadot/wasm-crypto';
|
|||||||
|
|
||||||
import { generateMnemonic } from './bip39';
|
import { generateMnemonic } from './bip39';
|
||||||
|
|
||||||
export type WordCount = 12 | 15 | 18 | 21 | 24;
|
|
||||||
|
|
||||||
// mapping of words to the actual strength (as expected)
|
|
||||||
const STRENGTH_MAP = {
|
|
||||||
12: 16 * 8,
|
|
||||||
15: 20 * 8,
|
|
||||||
18: 24 * 8,
|
|
||||||
21: 28 * 8,
|
|
||||||
24: 32 * 8
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name mnemonicGenerate
|
* @name mnemonicGenerate
|
||||||
* @summary Creates a valid mnemonic string using using [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).
|
* @summary Creates a valid mnemonic string using using [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).
|
||||||
@@ -29,8 +18,8 @@ const STRENGTH_MAP = {
|
|||||||
* const mnemonic = mnemonicGenerate(); // => string
|
* const mnemonic = mnemonicGenerate(); // => string
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function mnemonicGenerate (numWords: WordCount = 12, onlyJs?: boolean): string {
|
export function mnemonicGenerate (numWords: 12 | 15 | 18 | 21 | 24 = 12, onlyJs?: boolean): string {
|
||||||
return !hasBigInt || (!onlyJs && isReady())
|
return !hasBigInt || (!onlyJs && isReady())
|
||||||
? bip39Generate(numWords)
|
? bip39Generate(numWords)
|
||||||
: generateMnemonic(STRENGTH_MAP[numWords]);
|
: generateMnemonic(numWords);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ describe('mnemonicToMiniSecret', (): void => {
|
|||||||
u8aToHex(mnemonicToMiniSecret(mnemonic, 'Substrate', onlyJs))
|
u8aToHex(mnemonicToMiniSecret(mnemonic, 'Substrate', onlyJs))
|
||||||
).toEqual(
|
).toEqual(
|
||||||
// mini returned here, only check first 32-bytes (64 hex + 2 prefix)
|
// mini returned here, only check first 32-bytes (64 hex + 2 prefix)
|
||||||
seed.substr(0, 66)
|
seed.substring(0, 66)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
export * from '@polkadot/networks/interfaces';
|
// Don't use a export * since we don't want to duplicate packageInfo
|
||||||
|
export { allNetworks, availableNetworks, selectableNetworks } from '@polkadot/networks';
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import { isReady, twox } from '@polkadot/wasm-crypto';
|
|||||||
import { createAsHex } from '../helpers';
|
import { createAsHex } from '../helpers';
|
||||||
import { xxhash64 } from './xxhash64';
|
import { xxhash64 } from './xxhash64';
|
||||||
|
|
||||||
type BitLength = 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name xxhashAsU8a
|
* @name xxhashAsU8a
|
||||||
* @summary Creates a xxhash64 u8a from the input.
|
* @summary Creates a xxhash64 u8a from the input.
|
||||||
@@ -25,7 +23,7 @@ type BitLength = 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512;
|
|||||||
* xxhashAsU8a('abc'); // => 0x44bc2cf5ad770999
|
* xxhashAsU8a('abc'); // => 0x44bc2cf5ad770999
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bitLength: BitLength = 64, onlyJs?: boolean): Uint8Array {
|
export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bitLength: 64 | 128 | 192 | 256 | 320 | 384 | 448 | 512 = 64, onlyJs?: boolean): Uint8Array {
|
||||||
const rounds = Math.ceil(bitLength / 64);
|
const rounds = Math.ceil(bitLength / 64);
|
||||||
const u8a = u8aToU8a(data);
|
const u8a = u8aToU8a(data);
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -9,13 +9,13 @@
|
|||||||
"exports": {
|
"exports": {
|
||||||
"./hex/toU8a": {
|
"./hex/toU8a": {
|
||||||
"node": {
|
"node": {
|
||||||
"require": "./hex/toU8aBuffer.cjs",
|
"require": "./cjs/hex/toU8aBuffer.js",
|
||||||
"default": "./hex/toU8aBuffer.js"
|
"default": "./hex/toU8aBuffer.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"./u8a/toHex": {
|
"./u8a/toHex": {
|
||||||
"node": {
|
"node": {
|
||||||
"require": "./u8a/toHexBuffer.cjs",
|
"require": "./cjs/u8a/toHexBuffer.js",
|
||||||
"default": "./u8a/toHexBuffer.js"
|
"default": "./u8a/toHexBuffer.js"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,19 +34,19 @@
|
|||||||
"./detectPackage.cjs"
|
"./detectPackage.cjs"
|
||||||
],
|
],
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/x-bigint": "8.7.1",
|
"@polkadot/x-bigint": "9.3.1",
|
||||||
"@polkadot/x-global": "8.7.1",
|
"@polkadot/x-global": "9.3.1",
|
||||||
"@polkadot/x-textdecoder": "8.7.1",
|
"@polkadot/x-textdecoder": "9.3.1",
|
||||||
"@polkadot/x-textencoder": "8.7.1",
|
"@polkadot/x-textencoder": "9.3.1",
|
||||||
"@types/bn.js": "^5.1.0",
|
"@types/bn.js": "^5.1.0",
|
||||||
"bn.js": "^5.2.0",
|
"bn.js": "^5.2.1",
|
||||||
"ip-regex": "^4.3.0"
|
"ip-regex": "^4.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@polkadot/x-randomvalues": "8.7.1"
|
"@polkadot/x-randomvalues": "9.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,23 +2,19 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { BN } from '../bn/bn';
|
import type { BN } from '../bn/bn';
|
||||||
import type { HexString, ToBigInt, ToBn, ToBnOptions } from '../types';
|
import type { HexString, NumberOptions, ToBigInt, ToBn } from '../types';
|
||||||
|
|
||||||
import { objectSpread } from '../object/spread';
|
import { objectSpread } from '../object/spread';
|
||||||
import { u8aToHex } from '../u8a';
|
import { u8aToHex } from '../u8a';
|
||||||
import { nToU8a } from './toU8a';
|
import { nToU8a } from './toU8a';
|
||||||
|
|
||||||
interface Options extends ToBnOptions {
|
|
||||||
bitLength?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ZERO_STR = '0x00';
|
const ZERO_STR = '0x00';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name nToHex
|
* @name nToHex
|
||||||
* @summary Creates a hex value from a bigint object.
|
* @summary Creates a hex value from a bigint object.
|
||||||
*/
|
*/
|
||||||
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: Options): HexString {
|
export function nToHex <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): HexString {
|
||||||
return !value
|
return !value
|
||||||
? ZERO_STR
|
? ZERO_STR
|
||||||
: u8aToHex(
|
: u8aToHex(
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { BN } from '../bn/bn';
|
import type { BN } from '../bn/bn';
|
||||||
import type { ToBigInt, ToBn, ToBnOptions } from '../types';
|
import type { NumberOptions, ToBigInt, ToBn } from '../types';
|
||||||
|
|
||||||
import { BigInt } from '@polkadot/x-bigint';
|
import { BigInt } from '@polkadot/x-bigint';
|
||||||
|
|
||||||
@@ -10,20 +10,10 @@ import { objectSpread } from '../object/spread';
|
|||||||
import { _0n, _1n } from './consts';
|
import { _0n, _1n } from './consts';
|
||||||
import { nToBigInt } from './toBigInt';
|
import { nToBigInt } from './toBigInt';
|
||||||
|
|
||||||
interface Options extends ToBnOptions {
|
|
||||||
bitLength?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const DIV = BigInt(256);
|
const DIV = BigInt(256);
|
||||||
const NEG_MASK = BigInt(0xff);
|
const NEG_MASK = BigInt(0xff);
|
||||||
|
|
||||||
function createEmpty ({ bitLength = 0 }: Options): Uint8Array {
|
function toU8a (value: bigint, { isLe, isNegative }: NumberOptions): Uint8Array {
|
||||||
return bitLength === -1
|
|
||||||
? new Uint8Array()
|
|
||||||
: new Uint8Array(Math.ceil(bitLength / 8));
|
|
||||||
}
|
|
||||||
|
|
||||||
function toU8a (value: bigint, { isLe, isNegative }: Options): Uint8Array {
|
|
||||||
const arr: number[] = [];
|
const arr: number[] = [];
|
||||||
|
|
||||||
if (isNegative) {
|
if (isNegative) {
|
||||||
@@ -54,8 +44,8 @@ function toU8a (value: bigint, { isLe, isNegative }: Options): Uint8Array {
|
|||||||
* @name nToU8a
|
* @name nToU8a
|
||||||
* @summary Creates a Uint8Array object from a bigint.
|
* @summary Creates a Uint8Array object from a bigint.
|
||||||
*/
|
*/
|
||||||
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: Options): Uint8Array {
|
export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions): Uint8Array {
|
||||||
const opts: Options = objectSpread(
|
const opts: NumberOptions = objectSpread(
|
||||||
{ bitLength: -1, isLe: true, isNegative: false },
|
{ bitLength: -1, isLe: true, isNegative: false },
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
@@ -63,7 +53,9 @@ export function nToU8a <ExtToBn extends ToBn | ToBigInt> (value?: ExtToBn | BN |
|
|||||||
const valueBi = nToBigInt(value);
|
const valueBi = nToBigInt(value);
|
||||||
|
|
||||||
if (valueBi === _0n) {
|
if (valueBi === _0n) {
|
||||||
return createEmpty(opts);
|
return opts.bitLength === -1
|
||||||
|
? new Uint8Array()
|
||||||
|
: new Uint8Array(Math.ceil((opts.bitLength || 0) / 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8a = toU8a(valueBi, opts);
|
const u8a = toU8a(valueBi, opts);
|
||||||
|
|||||||
@@ -27,10 +27,9 @@ import { BN } from './bn';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function bnToBn <ExtToBn extends ToBigInt | ToBn> (value?: HexString | ExtToBn | BN | bigint | string | number | null): BN {
|
export function bnToBn <ExtToBn extends ToBigInt | ToBn> (value?: HexString | ExtToBn | BN | bigint | string | number | null): BN {
|
||||||
return BN.isBN(value)
|
return value
|
||||||
? value
|
? BN.isBN(value)
|
||||||
: !value
|
? value
|
||||||
? new BN(0)
|
|
||||||
: isHex(value)
|
: isHex(value)
|
||||||
? hexToBn(value.toString())
|
? hexToBn(value.toString())
|
||||||
: isBigInt(value)
|
: isBigInt(value)
|
||||||
@@ -39,5 +38,6 @@ export function bnToBn <ExtToBn extends ToBigInt | ToBn> (value?: HexString | Ex
|
|||||||
? value.toBn()
|
? value.toBn()
|
||||||
: isToBigInt(value)
|
: isToBigInt(value)
|
||||||
? new BN(value.toBigInt().toString())
|
? new BN(value.toBigInt().toString())
|
||||||
: new BN(value);
|
: new BN(value)
|
||||||
|
: new BN(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ describe('bnToHex', (): void => {
|
|||||||
).toBe('0xfffffb2e');
|
).toBe('0xfffffb2e');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles backwards compatibility', (): void => {
|
it('handles legacy compatibility', (): void => {
|
||||||
expect(
|
expect(
|
||||||
bnToHex(new BN(1234), 32)
|
bnToHex(new BN(1234), 32)
|
||||||
).toBe(
|
).toBe(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { HexString, ToBn, ToBnOptions } from '../types';
|
import type { HexString, NumberOptions, ToBn } from '../types';
|
||||||
import type { BN } from './bn';
|
import type { BN } from './bn';
|
||||||
|
|
||||||
import { isNumber } from '../is/number';
|
import { isNumber } from '../is/number';
|
||||||
@@ -9,12 +9,8 @@ import { objectSpread } from '../object/spread';
|
|||||||
import { u8aToHex } from '../u8a';
|
import { u8aToHex } from '../u8a';
|
||||||
import { bnToU8a } from './toU8a';
|
import { bnToU8a } from './toU8a';
|
||||||
|
|
||||||
interface Options extends ToBnOptions {
|
|
||||||
bitLength?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ZERO_STR = '0x00';
|
const ZERO_STR = '0x00';
|
||||||
const DEFAULT_OPTS: Options = { bitLength: -1, isLe: false, isNegative: false };
|
const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: false, isNegative: false };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name bnToHex
|
* @name bnToHex
|
||||||
@@ -31,9 +27,11 @@ const DEFAULT_OPTS: Options = { bitLength: -1, isLe: false, isNegative: false };
|
|||||||
* bnToHex(new BN(0x123456)); // => '0x123456'
|
* bnToHex(new BN(0x123456)); // => '0x123456'
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, options?: Options): HexString;
|
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;
|
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): HexString;
|
||||||
function bnToHex <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, arg1: number | Options = DEFAULT_OPTS, arg2?: 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?: boolean): HexString {
|
||||||
return !value
|
return !value
|
||||||
? ZERO_STR
|
? ZERO_STR
|
||||||
: u8aToHex(
|
: u8aToHex(
|
||||||
|
|||||||
@@ -1,35 +1,14 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { ToBn, ToBnOptions } from '../types';
|
import type { NumberOptions, ToBn } from '../types';
|
||||||
import type { BN } from './bn';
|
import type { BN } from './bn';
|
||||||
|
|
||||||
import { isNumber } from '../is/number';
|
import { isNumber } from '../is/number';
|
||||||
import { objectSpread } from '../object/spread';
|
import { objectSpread } from '../object/spread';
|
||||||
import { bnToBn } from './toBn';
|
import { bnToBn } from './toBn';
|
||||||
|
|
||||||
interface Options extends ToBnOptions {
|
const DEFAULT_OPTS: NumberOptions = { bitLength: -1, isLe: true, isNegative: false };
|
||||||
bitLength?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEFAULT_OPTS: Options = { bitLength: -1, isLe: true, isNegative: false };
|
|
||||||
|
|
||||||
function createEmpty (byteLength: number, options: Options): Uint8Array {
|
|
||||||
return options.bitLength === -1
|
|
||||||
? new Uint8Array()
|
|
||||||
: new Uint8Array(byteLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
function createValue (valueBn: BN, byteLength: number, { isLe, isNegative }: Options): Uint8Array {
|
|
||||||
const output = new Uint8Array(byteLength);
|
|
||||||
const bn = isNegative
|
|
||||||
? valueBn.toTwos(byteLength * 8)
|
|
||||||
: valueBn;
|
|
||||||
|
|
||||||
output.set(bn.toArray(isLe ? 'le' : 'be', byteLength), 0);
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name bnToU8a
|
* @name bnToU8a
|
||||||
@@ -45,10 +24,12 @@ function createValue (valueBn: BN, byteLength: number, { isLe, isNegative }: Opt
|
|||||||
* bnToU8a(new BN(0x1234)); // => [0x12, 0x34]
|
* bnToU8a(new BN(0x1234)); // => [0x12, 0x34]
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, options?: Options): Uint8Array;
|
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;
|
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): Uint8Array;
|
||||||
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, arg1: number | Options = DEFAULT_OPTS, arg2?: boolean): Uint8Array {
|
/** @deprecated Use bnToU8a(value?: ExtToBn | BN | bigint | number | null, options?: NumberOptions) */
|
||||||
const options: Options = objectSpread(
|
function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number | null, arg1: number | NumberOptions = DEFAULT_OPTS, arg2?: boolean): Uint8Array {
|
||||||
|
const { bitLength, isLe, isNegative }: NumberOptions = objectSpread(
|
||||||
{ bitLength: -1, isLe: true, isNegative: false },
|
{ bitLength: -1, isLe: true, isNegative: false },
|
||||||
isNumber(arg1)
|
isNumber(arg1)
|
||||||
? { bitLength: arg1, isLe: arg2 }
|
? { bitLength: arg1, isLe: arg2 }
|
||||||
@@ -56,13 +37,24 @@ function bnToU8a <ExtToBn extends ToBn> (value?: ExtToBn | BN | bigint | number
|
|||||||
);
|
);
|
||||||
|
|
||||||
const valueBn = bnToBn(value);
|
const valueBn = bnToBn(value);
|
||||||
const byteLength = options.bitLength === -1
|
const byteLength = bitLength === -1
|
||||||
? Math.ceil(valueBn.bitLength() / 8)
|
? Math.ceil(valueBn.bitLength() / 8)
|
||||||
: Math.ceil((options.bitLength || 0) / 8);
|
: Math.ceil((bitLength || 0) / 8);
|
||||||
|
|
||||||
return value
|
if (!value) {
|
||||||
? createValue(valueBn, byteLength, options)
|
return bitLength === -1
|
||||||
: createEmpty(byteLength, options);
|
? new Uint8Array()
|
||||||
|
: new Uint8Array(byteLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
const output = new Uint8Array(byteLength);
|
||||||
|
const bn = isNegative
|
||||||
|
? valueBn.toTwos(byteLength * 8)
|
||||||
|
: valueBn;
|
||||||
|
|
||||||
|
output.set(bn.toArray(isLe ? 'le' : 'be', byteLength), 0);
|
||||||
|
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { bnToU8a };
|
export { bnToU8a };
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import { u8aConcat } from '../u8a';
|
import { u8aConcatStrict } from '../u8a';
|
||||||
import { compactToU8a } from './toU8a';
|
import { compactToU8a } from './toU8a';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,8 +17,8 @@ import { compactToU8a } from './toU8a';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function compactAddLength (input: Uint8Array): Uint8Array {
|
export function compactAddLength (input: Uint8Array): Uint8Array {
|
||||||
return u8aConcat(
|
return u8aConcatStrict([
|
||||||
compactToU8a(input.length),
|
compactToU8a(input.length),
|
||||||
input
|
input
|
||||||
);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
import { BN } from '../bn/bn';
|
import { BN } from '../bn/bn';
|
||||||
import { hexToU8a } from '../hex/toU8a';
|
import { hexToU8a } from '../hex/toU8a';
|
||||||
import { compactFromU8a } from '.';
|
import { performance } from '../test/performance';
|
||||||
|
import { compactFromU8a, compactFromU8aLim } from '.';
|
||||||
|
|
||||||
describe('compactFromU8a', (): void => {
|
describe('compactFromU8a', (): void => {
|
||||||
it('decoded u8 value', (): void => {
|
it('decoded u8 value', (): void => {
|
||||||
@@ -14,16 +15,25 @@ describe('compactFromU8a', (): void => {
|
|||||||
|
|
||||||
it('decodes from same u16 encoded value', (): void => {
|
it('decodes from same u16 encoded value', (): void => {
|
||||||
expect(
|
expect(
|
||||||
compactFromU8a(new Uint8Array([0b11111101, 0b00000111]))
|
compactFromU8a(new Uint8Array([0b11111101, 0b00000111])).toString()
|
||||||
).toEqual([2, new BN(511)]);
|
).toEqual(
|
||||||
|
[2, new BN(511)].toString()
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('decodes from same u32 encoded value (short)', (): void => {
|
it('decodes from same u32 encoded value (short)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
compactFromU8a(new Uint8Array([254, 255, 3, 0]))
|
compactFromU8a(new Uint8Array([254, 255, 3, 0])).toString()
|
||||||
).toEqual(
|
).toEqual(
|
||||||
// since we use in-place, the words are different... HACK it
|
[4, new BN(0xffff)].toString()
|
||||||
[4, new BN(0xffff).ishln(16).ishrn(16)]
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('decodes from same u32 encoded value (short)', (): void => {
|
||||||
|
expect(
|
||||||
|
compactFromU8a(new Uint8Array([254, 255, 255, 255])).toString()
|
||||||
|
).toEqual(
|
||||||
|
[4, new BN(1073741823)].toString()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -47,6 +57,14 @@ describe('compactFromU8a', (): void => {
|
|||||||
).toEqual([7, new BN('5af3107a4000', 16)]);
|
).toEqual([7, new BN('5af3107a4000', 16)]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('decodes an actual value (Buffer)', (): void => {
|
||||||
|
expect(
|
||||||
|
compactFromU8a(
|
||||||
|
Buffer.from('0b00407a10f35a', 'hex')
|
||||||
|
)
|
||||||
|
).toEqual([7, new BN('5af3107a4000', 16)]);
|
||||||
|
});
|
||||||
|
|
||||||
it('decodes an actual value', (): void => {
|
it('decodes an actual value', (): void => {
|
||||||
expect(
|
expect(
|
||||||
compactFromU8a(
|
compactFromU8a(
|
||||||
@@ -54,4 +72,11 @@ describe('compactFromU8a', (): void => {
|
|||||||
)[1].toString()
|
)[1].toString()
|
||||||
).toEqual('100000000');
|
).toEqual('100000000');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performance('compactFromU8a (u8)', 1_000_000, [[new Uint8Array([63 << 2])]], compactFromU8a);
|
||||||
|
performance('compactFromU8a (u16)', 1_000_000, [[new Uint8Array([0b11111101, 0b00000111])]], compactFromU8a);
|
||||||
|
performance('compactFromU8a (u32)', 1_000_000, [[new Uint8Array([254, 255, 3, 0])]], compactFromU8a);
|
||||||
|
performance('compactFromU8aLim (u32)', 1_000_000, [[new Uint8Array([254, 255, 3, 0])]], compactFromU8aLim);
|
||||||
|
performance('compactFromU8a (u48)', 1_000_000, [[hexToU8a('0x0b00407a10f35a')]], compactFromU8a);
|
||||||
|
performance('compactFromU8a (u96)', 250_000, [[new Uint8Array([23, 52, 0x40, 0x7a, 0x10, 0xf3, 0x5a, 0, 0, 18])]], compactFromU8a);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
import type { U8aLike } from '../types';
|
import type { U8aLike } from '../types';
|
||||||
|
|
||||||
import { BN, BN_FOUR } from '../bn';
|
import { BN } from '../bn';
|
||||||
import { u8aToBn, u8aToU8a } from '../u8a';
|
import { u8aToBn, u8aToU8a } from '../u8a';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name compactFromU8a
|
* @name compactFromU8a
|
||||||
* @description Retrievs the offset and encoded length from a compact-prefixed value
|
* @description Retrives the offset and encoded length from a compact-prefixed value
|
||||||
* @example
|
* @example
|
||||||
* <BR>
|
* <BR>
|
||||||
*
|
*
|
||||||
@@ -22,22 +22,86 @@ import { u8aToBn, u8aToU8a } from '../u8a';
|
|||||||
*/
|
*/
|
||||||
export function compactFromU8a (input: U8aLike): [number, BN] {
|
export function compactFromU8a (input: U8aLike): [number, BN] {
|
||||||
const u8a = u8aToU8a(input);
|
const u8a = u8aToU8a(input);
|
||||||
const flag = u8a[0] & 0b11;
|
|
||||||
|
|
||||||
if (flag === 0b00) {
|
// The u8a is manually converted here for 1, 2 & 4 lengths, it is 2x faster
|
||||||
return [1, new BN(u8a[0]).ishrn(2)];
|
// than doing an additional call to u8aToBn (as with variable length)
|
||||||
} else if (flag === 0b01) {
|
switch (u8a[0] & 0b11) {
|
||||||
return [2, u8aToBn(u8a.subarray(0, 2), true).ishrn(2)];
|
case 0b00:
|
||||||
} else if (flag === 0b10) {
|
return [1, new BN(u8a[0] >>> 2)];
|
||||||
return [4, u8aToBn(u8a.subarray(0, 4), true).ishrn(2)];
|
|
||||||
|
case 0b01:
|
||||||
|
return [2, new BN((u8a[0] + (u8a[1] * 0x1_00)) >>> 2)];
|
||||||
|
|
||||||
|
case 0b10:
|
||||||
|
return [4, new BN((u8a[0] + (u8a[1] * 0x1_00) + (u8a[2] * 0x1_00_00) + (u8a[3] * 0x1_00_00_00)) >>> 2)];
|
||||||
|
|
||||||
|
// 0b11
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const offset = 1 + (
|
// add 5 to shifted (4 for base length, 1 for this byte)
|
||||||
new BN(u8a[0])
|
const offset = (u8a[0] >>> 2) + 5;
|
||||||
.ishrn(2) // clear flag
|
|
||||||
.iadd(BN_FOUR) // add 4 for base length
|
|
||||||
.toNumber()
|
|
||||||
);
|
|
||||||
|
|
||||||
return [offset, u8aToBn(u8a.subarray(1, offset), true)];
|
// we unroll the loop
|
||||||
|
switch (offset) {
|
||||||
|
// there still could be 4 bytes data, similar to 0b10 above (with offsets)
|
||||||
|
case 5:
|
||||||
|
return [5, new BN(u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00))];
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
return [6, new BN(u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00) + (u8a[5] * 0x1_00_00_00_00))];
|
||||||
|
|
||||||
|
// 6 bytes data is the maximum, 48 bits (56 would overflow)
|
||||||
|
case 7:
|
||||||
|
return [7, new BN(u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00) + (u8a[5] * 0x1_00_00_00_00) + (u8a[6] * 0x1_00_00_00_00_00))];
|
||||||
|
|
||||||
|
// for anything else, use the non-unrolled version
|
||||||
|
default:
|
||||||
|
return [offset, u8aToBn(u8a.subarray(1, offset))];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name compactFromU8aLim
|
||||||
|
* @description A limited version of [[compactFromU8a]], accepting only Uint8Array inputs for values <= 48 bits
|
||||||
|
*/
|
||||||
|
export function compactFromU8aLim (u8a: Uint8Array): [number, number] {
|
||||||
|
// The u8a is manually converted here for 1, 2 & 4 lengths, it is 2x faster
|
||||||
|
// than doing an additional call to u8aToBn (as with variable length)
|
||||||
|
switch (u8a[0] & 0b11) {
|
||||||
|
case 0b00:
|
||||||
|
return [1, u8a[0] >>> 2];
|
||||||
|
|
||||||
|
case 0b01:
|
||||||
|
return [2, (u8a[0] + (u8a[1] * 0x1_00)) >>> 2];
|
||||||
|
|
||||||
|
case 0b10:
|
||||||
|
return [4, (u8a[0] + (u8a[1] * 0x1_00) + (u8a[2] * 0x1_00_00) + (u8a[3] * 0x1_00_00_00)) >>> 2];
|
||||||
|
|
||||||
|
// 0b11
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add 5 to shifted (4 for base length, 1 for this byte)
|
||||||
|
const offset = (u8a[0] >>> 2) + 5;
|
||||||
|
|
||||||
|
// we unroll the loop
|
||||||
|
switch (offset) {
|
||||||
|
// there still could be 4 bytes data, similar to 0b10 above (with offsets)
|
||||||
|
case 5:
|
||||||
|
return [5, u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00)];
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
return [6, u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00) + (u8a[5] * 0x1_00_00_00_00)];
|
||||||
|
|
||||||
|
// 6 bytes data is the maximum, 48 bits (56 would overflow)
|
||||||
|
case 7:
|
||||||
|
return [7, u8a[1] + (u8a[2] * 0x1_00) + (u8a[3] * 0x1_00_00) + (u8a[4] * 0x1_00_00_00) + (u8a[5] * 0x1_00_00_00_00) + (u8a[6] * 0x1_00_00_00_00_00)];
|
||||||
|
|
||||||
|
// for anything else, use the non-unrolled version
|
||||||
|
default:
|
||||||
|
throw new Error('Compact input is > Number.MAX_SAFE_INTEGER');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,5 +24,5 @@
|
|||||||
|
|
||||||
export { compactAddLength } from './addLength';
|
export { compactAddLength } from './addLength';
|
||||||
export { compactStripLength } from './stripLength';
|
export { compactStripLength } from './stripLength';
|
||||||
export { compactFromU8a } from './fromU8a';
|
export { compactFromU8a, compactFromU8aLim } from './fromU8a';
|
||||||
export { compactToU8a } from './toU8a';
|
export { compactToU8a } from './toU8a';
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ describe('encode', (): void => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('encodes a large value', (): void => {
|
it('encodes a large value (6 bytes)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
compactToU8a(
|
compactToU8a(
|
||||||
new BN('00005af3107a4000', 16)
|
new BN('00005af3107a4000', 16)
|
||||||
@@ -71,6 +71,16 @@ describe('encode', (): void => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('encodes a large value (9 bytes)', (): void => {
|
||||||
|
expect(
|
||||||
|
compactToU8a(
|
||||||
|
new BN('1200005af3107a4034', 16)
|
||||||
|
)
|
||||||
|
).toEqual(
|
||||||
|
new Uint8Array([23, 52, 0x40, 0x7a, 0x10, 0xf3, 0x5a, 0, 0, 18])
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('does not modify the original', (): void => {
|
it('does not modify the original', (): void => {
|
||||||
const original = new BN(123456);
|
const original = new BN(123456);
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
import { assert } from '../assert';
|
import { assert } from '../assert';
|
||||||
import { BN, BN_ONE, BN_TWO, bnToBn, bnToU8a } from '../bn';
|
import { BN, BN_ONE, BN_TWO, bnToBn, bnToU8a } from '../bn';
|
||||||
import { u8aConcat } from '../u8a';
|
import { u8aConcatStrict } from '../u8a';
|
||||||
|
|
||||||
const MAX_U8 = BN_TWO.pow(new BN(8 - 2)).isub(BN_ONE);
|
const MAX_U8 = BN_TWO.pow(new BN(8 - 2)).isub(BN_ONE);
|
||||||
const MAX_U16 = BN_TWO.pow(new BN(16 - 2)).isub(BN_ONE);
|
const MAX_U16 = BN_TWO.pow(new BN(16 - 2)).isub(BN_ONE);
|
||||||
const MAX_U32 = BN_TWO.pow(new BN(32 - 2)).isub(BN_ONE);
|
const MAX_U32 = BN_TWO.pow(new BN(32 - 2)).isub(BN_ONE);
|
||||||
|
const BL_16 = { bitLength: 16 };
|
||||||
|
const BL_32 = { bitLength: 32 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name compactToU8a
|
* @name compactToU8a
|
||||||
@@ -27,9 +29,9 @@ export function compactToU8a (value: BN | bigint | number): Uint8Array {
|
|||||||
if (bn.lte(MAX_U8)) {
|
if (bn.lte(MAX_U8)) {
|
||||||
return new Uint8Array([bn.toNumber() << 2]);
|
return new Uint8Array([bn.toNumber() << 2]);
|
||||||
} else if (bn.lte(MAX_U16)) {
|
} else if (bn.lte(MAX_U16)) {
|
||||||
return bnToU8a(bn.shln(2).iadd(BN_ONE), 16, true);
|
return bnToU8a(bn.shln(2).iadd(BN_ONE), BL_16);
|
||||||
} else if (bn.lte(MAX_U32)) {
|
} else if (bn.lte(MAX_U32)) {
|
||||||
return bnToU8a(bn.shln(2).iadd(BN_TWO), 32, true);
|
return bnToU8a(bn.shln(2).iadd(BN_TWO), BL_32);
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8a = bnToU8a(bn);
|
const u8a = bnToU8a(bn);
|
||||||
@@ -42,9 +44,9 @@ export function compactToU8a (value: BN | bigint | number): Uint8Array {
|
|||||||
|
|
||||||
assert(length >= 4, 'Invalid length, previous checks match anything less than 2^30');
|
assert(length >= 4, 'Invalid length, previous checks match anything less than 2^30');
|
||||||
|
|
||||||
return u8aConcat(
|
return u8aConcatStrict([
|
||||||
// subtract 4 as minimum (also catered for in decoding)
|
// subtract 4 as minimum (also catered for in decoding)
|
||||||
[((length - 4) << 2) + 0b11],
|
new Uint8Array([((length - 4) << 2) + 0b11]),
|
||||||
u8a.subarray(0, length)
|
u8a.subarray(0, length)
|
||||||
);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,14 +21,33 @@ interface SetDefaults {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
|
/**
|
||||||
|
* @description The number of decimals
|
||||||
|
*/
|
||||||
decimals?: number;
|
decimals?: number;
|
||||||
|
/**
|
||||||
|
* @description Format the number with this specific unit
|
||||||
|
*/
|
||||||
forceUnit?: string;
|
forceUnit?: string;
|
||||||
|
/**
|
||||||
|
* @description Format with SI, i.e. m/M/etc.
|
||||||
|
*/
|
||||||
withSi?: boolean;
|
withSi?: boolean;
|
||||||
|
/**
|
||||||
|
* @description Format with full SI, i.e. mili/Mega/etc.
|
||||||
|
*/
|
||||||
withSiFull?: boolean;
|
withSiFull?: boolean;
|
||||||
|
/**
|
||||||
|
* @description Add the unit (useful in Balance formats)
|
||||||
|
*/
|
||||||
withUnit?: boolean | string;
|
withUnit?: boolean | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface BalanceFormatter {
|
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;
|
<ExtToBn extends ToBn> (input?: number | string | BN | bigint | ExtToBn, options?: Options, decimals?: number): string;
|
||||||
calcSi (text: string, decimals?: number): SiDef;
|
calcSi (text: string, decimals?: number): SiDef;
|
||||||
findSi (type: string): SiDef;
|
findSi (type: string): SiDef;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export function formatDecimal (value: string): string {
|
|||||||
// we rather strip and re-add the negative sign in the output
|
// we rather strip and re-add the negative sign in the output
|
||||||
const isNegative = value[0].startsWith('-');
|
const isNegative = value[0].startsWith('-');
|
||||||
const matched = isNegative
|
const matched = isNegative
|
||||||
? value.substr(1).match(NUMBER_REGEX)
|
? value.substring(1).match(NUMBER_REGEX)
|
||||||
: value.match(NUMBER_REGEX);
|
: value.match(NUMBER_REGEX);
|
||||||
|
|
||||||
return matched
|
return matched
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export function hexStripPrefix (value?: string | null): string {
|
|||||||
if (!value || value === '0x') {
|
if (!value || value === '0x') {
|
||||||
return '';
|
return '';
|
||||||
} else if (REGEX_HEX_PREFIXED.test(value)) {
|
} else if (REGEX_HEX_PREFIXED.test(value)) {
|
||||||
return value.substr(2);
|
return value.substring(2);
|
||||||
} else if (REGEX_HEX_NOPREFIX.test(value)) {
|
} else if (REGEX_HEX_NOPREFIX.test(value)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ describe('hexToBn', (): void => {
|
|||||||
).toBe(256);
|
).toBe(256);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles backwards compatibility', (): void => {
|
it('handles legacy compatibility', (): void => {
|
||||||
expect(
|
expect(
|
||||||
hexToBn('0x0001000000000000', false).eq(
|
hexToBn('0x0001000000000000', false).eq(
|
||||||
hexToBn('0x0001000000000000', { isLe: false })
|
hexToBn('0x0001000000000000', { isLe: false })
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import { isBoolean } from '../is/boolean';
|
|||||||
import { objectSpread } from '../object/spread';
|
import { objectSpread } from '../object/spread';
|
||||||
import { hexStripPrefix } from './stripPrefix';
|
import { hexStripPrefix } from './stripPrefix';
|
||||||
|
|
||||||
const DEFAULT_OPTS: ToBnOptions = { isLe: false, isNegative: false };
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name hexToBn
|
* @name hexToBn
|
||||||
* @summary Creates a BN.js object from a hex string.
|
* @summary Creates a BN.js object from a hex string.
|
||||||
@@ -28,12 +26,17 @@ const DEFAULT_OPTS: ToBnOptions = { isLe: false, isNegative: false };
|
|||||||
* hexToBn('0x123480001f'); // => BN(0x123480001f)
|
* hexToBn('0x123480001f'); // => BN(0x123480001f)
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function hexToBn (value?: string | null, options: ToBnOptions | boolean = DEFAULT_OPTS): BN {
|
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 {
|
||||||
if (!value || value === '0x') {
|
if (!value || value === '0x') {
|
||||||
return new BN(0);
|
return new BN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { isLe, isNegative }: ToBnOptions = objectSpread(
|
// For hex, default to BE
|
||||||
|
const { isLe, isNegative } = objectSpread<ToBnOptions>(
|
||||||
{ isLe: false, isNegative: false },
|
{ isLe: false, isNegative: false },
|
||||||
isBoolean(options)
|
isBoolean(options)
|
||||||
? { isLe: options }
|
? { isLe: options }
|
||||||
@@ -43,8 +46,10 @@ export function hexToBn (value?: string | null, options: ToBnOptions | boolean =
|
|||||||
const bn = new BN(stripped, 16, isLe ? 'le' : 'be');
|
const bn = new BN(stripped, 16, isLe ? 'le' : 'be');
|
||||||
|
|
||||||
// fromTwos takes as parameter the number of bits, which is the hex length
|
// fromTwos takes as parameter the number of bits, which is the hex length
|
||||||
// multiplied by 4.
|
// multiplied by 4 (2 bytes being 8 bits)
|
||||||
return isNegative
|
return isNegative
|
||||||
? bn.fromTwos(stripped.length * 4)
|
? bn.fromTwos(stripped.length * 4)
|
||||||
: bn;
|
: bn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export { hexToBn };
|
||||||
|
|||||||
@@ -42,11 +42,13 @@ export function hexToU8a (_value?: HexString | string | null, bitLength = -1): U
|
|||||||
const length = endLength - offset - mod;
|
const length = endLength - offset - mod;
|
||||||
|
|
||||||
for (let i = 0; i < length; i += 2) {
|
for (let i = 0; i < length; i += 2) {
|
||||||
dv.setUint16(i, HEX_TO_U16[value.substr(i * 2, 4)]);
|
const idx = i * 2;
|
||||||
|
|
||||||
|
dv.setUint16(i, HEX_TO_U16[value.substring(idx, idx + 4)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mod) {
|
if (mod) {
|
||||||
dv.setUint8(length, HEX_TO_U8[value.substr(value.length - 2, 2)]);
|
dv.setUint8(length, HEX_TO_U8[value.substring(value.length - 2)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -10,9 +10,15 @@ describe('isBuffer', (): void => {
|
|||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns false on non-Buffer values', (): void => {
|
it('returns false on non-Buffer values (number)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
isBuffer(0)
|
isBuffer(123)
|
||||||
|
).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false on non-Buffer values (null)', (): void => {
|
||||||
|
expect(
|
||||||
|
isBuffer(null)
|
||||||
).toEqual(false);
|
).toEqual(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import { hasBuffer } from '../has';
|
import { hasBuffer } from '../has';
|
||||||
|
import { isFunction } from './function';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name isBuffer
|
* @name isBuffer
|
||||||
@@ -18,5 +19,6 @@ import { hasBuffer } from '../has';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function isBuffer (value: unknown): value is Buffer {
|
export function isBuffer (value: unknown): value is Buffer {
|
||||||
return hasBuffer && Buffer.isBuffer(value);
|
// we do check a function first, since it is slightly faster than isBuffer itself
|
||||||
|
return hasBuffer && isFunction(value && (value as Buffer).readDoubleLE) && Buffer.isBuffer(value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,8 @@ interface Compact<T> {
|
|||||||
unwrap (): T;
|
unwrap (): T;
|
||||||
}
|
}
|
||||||
|
|
||||||
const checker = isOnObject('toBigInt', 'toBn', 'toNumber', 'unwrap');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name isCompact
|
* @name isCompact
|
||||||
* @summary Tests for SCALE-Compact-like object instance.
|
* @summary Tests for SCALE-Compact-like object instance.
|
||||||
*/
|
*/
|
||||||
export function isCompact <T> (value?: unknown): value is Compact<T> {
|
export const isCompact: <T> (value?: unknown) => value is Compact<T> = isOnObject('toBigInt', 'toBn', 'toNumber', 'unwrap');
|
||||||
return checker(value);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,5 +16,8 @@
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function isError (value: unknown): value is Error {
|
export function isError (value: unknown): value is Error {
|
||||||
return value instanceof Error;
|
return (
|
||||||
|
((value && (value as Error).constructor) === Error) ||
|
||||||
|
value instanceof Error
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { isHex } from '.';
|
|||||||
|
|
||||||
describe('isHex', (): void => {
|
describe('isHex', (): void => {
|
||||||
const test = '1234abcd';
|
const test = '1234abcd';
|
||||||
const ptest = '0x1234adbcdef5798351773526352876adbcdef2358735adbcdef2623587adbcdef11234adbcdef5798351773526352876adbcdef2358735adbcdef2623587adbcdef11234adbcdef5798351773526352876adbcdef2358735adbcdef2623587adbcdef11234adbcdef5798351773526352876adbcdef2358735adbcdef2623587adbcdef1';
|
const ptest = `0x${'1234567890abcdef'.repeat(8192)}`;
|
||||||
|
|
||||||
it('returns true on 0x hex values', (): void => {
|
it('returns true on 0x hex values', (): void => {
|
||||||
expect(
|
expect(
|
||||||
@@ -71,5 +71,5 @@ describe('isHex', (): void => {
|
|||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
performance('isHex (1024-bit)', 1000000, [[ptest]], isHex);
|
performance(`isHex (${(ptest.length - 2) / 2} bytes)`, 5000, [[ptest]], isHex);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,6 +10,16 @@ describe('isInstanceOf', (): void => {
|
|||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns true on real instances (inherited)', (): void => {
|
||||||
|
class Test extends Array {
|
||||||
|
// default
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(
|
||||||
|
isInstanceOf(new Test(2), Array)
|
||||||
|
).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns false on non-allocated instances', (): void => {
|
it('returns false on non-allocated instances', (): void => {
|
||||||
expect(
|
expect(
|
||||||
isInstanceOf([], Array)
|
isInstanceOf([], Array)
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||||
export function isInstanceOf (value: unknown, clazz: Function): boolean {
|
export function isInstanceOf (value: unknown, Clazz: Function): boolean {
|
||||||
return value instanceof clazz;
|
return (
|
||||||
|
((value && (value as Record<string, unknown>).constructor) === Clazz) ||
|
||||||
|
value instanceof Clazz
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import { performance } from '../test/performance';
|
||||||
import { isU8a } from '.';
|
import { isU8a } from '.';
|
||||||
|
|
||||||
describe('isU8a', (): void => {
|
describe('isU8a', (): void => {
|
||||||
@@ -10,15 +11,30 @@ describe('isU8a', (): void => {
|
|||||||
).toEqual(false);
|
).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns false on null values', (): void => {
|
||||||
|
expect(
|
||||||
|
isU8a(null)
|
||||||
|
).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns false on Array values', (): void => {
|
it('returns false on Array values', (): void => {
|
||||||
expect(
|
expect(
|
||||||
isU8a([])
|
isU8a([1, 2, 3])
|
||||||
).toEqual(false);
|
).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns true on Buffer values', (): void => {
|
||||||
|
// under Node, Buffer implements Uint8Array
|
||||||
|
expect(
|
||||||
|
isU8a(Buffer.from([1, 2, 3]))
|
||||||
|
).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns true on Uint8Array values', (): void => {
|
it('returns true on Uint8Array values', (): void => {
|
||||||
expect(
|
expect(
|
||||||
isU8a(new Uint8Array())
|
isU8a(new Uint8Array())
|
||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performance('isU8a', 2_000_000, [[new Uint8Array()]], isU8a);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,5 +16,10 @@
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function isU8a (value?: unknown): value is Uint8Array {
|
export function isU8a (value?: unknown): value is Uint8Array {
|
||||||
return value instanceof Uint8Array;
|
// here we defer the instanceof check which is actually slightly
|
||||||
|
// slower than just checking the constrctor (direct instances)
|
||||||
|
return (
|
||||||
|
((value && (value as Uint8Array).constructor) === Uint8Array) ||
|
||||||
|
value instanceof Uint8Array
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ function formatWithLength (maxLength: number): (v: unknown) => unknown {
|
|||||||
|
|
||||||
return r.length < maxLength
|
return r.length < maxLength
|
||||||
? v
|
? v
|
||||||
: `${r.substr(0, maxLength)} ...`;
|
: `${r.substring(0, maxLength)} ...`;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -109,5 +109,5 @@ describe('stringCamelCase', (): void => {
|
|||||||
).toEqual('aBCDef');
|
).toEqual('aBCDef');
|
||||||
});
|
});
|
||||||
|
|
||||||
performance('stringCamelCase', 64000, randomWords, stringCamelCase);
|
performance('stringCamelCase', 100_000, randomWords, stringCamelCase);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,50 +7,59 @@ import type { AnyString } from '../types';
|
|||||||
//
|
//
|
||||||
// this is not as optimal as the original answer (we split into multiple),
|
// this is not as optimal as the original answer (we split into multiple),
|
||||||
// however it does pass the tests (which the original doesn't) and it is still
|
// however it does pass the tests (which the original doesn't) and it is still
|
||||||
// a 10+x improvement over the original camelcase npm package (at running)
|
// a major improvement over the original camelcase npm package (at running)
|
||||||
//
|
//
|
||||||
// original: 20.88 μs/op
|
// original: 20.88 μs/op
|
||||||
// this: 2.86 μs/op
|
// this: 1.20 μs/op
|
||||||
//
|
//
|
||||||
// Caveat of this: only Ascii, but acceptable for the intended usecase
|
// Caveat of this: only Ascii, but acceptable for the intended usecase
|
||||||
function converter (fn: (w: string, i: number) => string): (value: AnyString) => string {
|
function converter (format: (w: string, i: number) => string): (value: AnyString) => string {
|
||||||
const format = (w: string, i: number) => fn(w[0], i) + w.slice(1);
|
const formatRuns = (w: string) => w.slice(0, w.length - 1).toLowerCase() + w.slice(-1).toUpperCase();
|
||||||
|
|
||||||
return (value: AnyString): string =>
|
return (value: AnyString): string => {
|
||||||
value
|
const parts = value
|
||||||
.toString()
|
.toString()
|
||||||
// replace all seperators (including consequtive) with spaces
|
// replace all seperators (including consequtive) with spaces
|
||||||
.replace(/[-_., ]+/g, ' ')
|
.replace(/[-_., ]+/g, ' ')
|
||||||
// we don't want leading or trailing spaces
|
// we don't want leading or trailing spaces
|
||||||
.trim()
|
.trim()
|
||||||
// split into words
|
// split into words
|
||||||
.split(' ')
|
.split(' ');
|
||||||
|
let result = '';
|
||||||
|
|
||||||
|
for (let i = 0; i < parts.length; i++) {
|
||||||
|
const w = parts[i];
|
||||||
|
|
||||||
// apply the formatting
|
// apply the formatting
|
||||||
.map((w, i) =>
|
result += format(
|
||||||
format(
|
w.toUpperCase() === w
|
||||||
w.toUpperCase() === w
|
// all full uppercase + letters are changed to lowercase
|
||||||
// all full uppercase + letters are changed to lowercase
|
? w.toLowerCase()
|
||||||
? w.toLowerCase()
|
// all consecutive capitals + letters are changed to lowercase
|
||||||
// all consecutive capitals + letters are changed to lowercase
|
// e.g. UUID64 -> uuid64, while preserving splits, eg. NFTOrder -> nftOrder
|
||||||
// e.g. UUID64 -> uuid64, while preserving splits, eg. NFTOrder -> nftOrder
|
: w.replace(/^[A-Z0-9]{2,}[^a-z]/, formatRuns),
|
||||||
: w.replace(/^[A-Z0-9]{2,}[^a-z]/, (w) =>
|
i
|
||||||
w.slice(0, w.length - 1).toLowerCase() + w.slice(-1).toUpperCase()
|
);
|
||||||
),
|
}
|
||||||
i
|
|
||||||
)
|
return result;
|
||||||
)
|
};
|
||||||
// combine into a single word
|
|
||||||
.join('');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name stringCamelCase
|
* @name stringCamelCase
|
||||||
* @summary Convert a dash/dot/underscore/space separated Ascii string/String to camelCase
|
* @summary Convert a dash/dot/underscore/space separated Ascii string/String to camelCase
|
||||||
*/
|
*/
|
||||||
export const stringCamelCase = converter((w, i) => i ? w.toUpperCase() : w.toLowerCase());
|
export const stringCamelCase = converter((w, i) =>
|
||||||
|
// lowercase for first letter/first word, else uppercase first, rest unchanged
|
||||||
|
(i ? w[0].toUpperCase() : w[0].toLowerCase()) + w.slice(1)
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name stringPascalCase
|
* @name stringPascalCase
|
||||||
* @summary Convert a dash/dot/underscore/space separated Ascii string/String to PascalCase
|
* @summary Convert a dash/dot/underscore/space separated Ascii string/String to PascalCase
|
||||||
*/
|
*/
|
||||||
export const stringPascalCase = converter((w) => w.toUpperCase());
|
export const stringPascalCase = converter((w) =>
|
||||||
|
// uppercase the first character, leave the rest unchanged
|
||||||
|
w[0].toUpperCase() + w.slice(1)
|
||||||
|
);
|
||||||
|
|||||||
@@ -15,4 +15,10 @@ describe('stringPascalCase', (): void => {
|
|||||||
stringPascalCase(String('foo_bar-- __baz Bob'))
|
stringPascalCase(String('foo_bar-- __baz Bob'))
|
||||||
).toBe('FooBarBazBob');
|
).toBe('FooBarBazBob');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('adjusts all-uppercase + digits', (): void => {
|
||||||
|
expect(
|
||||||
|
stringPascalCase('UUID64')
|
||||||
|
).toEqual('Uuid64');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -20,5 +20,5 @@ import type { AnyString } from '../types';
|
|||||||
export function stringShorten (value: AnyString, prefixLength = 6): string {
|
export function stringShorten (value: AnyString, prefixLength = 6): string {
|
||||||
return value.length <= 2 + 2 * prefixLength
|
return value.length <= 2 + 2 * prefixLength
|
||||||
? value.toString()
|
? value.toString()
|
||||||
: `${value.substr(0, prefixLength)}…${value.slice(-prefixLength)}`;
|
: `${value.substring(0, prefixLength)}…${value.slice(-prefixLength)}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,13 @@ import { stringToU8a } from '..';
|
|||||||
const RUSS_HELLO = new Uint8Array([208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 44, 32, 208, 188, 208, 184, 209, 128, 33]);
|
const RUSS_HELLO = new Uint8Array([208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 44, 32, 208, 188, 208, 184, 209, 128, 33]);
|
||||||
|
|
||||||
describe('stringToU8a', (): void => {
|
describe('stringToU8a', (): void => {
|
||||||
it('decodes to an empty string for undefined', (): void => {
|
it('decodes to an empty string for undefined/null', (): void => {
|
||||||
expect(
|
expect(
|
||||||
stringToU8a()
|
stringToU8a()
|
||||||
).toEqual(new Uint8Array());
|
).toEqual(new Uint8Array());
|
||||||
|
expect(
|
||||||
|
stringToU8a(null)
|
||||||
|
).toEqual(new Uint8Array());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('encodes the string correctly', (): void => {
|
it('encodes the string correctly', (): void => {
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ const encoder = new TextEncoder();
|
|||||||
* stringToU8a('hello'); // [0x68, 0x65, 0x6c, 0x6c, 0x6f]
|
* stringToU8a('hello'); // [0x68, 0x65, 0x6c, 0x6c, 0x6f]
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
export function stringToU8a (value?: AnyString | null): Uint8Array {
|
||||||
export function stringToU8a (value?: AnyString): Uint8Array {
|
|
||||||
return value
|
return value
|
||||||
? encoder.encode(value.toString())
|
? encoder.encode(value.toString())
|
||||||
: new Uint8Array();
|
: new Uint8Array();
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ import { formatDecimal, formatNumber } from '..';
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
type ExecFn = (...params: any[]) => unknown;
|
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: unknown[][], exec: ExecFn): [number, unknown[]] {
|
||||||
const start = Date.now();
|
const start = Date.now();
|
||||||
const results = new Array<unknown>(inputs.length);
|
const results = new Array<unknown>(inputs.length);
|
||||||
@@ -32,8 +35,8 @@ export function formatOps (count: number, time: number): string {
|
|||||||
const ops = 1_000_000 / micro;
|
const ops = 1_000_000 / micro;
|
||||||
|
|
||||||
return `
|
return `
|
||||||
${formatFixed(ops).padStart(15 + 20)} ops/s
|
${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s
|
||||||
${formatFixed(micro).padStart(15 + 20)} μs/op`;
|
${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function performance (name: string, count: number, inputs: unknown[][], exec: ExecFn): void {
|
export function performance (name: string, count: number, inputs: unknown[][], exec: ExecFn): void {
|
||||||
@@ -43,7 +46,7 @@ export function performance (name: string, count: number, inputs: unknown[][], e
|
|||||||
console.log(`
|
console.log(`
|
||||||
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
||||||
|
|
||||||
${`${name}:`.padStart(19)} ${time.toString().padStart(15)} ms${formatOps(count, time)}
|
${`${name}:`.padStart(PRE_PAD)} ${time.toString().padStart(NUM_PAD)} ms${formatOps(count, time)}
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -58,9 +61,9 @@ export function performanceCmp (name: string, [first, second]: [string, string],
|
|||||||
console.log(`
|
console.log(`
|
||||||
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
||||||
|
|
||||||
${`${first}:`.padStart(19)} ${ta.toString().padStart(15)} ms ${ta < tb ? '(fastest)' : `(slowest, ${(ta / tb).toFixed(2)}x)`}${formatOps(count, ta)}
|
${`${first}:`.padStart(PRE_PAD)} ${ta.toString().padStart(NUM_PAD)} ms ${ta < tb ? '(fastest)' : `(slowest, ${(ta / tb).toFixed(2)}x)`}${formatOps(count, ta)}
|
||||||
|
|
||||||
${`${second}:`.padStart(19)} ${tb.toString().padStart(15)} ms ${ta > tb ? '(fastest)' : `(slowest, ${(tb / ta).toFixed(2)}x)`}${formatOps(count, tb)}
|
${`${second}:`.padStart(PRE_PAD)} ${tb.toString().padStart(NUM_PAD)} ms ${ta > tb ? '(fastest)' : `(slowest, ${(tb / ta).toFixed(2)}x)`}${formatOps(count, tb)}
|
||||||
`);
|
`);
|
||||||
|
|
||||||
const unmatched = ra.filter((r, i) =>
|
const unmatched = ra.filter((r, i) =>
|
||||||
|
|||||||
@@ -35,10 +35,23 @@ export interface Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface ToBnOptions {
|
export interface ToBnOptions {
|
||||||
|
/**
|
||||||
|
* @description Convert in LE format
|
||||||
|
*/
|
||||||
isLe?: boolean;
|
isLe?: boolean;
|
||||||
|
/**
|
||||||
|
* @description Number is negative, apply two's complement
|
||||||
|
*/
|
||||||
isNegative?: boolean;
|
isNegative?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NumberOptions extends ToBnOptions {
|
||||||
|
/**
|
||||||
|
* @description Limit to the specified bitLength, despite input length
|
||||||
|
*/
|
||||||
|
bitLength?: number;
|
||||||
|
}
|
||||||
|
|
||||||
export type BnList = {
|
export type BnList = {
|
||||||
0: BN;
|
0: BN;
|
||||||
1: BN;
|
1: BN;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { getRandomValues } from '@polkadot/x-randomvalues';
|
|||||||
|
|
||||||
import { arrayRange } from '../array';
|
import { arrayRange } from '../array';
|
||||||
import { performance } from '../test/performance';
|
import { performance } from '../test/performance';
|
||||||
import { u8aConcat } from '.';
|
import { u8aConcat, u8aConcatStrict } from '.';
|
||||||
|
|
||||||
const ptest = arrayRange(10).map(() => getRandomValues(new Uint8Array(32)));
|
const ptest = arrayRange(10).map(() => getRandomValues(new Uint8Array(32)));
|
||||||
|
|
||||||
@@ -34,5 +34,7 @@ describe('u8aConcat', (): void => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
performance('u8aConcat', 50000, [[ptest]], u8aConcat);
|
performance('u8aConcat', 10000, [[ptest]], u8aConcat);
|
||||||
|
performance('u8aConcatStrict', 10000, [[[ptest]]], u8aConcatStrict);
|
||||||
|
performance('u8aConcatStrict (len)', 10000, [[[ptest], 320]], u8aConcatStrict);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,15 +23,30 @@ import { u8aToU8a } from './toU8a';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function u8aConcat (...list: U8aLike[]): Uint8Array {
|
export function u8aConcat (...list: U8aLike[]): Uint8Array {
|
||||||
let length = 0;
|
|
||||||
let offset = 0;
|
|
||||||
const u8as = new Array<Uint8Array>(list.length);
|
const u8as = new Array<Uint8Array>(list.length);
|
||||||
|
let length = 0;
|
||||||
|
|
||||||
for (let i = 0; i < list.length; i++) {
|
for (let i = 0; i < list.length; i++) {
|
||||||
u8as[i] = u8aToU8a(list[i]);
|
u8as[i] = u8aToU8a(list[i]);
|
||||||
length += u8as[i].length;
|
length += u8as[i].length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return u8aConcatStrict(u8as, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name u8aConcatStrict
|
||||||
|
* @description A strict version of [[u8aConcat]], accepting only Uint8Array inputs
|
||||||
|
*/
|
||||||
|
export function u8aConcatStrict (u8as: Uint8Array[], length = 0): Uint8Array {
|
||||||
|
let offset = 0;
|
||||||
|
|
||||||
|
if (!length) {
|
||||||
|
for (let i = 0; i < u8as.length; i++) {
|
||||||
|
length += u8as[i].length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const result = new Uint8Array(length);
|
const result = new Uint8Array(length);
|
||||||
|
|
||||||
for (let i = 0; i < u8as.length; i++) {
|
for (let i = 0; i < u8as.length; i++) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export { u8aCmp } from './cmp';
|
export { u8aCmp } from './cmp';
|
||||||
export { u8aConcat } from './concat';
|
export { u8aConcat, u8aConcatStrict } from './concat';
|
||||||
export { u8aEmpty } from './empty';
|
export { u8aEmpty } from './empty';
|
||||||
export { u8aEq } from './eq';
|
export { u8aEq } from './eq';
|
||||||
export { u8aFixLength } from './fixLength';
|
export { u8aFixLength } from './fixLength';
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import { performance } from '../test/performance';
|
||||||
import { u8aToBigInt } from '.';
|
import { u8aToBigInt } from '.';
|
||||||
|
|
||||||
describe('u8aToBigInt', (): void => {
|
describe('u8aToBigInt', (): void => {
|
||||||
@@ -56,4 +57,6 @@ describe('u8aToBigInt', (): void => {
|
|||||||
)
|
)
|
||||||
).toEqual(-1234n);
|
).toEqual(-1234n);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performance('u8aToBigInt', 500000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c])]], u8aToBigInt);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export function u8aToBigInt (value: Uint8Array, options: ToBnOptions = {}): bigi
|
|||||||
return BigInt(0);
|
return BigInt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { isLe, isNegative }: ToBnOptions = objectSpread({ isLe: true, isNegative: false }, options);
|
const { isLe, isNegative } = objectSpread<ToBnOptions>({ isLe: true, isNegative: false }, options);
|
||||||
const u8a = isLe
|
const u8a = isLe
|
||||||
? value.reverse()
|
? value.reverse()
|
||||||
: value;
|
: value;
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import { performance } from '../test/performance';
|
||||||
import { u8aToBn } from '.';
|
import { u8aToBn } from '.';
|
||||||
|
|
||||||
describe('u8aToBn', (): void => {
|
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 => {
|
it('converts little-endian by default', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToBn(
|
u8aToBn(
|
||||||
@@ -11,6 +27,7 @@ describe('u8aToBn', (): void => {
|
|||||||
).toString(16)
|
).toString(16)
|
||||||
).toBe('3412');
|
).toBe('3412');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('converts values (big-endian)', (): void => {
|
it('converts values (big-endian)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToBn(
|
u8aToBn(
|
||||||
@@ -20,7 +37,7 @@ describe('u8aToBn', (): void => {
|
|||||||
).toBe('1234');
|
).toBe('1234');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('converts values (little-endian)', (): void => {
|
it('converts values (little-endian, u16)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToBn(
|
u8aToBn(
|
||||||
new Uint8Array([0x12, 0x34]),
|
new Uint8Array([0x12, 0x34]),
|
||||||
@@ -29,13 +46,69 @@ describe('u8aToBn', (): void => {
|
|||||||
).toBe('3412');
|
).toBe('3412');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('converts empty', (): void => {
|
it('converts values (little-endian, u32)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToBn(
|
u8aToBn(
|
||||||
new Uint8Array(),
|
new Uint8Array([0x12, 0x34, 0x56, 0x78]),
|
||||||
{ isLe: true }
|
{ isLe: true }
|
||||||
).toString(16)
|
).toString(16)
|
||||||
).toBe('0');
|
).toBe('78563412');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts values (big-endian, u16)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array([0x12, 0x34]),
|
||||||
|
{ isLe: false }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts values (big-endian, u32)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array([0x12, 0x34, 0x56, 0x78]),
|
||||||
|
{ isLe: false }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('12345678');
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('empty creation', (): void => {
|
||||||
|
it('handles unsigned (le)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array(),
|
||||||
|
{ isLe: true }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('0');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles signed (le)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array(),
|
||||||
|
{ isLe: true, isNegative: true }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('0');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles unsigned (be)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array(),
|
||||||
|
{ isLe: false }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('0');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles signed (be)', (): void => {
|
||||||
|
expect(
|
||||||
|
u8aToBn(
|
||||||
|
new Uint8Array(),
|
||||||
|
{ isLe: false, isNegative: true }
|
||||||
|
).toString(16)
|
||||||
|
).toBe('0');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles negative numbers (little-endian)', (): void => {
|
it('handles negative numbers (little-endian)', (): void => {
|
||||||
@@ -89,4 +162,7 @@ describe('u8aToBn', (): void => {
|
|||||||
)
|
)
|
||||||
).toBe(true);
|
).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performance('u8aToBn (u32)', 500000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c])]], u8aToBn);
|
||||||
|
performance('u8aToBn (u64)', 500000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c])]], u8aToBn);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import type { BN } from '../bn/bn';
|
|
||||||
import type { ToBnOptions } from '../types';
|
import type { ToBnOptions } from '../types';
|
||||||
|
|
||||||
import { hexToBn } from '../hex/toBn';
|
import { BN } from '../bn/bn';
|
||||||
import { u8aToHex } from './toHex';
|
import { isBoolean } from '../is/boolean';
|
||||||
|
import { objectSpread } from '../object/spread';
|
||||||
const DEFAULT_OPTS: ToBnOptions = { isLe: true, isNegative: false };
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name u8aToBn
|
* @name u8aToBn
|
||||||
@@ -16,7 +14,7 @@ const DEFAULT_OPTS: ToBnOptions = { isLe: true, isNegative: false };
|
|||||||
* `UInt8Array` input values return the actual BN. `null` or `undefined` values returns an `0x0` value.
|
* `UInt8Array` input values return the actual BN. `null` or `undefined` values returns an `0x0` value.
|
||||||
* @param value The value to convert
|
* @param value The value to convert
|
||||||
* @param options Options to pass while converting
|
* @param options Options to pass while converting
|
||||||
* @param options.isLe Convert using Little Endian
|
* @param options.isLe Convert using Little Endian (default)
|
||||||
* @param options.isNegative Convert using two's complement
|
* @param options.isNegative Convert using two's complement
|
||||||
* @example
|
* @example
|
||||||
* <BR>
|
* <BR>
|
||||||
@@ -27,9 +25,44 @@ const DEFAULT_OPTS: ToBnOptions = { isLe: true, isNegative: false };
|
|||||||
* u8aToHex(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0xf])); // 0x68656c0f
|
* u8aToHex(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0xf])); // 0x68656c0f
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function u8aToBn (value: Uint8Array, options: ToBnOptions | boolean = DEFAULT_OPTS): BN {
|
function u8aToBn (value: Uint8Array, options?: ToBnOptions): BN;
|
||||||
return hexToBn(
|
/** @deprecated Use u8aToBn(value: Uint8Array, options?: ToBnOptions) */
|
||||||
u8aToHex(value),
|
function u8aToBn (value: Uint8Array, options?: boolean): BN;
|
||||||
options
|
/** @deprecated Use hexToBn (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, isNegative } = objectSpread<ToBnOptions>(
|
||||||
|
{ isLe: true, isNegative: false },
|
||||||
|
isBoolean(options)
|
||||||
|
? { isLe: options }
|
||||||
|
: options
|
||||||
);
|
);
|
||||||
|
const count = value.length;
|
||||||
|
let bn: BN;
|
||||||
|
|
||||||
|
// shortcut for <= u48 values - in this case the manual conversion
|
||||||
|
// here seems to be more efficient than passing the full array
|
||||||
|
// (and yes, it can be u48, e.g. in compacts with variable lengths)
|
||||||
|
if (count <= 6) {
|
||||||
|
let result = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
result = (result * 0x1_00) + (
|
||||||
|
isLe
|
||||||
|
? value[count - 1 - i]
|
||||||
|
: value[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bn = new BN(result);
|
||||||
|
} else {
|
||||||
|
bn = new BN(value, isLe ? 'le' : 'be');
|
||||||
|
}
|
||||||
|
|
||||||
|
return isNegative && value.length
|
||||||
|
? bn.fromTwos(value.length * 8)
|
||||||
|
: bn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export { u8aToBn };
|
||||||
|
|||||||
@@ -5,10 +5,15 @@ import { performanceCmp } from '../test/performance';
|
|||||||
import { u8aToHex as u8aToHexBuffer } from './toHexBuffer';
|
import { u8aToHex as u8aToHexBuffer } from './toHexBuffer';
|
||||||
import { u8aToHex } from '.';
|
import { u8aToHex } from '.';
|
||||||
|
|
||||||
const ptest = new Uint8Array(32768);
|
const ptest32k = new Uint8Array(32768);
|
||||||
|
const ptest256 = new Uint8Array(256);
|
||||||
|
|
||||||
for (let i = 0; i < ptest.length; i++) {
|
for (let i = 0; i < ptest32k.length; i++) {
|
||||||
ptest[i] = i % 256;
|
if (i < ptest256.length) {
|
||||||
|
ptest256[1] = i % 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptest32k[i] = i % 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('u8aToHex', (): void => {
|
describe('u8aToHex', (): void => {
|
||||||
@@ -66,7 +71,19 @@ describe('u8aToHex', (): void => {
|
|||||||
).toEqual('0x8000…0c0d');
|
).toEqual('0x8000…0c0d');
|
||||||
});
|
});
|
||||||
|
|
||||||
performanceCmp('u8aToHex', ['u8aToHexBuffer', 'u8aToHex'], 2000, [[ptest]], (s: Uint8Array, isSecond) =>
|
it('converts known bytes to their correct values', (): void => {
|
||||||
|
expect(
|
||||||
|
// hello world
|
||||||
|
u8aToHex(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]))
|
||||||
|
).toEqual('0x68656c6c6f20776f726c64');
|
||||||
|
});
|
||||||
|
|
||||||
|
performanceCmp('u8aToHex (32k)', ['u8aToHexBuffer', 'u8aToHex'], 2000, [[ptest32k]], (s: Uint8Array, isSecond) =>
|
||||||
|
isSecond
|
||||||
|
? u8aToHex(s)
|
||||||
|
: u8aToHexBuffer(s)
|
||||||
|
);
|
||||||
|
performanceCmp('u8aToHex (128)', ['u8aToHexBuffer', 'u8aToHex'], 100000, [[ptest256]], (s: Uint8Array, isSecond) =>
|
||||||
isSecond
|
isSecond
|
||||||
? u8aToHex(s)
|
? u8aToHex(s)
|
||||||
: u8aToHexBuffer(s)
|
: u8aToHexBuffer(s)
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ function hex (value: Uint8Array): string {
|
|||||||
let result = '';
|
let result = '';
|
||||||
|
|
||||||
for (let i = 0; i < length; i += 2) {
|
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_TO_HEX[dv.getUint16(i)];
|
result += U16_TO_HEX[dv.getUint16(i)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +45,7 @@ export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed
|
|||||||
return `${isPrefixed ? '0x' : ''}${
|
return `${isPrefixed ? '0x' : ''}${
|
||||||
!value || !value.length
|
!value || !value.length
|
||||||
? ''
|
? ''
|
||||||
: (length > 0 && value.length > length)
|
: (bitLength > 0 && value.length > length)
|
||||||
? `${hex(value.subarray(0, length / 2))}…${hex(value.subarray(value.length - length / 2))}`
|
? `${hex(value.subarray(0, length / 2))}…${hex(value.subarray(value.length - length / 2))}`
|
||||||
: hex(value)
|
: hex(value)
|
||||||
}` as HexString;
|
}` as HexString;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed
|
|||||||
return `${isPrefixed ? '0x' : ''}${
|
return `${isPrefixed ? '0x' : ''}${
|
||||||
!value || !value.length
|
!value || !value.length
|
||||||
? ''
|
? ''
|
||||||
: (length > 0 && value.length > length)
|
: (bitLength > 0 && value.length > length)
|
||||||
? `${Buffer.from(value.subarray(0, length / 2)).toString('hex')}…${Buffer.from(value.subarray(value.length - length / 2)).toString('hex')}`
|
? `${Buffer.from(value.subarray(0, length / 2)).toString('hex')}…${Buffer.from(value.subarray(value.length - length / 2)).toString('hex')}`
|
||||||
: Buffer.from(value).toString('hex')
|
: Buffer.from(value).toString('hex')
|
||||||
}` as HexString;
|
}` as HexString;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const decoder = new TextDecoder('utf-8');
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function u8aToString (value?: Uint8Array | null): string {
|
export function u8aToString (value?: Uint8Array | null): string {
|
||||||
return !value?.length
|
return value
|
||||||
? ''
|
? decoder.decode(value)
|
||||||
: decoder.decode(value);
|
: '';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import { performance } from '../test/performance';
|
||||||
import { u8aToU8a } from '.';
|
import { u8aToU8a } from '.';
|
||||||
|
|
||||||
describe('u8aToU8a', (): void => {
|
describe('u8aToU8a', (): void => {
|
||||||
@@ -40,14 +41,17 @@ describe('u8aToU8a', (): void => {
|
|||||||
|
|
||||||
it('creates from a Buffer', (): void => {
|
it('creates from a Buffer', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToU8a(Buffer.from([1, 2, 3, 128, 0, 10, 11, 12]))
|
u8aToU8a(Buffer.from([1, 2, 3, 128, 0, 10, 11, 12])).buffer
|
||||||
).toEqual(
|
).toEqual(
|
||||||
new Uint8Array([1, 2, 3, 128, 0, 10, 11, 12])
|
new Uint8Array([1, 2, 3, 128, 0, 10, 11, 12]).buffer
|
||||||
);
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('creates from a Buffer (hex)', (): void => {
|
||||||
expect(
|
expect(
|
||||||
u8aToU8a(Buffer.from('80000a', 'hex'))
|
u8aToU8a(Buffer.from('80000a', 'hex')).buffer
|
||||||
).toEqual(
|
).toEqual(
|
||||||
new Uint8Array([128, 0, 10])
|
new Uint8Array([128, 0, 10]).buffer
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -65,4 +69,8 @@ describe('u8aToU8a', (): void => {
|
|||||||
u8aToU8a(123 as unknown as Uint8Array)
|
u8aToU8a(123 as unknown as Uint8Array)
|
||||||
).toEqual(new Uint8Array([49, 50, 51]));
|
).toEqual(new Uint8Array([49, 50, 51]));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performance('u8aToU8a (hex)', 250_000, [['0x1234']], u8aToU8a);
|
||||||
|
performance('u8aToU8a (str)', 250_000, [['test']], u8aToU8a);
|
||||||
|
performance('u8aToU8a (u8a)', 1_000_000, [[new Uint8Array()]], u8aToU8a);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,13 +25,11 @@ import { stringToU8a } from '../string/toU8a';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export function u8aToU8a (value?: U8aLike | null): Uint8Array {
|
export function u8aToU8a (value?: U8aLike | null): Uint8Array {
|
||||||
return !value
|
return isU8a(value)
|
||||||
? new Uint8Array()
|
? value
|
||||||
: Array.isArray(value) || isBuffer(value)
|
: isHex(value)
|
||||||
? new Uint8Array(value)
|
? hexToU8a(value)
|
||||||
: isU8a(value)
|
: isBuffer(value) || Array.isArray(value)
|
||||||
? value
|
? new Uint8Array(value)
|
||||||
: isHex(value)
|
: stringToU8a(value);
|
||||||
? hexToU8a(value)
|
|
||||||
: stringToU8a(value);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
import type { U8aLike } from '../types';
|
import type { U8aLike } from '../types';
|
||||||
|
|
||||||
import { u8aConcat } from './concat';
|
import { u8aConcatStrict } from './concat';
|
||||||
import { u8aEq } from './eq';
|
import { u8aEq } from './eq';
|
||||||
import { u8aToU8a } from './toU8a';
|
import { u8aToU8a } from './toU8a';
|
||||||
|
|
||||||
@@ -45,5 +45,5 @@ export function u8aWrapBytes (bytes: U8aLike): Uint8Array {
|
|||||||
// if Ethereum-wrapping, we don't add our wrapping bytes
|
// if Ethereum-wrapping, we don't add our wrapping bytes
|
||||||
return u8aIsWrapped(u8a, true)
|
return u8aIsWrapped(u8a, true)
|
||||||
? u8a
|
? u8a
|
||||||
: u8aConcat(U8A_WRAP_PREFIX, u8a, U8A_WRAP_POSTFIX);
|
: u8aConcatStrict([U8A_WRAP_PREFIX, u8a, U8A_WRAP_POSTFIX]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ describe('detectPackage', (): void => {
|
|||||||
const MISMATCH = `@polkadot/util has multiple versions, ensure that there is only one installed.
|
const MISMATCH = `@polkadot/util has multiple versions, ensure that there is only one installed.
|
||||||
Either remove and explicitly install matching versions or dedupe using your package manager.
|
Either remove and explicitly install matching versions or dedupe using your package manager.
|
||||||
The following conflicting packages were found:
|
The following conflicting packages were found:
|
||||||
\t ${VER1}\t${PATH}/01
|
\t ${VER1}\tnode_modules/@polkadot/util
|
||||||
\tesm ${VER2} \tpath/02`;
|
\tesm ${VER2} \tnode_modules/@polkadot/api/node_modules/@polkadot/util`;
|
||||||
|
|
||||||
it('should not log the first time', (): void => {
|
it('should not log the first time', (): void => {
|
||||||
const spy = jest.spyOn(console, 'warn');
|
const spy = jest.spyOn(console, 'warn');
|
||||||
|
|
||||||
detectPackage({ name: PKG, version: VER1 }, `${PATH}/01`);
|
detectPackage({ name: PKG, version: VER1 }, PATH);
|
||||||
expect(spy).not.toHaveBeenCalled();
|
expect(spy).not.toHaveBeenCalled();
|
||||||
spy.mockRestore();
|
spy.mockRestore();
|
||||||
});
|
});
|
||||||
@@ -27,7 +27,7 @@ The following conflicting packages were found:
|
|||||||
it('should log the second time', (): void => {
|
it('should log the second time', (): void => {
|
||||||
const spy = jest.spyOn(console, 'warn');
|
const spy = jest.spyOn(console, 'warn');
|
||||||
|
|
||||||
detectPackage({ name: PKG, path: 'path/02', type: 'esm', version: VER2 });
|
detectPackage({ name: PKG, path: '/Users/jaco/Projects/polkadot-js/api/node_modules/@polkadot/api/node_modules/@polkadot/util', type: 'esm', version: VER2 });
|
||||||
expect(spy).toHaveBeenCalledWith(MISMATCH);
|
expect(spy).toHaveBeenCalledWith(MISMATCH);
|
||||||
spy.mockRestore();
|
spy.mockRestore();
|
||||||
});
|
});
|
||||||
@@ -35,9 +35,9 @@ The following conflicting packages were found:
|
|||||||
it('should allow for function use', (): void => {
|
it('should allow for function use', (): void => {
|
||||||
const spy = jest.spyOn(console, 'warn');
|
const spy = jest.spyOn(console, 'warn');
|
||||||
|
|
||||||
detectPackage({ name: PKG, type: 'cjs', version: VER3 }, () => `${PATH}/03`);
|
detectPackage({ name: PKG, type: 'cjs', version: VER3 }, () => PATH);
|
||||||
expect(spy).toHaveBeenCalledWith(`${MISMATCH}
|
expect(spy).toHaveBeenCalledWith(`${MISMATCH}
|
||||||
\tcjs ${VER3} \t${PATH}/03`);
|
\tcjs ${VER3} \tnode_modules/@polkadot/util`);
|
||||||
spy.mockRestore();
|
spy.mockRestore();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
import { xglobal } from '@polkadot/x-global';
|
import { xglobal } from '@polkadot/x-global';
|
||||||
|
|
||||||
import { isFunction } from './is/function';
|
import { isFunction } from './is/function';
|
||||||
import { isString } from './is/string';
|
|
||||||
import { assert } from './assert';
|
import { assert } from './assert';
|
||||||
|
|
||||||
type This = typeof globalThis;
|
type This = typeof globalThis;
|
||||||
@@ -26,14 +25,14 @@ interface PjsChecks extends This {
|
|||||||
__polkadotjs: Record<string, VersionPath[]>;
|
__polkadotjs: Record<string, VersionPath[]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
type PjsWindow = (Window & This) & PjsChecks;
|
type PjsGlobal = (Window & This) & PjsChecks;
|
||||||
type FnString = () => string | undefined;
|
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:';
|
const DEDUPE = 'Either remove and explicitly install matching versions or dedupe using your package manager.\nThe following conflicting packages were found:';
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
function getEntry (name: string): VersionPath[] {
|
function getEntry (name: string): VersionPath[] {
|
||||||
const _global = xglobal as PjsWindow;
|
const _global = xglobal as PjsGlobal;
|
||||||
|
|
||||||
if (!_global.__polkadotjs) {
|
if (!_global.__polkadotjs) {
|
||||||
_global.__polkadotjs = {};
|
_global.__polkadotjs = {};
|
||||||
@@ -46,37 +45,45 @@ function getEntry (name: string): VersionPath[] {
|
|||||||
return _global.__polkadotjs[name];
|
return _global.__polkadotjs[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getVersionLength (all: { version: string }[]): number {
|
/** @internal */
|
||||||
let length = 0;
|
function formatDisplay <T extends { version: string }> (all: T[], fmt: (version: string, data: T) => string[]): string {
|
||||||
|
let max = 0;
|
||||||
|
|
||||||
for (const { version } of all) {
|
for (let i = 0; i < all.length; i++) {
|
||||||
length = Math.max(length, version.length);
|
max = Math.max(max, all[i].version.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
return length;
|
return all
|
||||||
|
.map((d) => `\t${fmt(d.version.padEnd(max), d).join('\t')}`)
|
||||||
|
.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
function flattenInfos (all: PackageJson[]): string {
|
function formatInfo (version: string, { name }: PackageJson): string[] {
|
||||||
const verLength = getVersionLength(all);
|
return [
|
||||||
const stringify = ({ name, version }: PackageJson) =>
|
version,
|
||||||
`\t${version.padEnd(verLength)}\t${name}`;
|
name
|
||||||
|
];
|
||||||
return all.map(stringify).join('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
function flattenVersions (entry: VersionPath[]): string {
|
function formatVersion (version: string, { path, type }: VersionPath): string[] {
|
||||||
const toPath = (version: VersionPath | string): VersionPath =>
|
let extracted: string;
|
||||||
isString(version)
|
|
||||||
? { version }
|
|
||||||
: version;
|
|
||||||
const all = entry.map(toPath);
|
|
||||||
const verLength = getVersionLength(all);
|
|
||||||
const stringify = ({ path, type, version }: VersionPath) =>
|
|
||||||
`\t${`${type || ''}`.padStart(3)} ${version.padEnd(verLength)}\t${(!path || path.length < 5) ? '<unknown>' : path}`;
|
|
||||||
|
|
||||||
return all.map(stringify).join('\n');
|
if (path && path.length >= 5) {
|
||||||
|
const nmIndex = path.indexOf('node_modules');
|
||||||
|
|
||||||
|
extracted = nmIndex === -1
|
||||||
|
? path
|
||||||
|
: path.substring(nmIndex);
|
||||||
|
} else {
|
||||||
|
extracted = '<unknown>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
`${`${type || ''}`.padStart(3)} ${version}`,
|
||||||
|
extracted
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
@@ -94,6 +101,11 @@ function getPath (infoPath?: string, pathOrFn?: FnString | string | false | null
|
|||||||
return pathOrFn || '';
|
return pathOrFn || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @internal */
|
||||||
|
function warn <T extends { version: string }> (pre: string, all: T[], fmt: (version: string, data: T) => string[]): void {
|
||||||
|
console.warn(`${pre}\n${DEDUPE}\n${formatDisplay(all, fmt)}`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name detectPackage
|
* @name detectPackage
|
||||||
* @summary Checks that a specific package is only imported once
|
* @summary Checks that a specific package is only imported once
|
||||||
@@ -107,12 +119,12 @@ export function detectPackage ({ name, path, type, version }: PackageJson, pathO
|
|||||||
entry.push({ path: getPath(path, pathOrFn), type, version });
|
entry.push({ path: getPath(path, pathOrFn), type, version });
|
||||||
|
|
||||||
if (entry.length !== 1) {
|
if (entry.length !== 1) {
|
||||||
console.warn(`${name} has multiple versions, ensure that there is only one installed.\n${DEDUPE}\n${flattenVersions(entry)}`);
|
warn(`${name} has multiple versions, ensure that there is only one installed.`, entry, formatVersion);
|
||||||
} else {
|
} else {
|
||||||
const mismatches = deps.filter((d) => d && d.version !== version);
|
const mismatches = deps.filter((d) => d && d.version !== version);
|
||||||
|
|
||||||
if (mismatches.length) {
|
if (mismatches.length) {
|
||||||
console.warn(`${name} requires direct dependencies exactly matching version ${version}.\n${DEDUPE}\n${flattenInfos(mismatches)}`);
|
warn(`${name} requires direct dependencies exactly matching version ${version}.`, mismatches, formatInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
"./shim.cjs"
|
"./shim.cjs"
|
||||||
],
|
],
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/x-global": "8.7.1"
|
"@polkadot/x-global": "9.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/util": "8.7.1",
|
"@polkadot/util": "9.3.1",
|
||||||
"buffer-es6": "^4.9.3"
|
"buffer-es6": "^4.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"browser": "browser.js",
|
"browser": "browser.js",
|
||||||
"main": "node.js",
|
"main": "node.js",
|
||||||
"react-native": "react-native.js",
|
"react-native": "react-native.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8",
|
"@babel/runtime": "^7.18.3",
|
||||||
"@polkadot/x-global": "8.7.1",
|
"@polkadot/x-global": "9.3.1",
|
||||||
"@types/node-fetch": "^2.6.1",
|
"@types/node-fetch": "^2.6.1",
|
||||||
"node-fetch": "^2.6.7"
|
"node-fetch": "^2.6.7"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
},
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "8.7.1",
|
"version": "9.3.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.17.8"
|
"@babel/runtime": "^7.18.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
// Do not edit, auto-generated by @polkadot/dev
|
// Do not edit, auto-generated by @polkadot/dev
|
||||||
|
|
||||||
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '8.7.1' };
|
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '9.3.1' };
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user