Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7782eef6e3 | ||
|
|
0c477e15c4 | ||
|
|
f39820e9c0 | ||
|
|
35d1a8e57f | ||
|
|
83567b75c5 | ||
|
|
501d0fa249 | ||
|
|
014702ca16 | ||
|
|
b53d34b41f | ||
|
|
47d995b88d | ||
|
|
cedba4af0c | ||
|
|
df8d84467b | ||
|
|
c289a83b16 | ||
|
|
a869ba7793 | ||
|
|
4f4ce3549e | ||
|
|
ce55d5b7d8 | ||
|
|
10997a6d73 | ||
|
|
ebe30a2880 | ||
|
|
b4963cc6bd | ||
|
|
304f7ad124 | ||
|
|
9777bca5d4 | ||
|
|
4c379e85cc | ||
|
|
4ee83d3d29 | ||
|
|
40d6a388b2 | ||
|
|
31f4940ec6 | ||
|
|
1ac50696ca | ||
|
|
1ca5ff48a0 | ||
|
|
8253272901 | ||
|
|
82c38e9805 | ||
|
|
509834c491 | ||
|
|
d713a7a116 | ||
|
|
d24e14aa5e | ||
|
|
b1a4a87926 | ||
|
|
05e0d36a0e | ||
|
|
5599a8877c | ||
|
|
2d850c5ac4 | ||
|
|
82ba3fb9b1 | ||
|
|
0aae0e2bc2 | ||
|
|
2bcea83e0a | ||
|
|
20e126759e | ||
|
|
566127bcb6 | ||
|
|
b50ee462da | ||
|
|
a3cd2de56d | ||
|
|
7f60123417 | ||
|
|
bb124813dc | ||
|
|
652ede8ce7 | ||
|
|
52d2d38051 | ||
|
|
65f627c0dc | ||
|
|
9ecf29b83b | ||
|
|
97b84977b7 | ||
|
|
f9315c307f | ||
|
|
c08c947abf | ||
|
|
2d4509c32a | ||
|
|
c6e18b1a9e | ||
|
|
515a77781f | ||
|
|
55d2c149f7 | ||
|
|
43b959ad1f | ||
|
|
6708b34a01 | ||
|
|
a9a9214f3b | ||
|
|
8bd77c97a0 | ||
|
|
ed70e5c65f | ||
|
|
ca6f157007 | ||
|
|
6c30e328bb | ||
|
|
1f6f3c67a8 | ||
|
|
d19e2c8469 | ||
|
|
92f479e0e5 |
@@ -9,7 +9,7 @@ jobs:
|
||||
if: "! startsWith(github.event.head_commit.message, '[CI Skip]') && (!github.event.pull_request || github.event.pull_request.head.repo.full_name == github.repository)"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: jacogr/action-approve@master
|
||||
- uses: jacogr/action-approve@9d6ce78d26f23ad29d009d034822cf773f2cb50e
|
||||
with:
|
||||
authors: jacogr
|
||||
labels: -auto
|
||||
|
||||
@@ -8,7 +8,7 @@ jobs:
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: jacogr/action-merge@master
|
||||
- uses: jacogr/action-merge@3b4b49af8a8644bf5cbb5409ee236abe04eeb1b0
|
||||
with:
|
||||
checks: build,lint,test
|
||||
labels: -auto
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
env:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v2
|
||||
- uses: dessant/lock-threads@f1a42f0f44eb83361d617a014663e1a76cf282d2
|
||||
with:
|
||||
github-token: ${{ secrets.GH_PAT_BOT }}
|
||||
issue-lock-inactive-days: '7'
|
||||
|
||||
@@ -12,8 +12,8 @@ jobs:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: denoland/setup-deno@v1
|
||||
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
|
||||
- uses: denoland/setup-deno@004814556e37c54a2f6e31384c9e18e983317366
|
||||
with:
|
||||
deno-version: vx.x.x
|
||||
- name: ${{ matrix.step }}
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GH_PAT }}
|
||||
|
||||
@@ -12,8 +12,8 @@ jobs:
|
||||
env:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: returntocorp/semgrep-action@v1
|
||||
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
|
||||
- uses: returntocorp/semgrep-action@aeafd770072c4f48798b991e3449592bddc2c435
|
||||
with:
|
||||
auditOn: push
|
||||
publishToken: ${{ secrets.SEMGREP_APP_TOKEN }}
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
env:
|
||||
YARN_ENABLE_SCRIPTS: false
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
- uses: actions/stale@98ed4cb500039dbcccf4bd9bedada4d0187f2757
|
||||
with:
|
||||
repo-token: ${{ secrets.GH_PAT_BOT }}
|
||||
stale-issue-message: 'This issue has been open for 21 days with no activity and is not labelled as an enhancement. It will be closed in 7 days.'
|
||||
|
||||
@@ -1,5 +1,69 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 10.1.8 Sep 17, 2022
|
||||
|
||||
Contributed:
|
||||
|
||||
- Ledger support for Darwinia, Phala & Khala (Thanks to https://github.com/carlosala)
|
||||
- Ledger support for HydraX (Thanks to https://github.com/chcmedeiros)
|
||||
|
||||
Changes:
|
||||
|
||||
- Expand test cases
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.7 Sep 2, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Hoist Ledger interface wrapError (internal adjustment)
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.6 Aug 23, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `nextTick` with greater care for browser loops
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.5 Aug 21, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `ledgerApps` to use new `@zondax/ledger-substrate` interfaces
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.4 Aug 12, 2022
|
||||
|
||||
Contributed:
|
||||
|
||||
- Ledger support for Kusama Bifrost (Thanks to https://github.com/awesomepan)
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.3 Aug 5, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Optimization for empty `arrayFlatten` case
|
||||
- Coding cleanups for logger (no `as` casting)
|
||||
- Optiomizations in assertion checks
|
||||
|
||||
|
||||
## 10.1.2 Jul 29, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
- Upgrade dependencies to latest stable versions
|
||||
|
||||
|
||||
## 10.1.1 Jul 21, 2022
|
||||
|
||||
Changes:
|
||||
|
||||
+4
-3
@@ -1,12 +1,12 @@
|
||||
1432 Jaco 10.1.1 (#1614)
|
||||
1461 Jaco 10.1.8 (#1649)
|
||||
9 Antoine Estienne Add eth uri keyring test (#1291)
|
||||
8 Carlo Sala feat: add darwinia to knownLedger (#1643)
|
||||
6 Amaury Martiny Add tests from Rust (#283)
|
||||
6 Carlo Sala feat(ledger): add interlay and unique (#1609)
|
||||
5 Jakub Pánik Add HydraDX parachain to genesis (#1583)
|
||||
5 kwingram25 Add BN consts and timeToString (#610)
|
||||
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
|
||||
4 pan add bifrost kusama (#1626)
|
||||
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
|
||||
3 pan update bifrost genesis hash (#1521)
|
||||
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
|
||||
2 Gav Wood Fix stake:unstake (#182)
|
||||
2 Hyungsuk Kang Add cross client Encryption/Decryption (#496)
|
||||
@@ -21,6 +21,7 @@
|
||||
1 amphineko chore: fix typo in versionDetect messages (#941)
|
||||
1 Axel Chalon Simplify @polkadot/keyring KeyringPair (#419)
|
||||
1 Brad Larson [FIX] Adjust error message (#646)
|
||||
1 Carlos Medeiros add hydradx to knownLedger (#1647)
|
||||
1 Eliott Teissonniere add nodle ledger specs (#1089)
|
||||
1 h4x3rotab Throws an error when signing with a locked keypair (#578)
|
||||
1 Harry Liu Update README.md (#446)
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"imports": {
|
||||
"https://esm.sh/v90/@types/bn.js@~5.2/index.d.ts": "https://esm.sh/v90/@types/bn.js@5.1.0/index.d.ts"
|
||||
}
|
||||
}
|
||||
+7
-7
@@ -11,10 +11,10 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"versions": {
|
||||
"git": "10.1.1",
|
||||
"npm": "10.1.1"
|
||||
"git": "10.1.8",
|
||||
"npm": "10.1.8"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
@@ -32,11 +32,11 @@
|
||||
"test:one": "polkadot-dev-run-test --runInBand"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.18.9",
|
||||
"@polkadot/dev": "^0.67.84",
|
||||
"@types/jest": "^28.1.6"
|
||||
"@babel/core": "^7.19.1",
|
||||
"@polkadot/dev": "^0.67.129",
|
||||
"@types/jest": "^29.0.3"
|
||||
},
|
||||
"resolutions": {
|
||||
"typescript": "^4.7.4"
|
||||
"typescript": "^4.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,18 +16,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.1",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.1",
|
||||
"@polkadot/util": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@ledgerhq/hw-transport": "^6.27.4",
|
||||
"@ledgerhq/hw-transport-webhid": "^6.27.4",
|
||||
"@ledgerhq/hw-transport-webusb": "^6.27.4",
|
||||
"@polkadot/util": "10.1.8"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.2"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^6.28.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@ledgerhq/hw-transport": "^6.27.1",
|
||||
"@polkadot/hw-ledger-transports": "10.1.1",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@zondax/ledger-substrate": "^0.33.0"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@ledgerhq/hw-transport": "^6.27.4",
|
||||
"@polkadot/hw-ledger-transports": "10.1.8",
|
||||
"@polkadot/util": "10.1.8",
|
||||
"@zondax/ledger-substrate": "^0.38.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { ResponseBase, SubstrateApp } from '@zondax/ledger-substrate';
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
import type { ResponseBase } from '@zondax/ledger-substrate/dist/common';
|
||||
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
|
||||
|
||||
import { newSubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { u8aToBuffer } from '@polkadot/util';
|
||||
|
||||
@@ -14,6 +17,16 @@ export { packageInfo } from './packageInfo';
|
||||
|
||||
type Chain = keyof typeof ledgerApps;
|
||||
|
||||
async function wrapError <T extends ResponseBase> (promise: Promise<T>): Promise<T> {
|
||||
const result = await promise;
|
||||
|
||||
if (result.return_code !== LEDGER_SUCCESS_CODE) {
|
||||
throw new Error(result.error_message);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// A very basic wrapper for a ledger app -
|
||||
// - it connects automatically, creating an app as required
|
||||
// - Promises return errors (instead of wrapper errors)
|
||||
@@ -38,7 +51,7 @@ export class Ledger {
|
||||
|
||||
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
|
||||
const { address, pubKey } = await this.#wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
||||
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
||||
|
||||
return {
|
||||
address,
|
||||
@@ -49,7 +62,7 @@ export class Ledger {
|
||||
|
||||
public async getVersion (): Promise<LedgerVersion> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
|
||||
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await this.#wrapError(app.getVersion());
|
||||
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
|
||||
|
||||
return {
|
||||
isLocked,
|
||||
@@ -62,7 +75,7 @@ export class Ledger {
|
||||
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
|
||||
const buffer = u8aToBuffer(message);
|
||||
const { signature } = await this.#wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
|
||||
const { signature } = await wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
|
||||
|
||||
return {
|
||||
signature: `0x${signature.toString('hex')}`
|
||||
@@ -80,7 +93,7 @@ export class Ledger {
|
||||
|
||||
const transport = await def.create();
|
||||
|
||||
this.#app = ledgerApps[this.#chain](transport);
|
||||
this.#app = newSubstrateApp(transport, ledgerApps[this.#chain]);
|
||||
}
|
||||
|
||||
return this.#app;
|
||||
@@ -97,14 +110,4 @@ export class Ledger {
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
|
||||
const result = await promise;
|
||||
|
||||
if (result.return_code !== LEDGER_SUCCESS_CODE) {
|
||||
throw new Error(result.error_message);
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { supportedApps } from '@zondax/ledger-substrate';
|
||||
|
||||
import { ledgerApps } from './defaults';
|
||||
|
||||
describe('ledgerApps', (): void => {
|
||||
it.each(Object.keys(ledgerApps))('%s is known', (k): void => {
|
||||
expect(
|
||||
supportedApps.find(({ name }) =>
|
||||
name === ledgerApps[k]
|
||||
)
|
||||
).toBeDefined();
|
||||
});
|
||||
});
|
||||
@@ -1,35 +1,36 @@
|
||||
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { SubstrateApp } from '@zondax/ledger-substrate';
|
||||
|
||||
import { newAcalaApp, newAlephZeroApp, newAstarApp, newBifrostApp, newCentrifugeApp, newComposableApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newInterlayApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStafiApp, newStatemineApp, newStatemintApp, newUniqueApp, newXXNetworkApp } from '@zondax/ledger-substrate';
|
||||
|
||||
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
|
||||
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
acala: newAcalaApp,
|
||||
'aleph-node': newAlephZeroApp,
|
||||
astar: newAstarApp,
|
||||
bifrost: newBifrostApp,
|
||||
centrifuge: newCentrifugeApp,
|
||||
composable: newComposableApp,
|
||||
'dock-mainnet': newDockApp,
|
||||
edgeware: newEdgewareApp,
|
||||
equilibrium: newEquilibriumApp,
|
||||
genshiro: newGenshiroApp,
|
||||
'interlay-parachain': newInterlayApp,
|
||||
karura: newKaruraApp,
|
||||
kusama: newKusamaApp,
|
||||
'nodle-para': newNodleApp,
|
||||
parallel: newParallelApp,
|
||||
polkadex: newPolkadexApp,
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp,
|
||||
sora: newSoraApp,
|
||||
stafi: newStafiApp,
|
||||
statemine: newStatemineApp,
|
||||
statemint: newStatemintApp,
|
||||
unique: newUniqueApp,
|
||||
xxnetwork: newXXNetworkApp
|
||||
// and maps to the known name in the @zondax/ledger-substrate/supported_apps package
|
||||
export const ledgerApps: Record<string, string> = {
|
||||
acala: 'Acala',
|
||||
'aleph-node': 'AlephZero',
|
||||
astar: 'Astar',
|
||||
bifrost: 'Bifrost',
|
||||
'bifrost-kusama': 'BifrostKusama',
|
||||
centrifuge: 'Centrifuge',
|
||||
composable: 'Composable',
|
||||
darwinia: 'Darwinia',
|
||||
'dock-mainnet': 'Dock',
|
||||
edgeware: 'Edgeware',
|
||||
equilibrium: 'Equilibrium',
|
||||
genshiro: 'Genshiro',
|
||||
hydradx: 'HydraDX',
|
||||
'interlay-parachain': 'Interlay',
|
||||
karura: 'Karura',
|
||||
khala: 'Khala',
|
||||
kusama: 'Kusama',
|
||||
'nodle-para': 'Nodle',
|
||||
parallel: 'Parallel',
|
||||
phala: 'Phala',
|
||||
polkadex: 'Polkadex',
|
||||
polkadot: 'Polkadot',
|
||||
polymesh: 'Polymesh',
|
||||
sora: 'Sora',
|
||||
stafi: 'Stafi',
|
||||
statemine: 'Statemine',
|
||||
statemint: 'Statemint',
|
||||
unique: 'Unique',
|
||||
xxnetwork: 'XXNetwork'
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -20,15 +20,15 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@polkadot/util-crypto": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/util": "10.1.8",
|
||||
"@polkadot/util-crypto": "10.1.8"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@polkadot/util-crypto": "10.1.1"
|
||||
"@polkadot/util": "10.1.8",
|
||||
"@polkadot/util-crypto": "10.1.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@substrate/ss58-registry": "^1.24.0"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/util": "10.1.8",
|
||||
"@substrate/ss58-registry": "^1.29.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/hw-ledger": "10.1.1"
|
||||
"@polkadot/hw-ledger": "10.1.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
bifrost: [
|
||||
'0x262e1b2ad728475fd6fe88e62d34c200abe6fd693931ddad144059b1eb884e5b'
|
||||
],
|
||||
'bifrost-kusama': [
|
||||
'0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
|
||||
],
|
||||
centrifuge: [
|
||||
'0xb3db41421702df9a7fcac62b53ffeac85f7853cc4e689e0b93aeb3db18c09d82',
|
||||
'0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
|
||||
@@ -30,6 +33,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
composable: [
|
||||
'0xdaab8df776eb52ec604a5df5d388bb62a050a0aaec4556a64265b9d42755552d'
|
||||
],
|
||||
darwinia: [
|
||||
'0xe71578b37a7c799b0ab4ee87ffa6f059a6b98f71f06fb8c84a8d88013a548ad6'
|
||||
],
|
||||
'dock-mainnet': [
|
||||
'0x6bfe24dca2a3be10f22212678ac13a6446ec764103c0f3471c71609eac384aae',
|
||||
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
|
||||
@@ -56,6 +62,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
karura: [
|
||||
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
|
||||
],
|
||||
khala: [
|
||||
'0xd43540ba6d3eb4897c28a77d48cb5b729fea37603cbbfc7a86a73b72adb3be8d'
|
||||
],
|
||||
kulupu: [
|
||||
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
|
||||
],
|
||||
@@ -70,6 +79,9 @@ export const knownGenesis: KnownGenesis = {
|
||||
parallel: [
|
||||
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
|
||||
],
|
||||
phala: [
|
||||
'0x1bb969d85965e4bb5a651abbedf21a54b6b31a21f66b5401cc3f1e286268d736'
|
||||
],
|
||||
picasso: [
|
||||
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
||||
],
|
||||
|
||||
@@ -12,17 +12,22 @@ export const knownLedger: KnownLedger = {
|
||||
'aleph-node': 0x00000283,
|
||||
astar: 0x0000032a,
|
||||
bifrost: 0x00000314,
|
||||
'bifrost-kusama': 0x00000314,
|
||||
centrifuge: 0x000002eb,
|
||||
composable: 0x00000162,
|
||||
darwinia: 0x00000162,
|
||||
'dock-mainnet': 0x00000252,
|
||||
edgeware: 0x0000020b,
|
||||
equilibrium: 0x05f5e0fd,
|
||||
genshiro: 0x05f5e0fc,
|
||||
hydradx: 0x00000162,
|
||||
'interlay-parachain': 0x00000162,
|
||||
karura: 0x000002ae,
|
||||
khala: 0x000001b2,
|
||||
kusama: 0x000001b2,
|
||||
'nodle-para': 0x000003eb,
|
||||
parallel: 0x00000162,
|
||||
phala: 0x00000162,
|
||||
polkadex: 0x0000031f,
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253,
|
||||
|
||||
@@ -10,6 +10,7 @@ export const knownTestnet: KnownTestnet = {
|
||||
'dock-testnet': true,
|
||||
jupiter: true,
|
||||
'mathchain-testnet': true,
|
||||
p3dt: true,
|
||||
subspace_testnet: true,
|
||||
'zero-alphaville': true
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@ describe('availableNetworks', (): void => {
|
||||
expect(availableNetworks.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
|
||||
});
|
||||
|
||||
it('has a sorted list (first external, last external)', (): void => {
|
||||
it.skip('has a sorted list (first external, last external)', (): void => {
|
||||
expect(availableNetworks[3].displayName).toEqual('Acala');
|
||||
expect(availableNetworks[availableNetworks.length - 1].displayName).toEqual('ZERO');
|
||||
});
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -232,6 +232,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://darwinia.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 19,
|
||||
"network": "watr",
|
||||
"displayName": "Watr Protocol",
|
||||
"symbols": [
|
||||
"WATR"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.watr.org"
|
||||
},
|
||||
{
|
||||
"prefix": 20,
|
||||
"network": "stafi",
|
||||
@@ -599,9 +612,11 @@
|
||||
"network": "oak",
|
||||
"displayName": "OAK Network",
|
||||
"symbols": [
|
||||
"OAK"
|
||||
"OAK",
|
||||
"TUR"
|
||||
],
|
||||
"decimals": [
|
||||
10,
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
@@ -767,6 +782,32 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://sora.org"
|
||||
},
|
||||
{
|
||||
"prefix": 71,
|
||||
"network": "p3d",
|
||||
"displayName": "3DP network",
|
||||
"symbols": [
|
||||
"P3D"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://3dpass.org"
|
||||
},
|
||||
{
|
||||
"prefix": 72,
|
||||
"network": "p3dt",
|
||||
"displayName": "3DP test network",
|
||||
"symbols": [
|
||||
"P3Dt"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://3dpass.org"
|
||||
},
|
||||
{
|
||||
"prefix": 73,
|
||||
"network": "zeitgeist",
|
||||
@@ -832,6 +873,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://polkadex.trade"
|
||||
},
|
||||
{
|
||||
"prefix": 92,
|
||||
"network": "anmol",
|
||||
"displayName": "Anmol Network",
|
||||
"symbols": [
|
||||
"ANML"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://anmol.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 93,
|
||||
"network": "fragnova",
|
||||
@@ -871,6 +925,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://polkafoundry.com"
|
||||
},
|
||||
{
|
||||
"prefix": 100,
|
||||
"network": "ibtida",
|
||||
"displayName": "Anmol Network Ibtida Canary network",
|
||||
"symbols": [
|
||||
"IANML"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://anmol.network/"
|
||||
},
|
||||
{
|
||||
"prefix": 101,
|
||||
"network": "origintrail-parachain",
|
||||
@@ -958,6 +1025,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://clover.finance"
|
||||
},
|
||||
{
|
||||
"prefix": 129,
|
||||
"network": "dorafactory-polkadot",
|
||||
"displayName": "Dorafactory Polkadot Network",
|
||||
"symbols": [
|
||||
"DORA"
|
||||
],
|
||||
"decimals": [
|
||||
12
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://dorafactory.org"
|
||||
},
|
||||
{
|
||||
"prefix": 131,
|
||||
"network": "litmus",
|
||||
@@ -1018,7 +1098,7 @@
|
||||
"QTZ"
|
||||
],
|
||||
"decimals": [
|
||||
15
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
@@ -1072,7 +1152,7 @@
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "Sr25519",
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://efinity.io/"
|
||||
},
|
||||
{
|
||||
@@ -1153,6 +1233,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://ajuna.io"
|
||||
},
|
||||
{
|
||||
"prefix": 1985,
|
||||
"network": "seals",
|
||||
"displayName": "Seals Network",
|
||||
"symbols": [
|
||||
"SEAL"
|
||||
],
|
||||
"decimals": [
|
||||
9
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://seals.app"
|
||||
},
|
||||
{
|
||||
"prefix": 2007,
|
||||
"network": "kapex",
|
||||
@@ -1192,6 +1285,58 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://interlay.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 2112,
|
||||
"network": "chainflip",
|
||||
"displayName": "Chainflip",
|
||||
"symbols": [
|
||||
"FLIP"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://chainflip.io/"
|
||||
},
|
||||
{
|
||||
"prefix": 2114,
|
||||
"network": "Turing",
|
||||
"displayName": "Turing Network",
|
||||
"symbols": [
|
||||
"TUR"
|
||||
],
|
||||
"decimals": [
|
||||
10
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://oak.tech/turing/home/"
|
||||
},
|
||||
{
|
||||
"prefix": 2207,
|
||||
"network": "SNOW",
|
||||
"displayName": "SNOW: ICE Canary Network",
|
||||
"symbols": [
|
||||
"ICZ"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 2208,
|
||||
"network": "ICE",
|
||||
"displayName": "ICE Network",
|
||||
"symbols": [
|
||||
"ICY"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 2254,
|
||||
"network": "subspace_testnet",
|
||||
@@ -1205,6 +1350,71 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://subspace.network"
|
||||
},
|
||||
{
|
||||
"prefix": 3000,
|
||||
"network": "hashed",
|
||||
"displayName": "Hashed Network",
|
||||
"symbols": [
|
||||
"HASH"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://hashed.network"
|
||||
},
|
||||
{
|
||||
"prefix": 4000,
|
||||
"network": "luhn",
|
||||
"displayName": "Luhn Network",
|
||||
"symbols": [
|
||||
"LUHN"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://luhn.network"
|
||||
},
|
||||
{
|
||||
"prefix": 4006,
|
||||
"network": "tangle",
|
||||
"displayName": "Tangle Network",
|
||||
"symbols": [
|
||||
"TNT"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://www.webb.tools/"
|
||||
},
|
||||
{
|
||||
"prefix": 4450,
|
||||
"network": "g1",
|
||||
"displayName": "Ğ1",
|
||||
"symbols": [
|
||||
"G1"
|
||||
],
|
||||
"decimals": [
|
||||
2
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://duniter.org"
|
||||
},
|
||||
{
|
||||
"prefix": 5234,
|
||||
"network": "humanode",
|
||||
"displayName": "Humanode Network",
|
||||
"symbols": [
|
||||
"HMND"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://humanode.io"
|
||||
},
|
||||
{
|
||||
"prefix": 6094,
|
||||
"network": "subspace",
|
||||
@@ -1231,6 +1441,23 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://tidefi.com"
|
||||
},
|
||||
{
|
||||
"prefix": 7013,
|
||||
"network": "gm",
|
||||
"displayName": "GM",
|
||||
"symbols": [
|
||||
"FREN",
|
||||
"GM",
|
||||
"GN"
|
||||
],
|
||||
"decimals": [
|
||||
12,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://gmordie.com"
|
||||
},
|
||||
{
|
||||
"prefix": 7391,
|
||||
"network": "unique_mainnet",
|
||||
@@ -1244,6 +1471,19 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
},
|
||||
{
|
||||
"prefix": 8883,
|
||||
"network": "sapphire_mainnet",
|
||||
"displayName": "Sapphire by Unique",
|
||||
"symbols": [
|
||||
"QTZ"
|
||||
],
|
||||
"decimals": [
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://unique.network"
|
||||
},
|
||||
{
|
||||
"prefix": 9807,
|
||||
"network": "dentnet",
|
||||
@@ -1309,21 +1549,6 @@
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://ata.network"
|
||||
},
|
||||
{
|
||||
"prefix": 15253,
|
||||
"network": "ice-network",
|
||||
"displayName": "ICE Network",
|
||||
"symbols": [
|
||||
"ICX",
|
||||
"ICY"
|
||||
],
|
||||
"decimals": [
|
||||
18,
|
||||
18
|
||||
],
|
||||
"standardAccount": "*25519",
|
||||
"website": "https://icenetwork.io"
|
||||
},
|
||||
{
|
||||
"prefix": 12191,
|
||||
"network": "nftmart",
|
||||
|
||||
@@ -22,21 +22,21 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": {
|
||||
"crypto": false,
|
||||
"stream": false
|
||||
},
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@noble/hashes": "1.1.2",
|
||||
"@noble/secp256k1": "1.6.3",
|
||||
"@polkadot/networks": "10.1.1",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@noble/secp256k1": "1.7.0",
|
||||
"@polkadot/networks": "10.1.8",
|
||||
"@polkadot/util": "10.1.8",
|
||||
"@polkadot/wasm-crypto": "^6.3.1",
|
||||
"@polkadot/x-bigint": "10.1.1",
|
||||
"@polkadot/x-randomvalues": "10.1.1",
|
||||
"@polkadot/x-bigint": "10.1.8",
|
||||
"@polkadot/x-randomvalues": "10.1.8",
|
||||
"@scure/base": "1.1.1",
|
||||
"ed2curve": "^0.3.0",
|
||||
"tweetnacl": "^1.0.3"
|
||||
@@ -45,6 +45,6 @@
|
||||
"@types/ed2curve": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "10.1.1"
|
||||
"@polkadot/util": "10.1.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,14 +5,16 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L6
|
||||
import { assert, isHex, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
import { isHex, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { base58Decode } from '../base58';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
export function decodeAddress (encoded?: HexString | string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
|
||||
assert(encoded, 'Invalid empty address passed');
|
||||
if (!encoded) {
|
||||
throw new Error('Invalid empty address passed');
|
||||
}
|
||||
|
||||
if (isU8a(encoded) || isHex(encoded)) {
|
||||
return u8aToU8a(encoded);
|
||||
@@ -21,12 +23,17 @@ export function decodeAddress (encoded?: HexString | string | Uint8Array | null,
|
||||
try {
|
||||
const decoded = base58Decode(encoded);
|
||||
|
||||
assert(defaults.allowedEncodedLengths.includes(decoded.length), 'Invalid decoded address length');
|
||||
if (!defaults.allowedEncodedLengths.includes(decoded.length)) {
|
||||
throw new Error('Invalid decoded address length');
|
||||
}
|
||||
|
||||
const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
|
||||
|
||||
assert(ignoreChecksum || isValid, 'Invalid decoded address checksum');
|
||||
assert([-1, ss58Decoded].includes(ss58Format), () => `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
|
||||
if (!isValid && !ignoreChecksum) {
|
||||
throw new Error('Invalid decoded address checksum');
|
||||
} else if (ss58Format !== -1 && ss58Format !== ss58Decoded) {
|
||||
throw new Error(`Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
|
||||
}
|
||||
|
||||
return decoded.slice(ss58Length, endPos);
|
||||
} catch (error) {
|
||||
|
||||
@@ -5,8 +5,6 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import type { DeriveJunction } from '../key/DeriveJunction';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { keyExtractPath } from '../key';
|
||||
import { sr25519DerivePublic } from '../sr25519';
|
||||
import { decodeAddress } from './decode';
|
||||
@@ -25,7 +23,9 @@ function filterHard ({ isHard }: DeriveJunction): boolean {
|
||||
export function deriveAddress (who: HexString | Uint8Array | string, suri: string, ss58Format?: Prefix): string {
|
||||
const { path } = keyExtractPath(suri);
|
||||
|
||||
assert(path.length && !path.every(filterHard), 'Expected suri to contain a combination of non-hard paths');
|
||||
if (!path.length || path.every(filterHard)) {
|
||||
throw new Error('Expected suri to contain a combination of non-hard paths');
|
||||
}
|
||||
|
||||
let publicKey = decodeAddress(who);
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L34
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { base58Encode } from '../base58';
|
||||
import { decodeAddress } from './decode';
|
||||
@@ -16,8 +16,11 @@ export function encodeAddress (key: HexString | Uint8Array | string, ss58Format:
|
||||
// decode it, this means we can re-encode an address
|
||||
const u8a = decodeAddress(key);
|
||||
|
||||
assert(ss58Format >= 0 && ss58Format <= 16383 && ![46, 47].includes(ss58Format), 'Out of range ss58Format specified');
|
||||
assert(defaults.allowedDecodedLengths.includes(u8a.length), () => `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
||||
if ((ss58Format < 0) || (ss58Format > 16383) || [46, 47].includes(ss58Format)) {
|
||||
throw new Error('Out of range ss58Format specified');
|
||||
} else if (!defaults.allowedDecodedLengths.includes(u8a.length)) {
|
||||
throw new Error(`Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
||||
}
|
||||
|
||||
const input = u8aConcat(
|
||||
ss58Format < 64
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
|
||||
import type { HashType } from '../secp256k1/types';
|
||||
import type { Prefix } from './types';
|
||||
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { hasher } from '../secp256k1/hasher';
|
||||
import { encodeAddress } from './encode';
|
||||
@@ -17,7 +17,9 @@ import { encodeAddress } from './encode';
|
||||
export function evmToAddress (evmAddress: HexString | string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
|
||||
const message = u8aConcat('evm:', evmAddress);
|
||||
|
||||
assert(message.length === 24, () => `Converting ${evmAddress as string}: Invalid evm address length`);
|
||||
if (message.length !== 24) {
|
||||
throw new Error(`Converting ${evmAddress as string}: Invalid evm address length`);
|
||||
}
|
||||
|
||||
return encodeAddress(hasher(hashType, message), ss58Format);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { U8aLike } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
|
||||
// re-export the type so *.d.ts files don't have ../src imports
|
||||
export type { U8aLike } from '@polkadot/util/types';
|
||||
@@ -65,22 +65,23 @@ export function createIs (validate: ValidateFn): ValidateFn {
|
||||
/** @internal */
|
||||
export function createValidate ({ chars, ipfs, type }: Config): ValidateFn {
|
||||
return (value?: unknown, ipfsCompat?: boolean): value is string => {
|
||||
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
|
||||
if (!value || typeof value !== 'string') {
|
||||
throw new Error(`Expected non-null, non-empty ${type} string input`);
|
||||
}
|
||||
|
||||
if (ipfs && ipfsCompat) {
|
||||
assert(value[0] === ipfs, () => `Expected ipfs-compatible ${type} to start with '${ipfs}'`);
|
||||
if (ipfs && ipfsCompat && value[0] !== ipfs) {
|
||||
throw new Error(`Expected ipfs-compatible ${type} to start with '${ipfs}'`);
|
||||
}
|
||||
|
||||
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
|
||||
assert(
|
||||
chars.includes(value[i]) || (
|
||||
value[i] === '=' && (
|
||||
(i === value.length - 1) ||
|
||||
!chars.includes(value[i + 1])
|
||||
)
|
||||
),
|
||||
() => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`
|
||||
);
|
||||
if (!(chars.includes(value[i]) || (
|
||||
value[i] === '=' && (
|
||||
(i === value.length - 1) ||
|
||||
!chars.includes(value[i + 1])
|
||||
)
|
||||
))) {
|
||||
throw new Error(`Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
import { isReady, waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
export const cryptoIsReady = isReady;
|
||||
@@ -9,7 +8,9 @@ export const cryptoIsReady = isReady;
|
||||
export function cryptoWaitReady (): Promise<boolean> {
|
||||
return waitReady()
|
||||
.then((): boolean => {
|
||||
assert(isReady(), 'Unable to initialize @polkadot/util-crypto');
|
||||
if (!isReady()) {
|
||||
throw new Error('Unable to initialize @polkadot/util-crypto');
|
||||
}
|
||||
|
||||
return true;
|
||||
})
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert, compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
import { compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
|
||||
const HDKD = compactAddLength(stringToU8a('Ed25519HDKD'));
|
||||
|
||||
export function ed25519DeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
|
||||
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
|
||||
if (!isU8a(chainCode) || chainCode.length !== 32) {
|
||||
throw new Error('Invalid chainCode passed to derive');
|
||||
}
|
||||
|
||||
return blake2AsU8a(
|
||||
u8aConcat(HDKD, seed, chainCode)
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { Keypair } from '../types';
|
||||
|
||||
import nacl from 'tweetnacl';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { ed25519Sign as wasmSign, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -24,7 +24,9 @@ import { ed25519Sign as wasmSign, isReady } from '@polkadot/wasm-crypto';
|
||||
* ```
|
||||
*/
|
||||
export function ed25519Sign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial<Keypair>, onlyJs?: boolean): Uint8Array {
|
||||
assert(secretKey, 'Expected a valid secretKey');
|
||||
if (!secretKey) {
|
||||
throw new Error('Expected a valid secretKey');
|
||||
}
|
||||
|
||||
const messageU8a = u8aToU8a(message);
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import nacl from 'tweetnacl';
|
||||
|
||||
import { assert, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToU8a } from '@polkadot/util';
|
||||
import { ed25519Verify as wasmVerify, isReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
/**
|
||||
@@ -27,8 +27,11 @@ export function ed25519Verify (message: HexString | Uint8Array | string, signatu
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
const signatureU8a = u8aToU8a(signature);
|
||||
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
|
||||
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
if (publicKeyU8a.length !== 32) {
|
||||
throw new Error(`Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
|
||||
} else if (signatureU8a.length !== 64) {
|
||||
throw new Error(`Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
}
|
||||
|
||||
return !onlyJs && isReady()
|
||||
? wasmVerify(signatureU8a, messageU8a, publicKeyU8a)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { HexString } from '@polkadot/util/types';
|
||||
|
||||
import { assert, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { keccakAsU8a } from '../keccak';
|
||||
import { secp256k1Expand } from '../secp256k1';
|
||||
@@ -23,7 +23,9 @@ export function ethereumEncode (addressOrPublic?: HexString | string | Uint8Arra
|
||||
|
||||
const u8aAddress = u8aToU8a(addressOrPublic);
|
||||
|
||||
assert([20, 32, 33, 65].includes(u8aAddress.length), 'Invalid address or publicKey passed');
|
||||
if (![20, 32, 33, 65].includes(u8aAddress.length)) {
|
||||
throw new Error('Invalid address or publicKey passed');
|
||||
}
|
||||
|
||||
const address = u8aToHex(getH160(u8aAddress), -1, false);
|
||||
const hash = u8aToHex(keccakAsU8a(address), -1, false);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import { assert, bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { BN_BE_32_OPTS } from '../../bn';
|
||||
import { hmacShaAsU8a } from '../../hmac';
|
||||
@@ -51,7 +51,9 @@ export function hdEthereum (seed: Uint8Array, path = ''): Keypair {
|
||||
return hd;
|
||||
}
|
||||
|
||||
assert(hdValidatePath(path), 'Invalid derivation path');
|
||||
if (!hdValidatePath(path)) {
|
||||
throw new Error('Invalid derivation path');
|
||||
}
|
||||
|
||||
const parts = path.split('/').slice(1);
|
||||
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
|
||||
import type { Keypair } from '../../types';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { ed25519PairFromSeed } from '../../ed25519';
|
||||
import { mnemonicValidate } from '../../mnemonic';
|
||||
import { HARDENED, hdValidatePath } from '../validatePath';
|
||||
@@ -17,14 +15,19 @@ export function hdLedger (_mnemonic: string, path: string): Keypair {
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s);
|
||||
|
||||
assert([12, 24, 25].includes(words.length), 'Expected a mnemonic with 24 words (or 25 including a password)');
|
||||
if (![12, 24, 25].includes(words.length)) {
|
||||
throw new Error('Expected a mnemonic with 24 words (or 25 including a password)');
|
||||
}
|
||||
|
||||
const [mnemonic, password] = words.length === 25
|
||||
? [words.slice(0, 24).join(' '), words[24]]
|
||||
: [words.join(' '), ''];
|
||||
|
||||
assert(mnemonicValidate(mnemonic), 'Invalid mnemonic passed to ledger derivation');
|
||||
assert(hdValidatePath(path), 'Invalid derivation path');
|
||||
if (!mnemonicValidate(mnemonic)) {
|
||||
throw new Error('Invalid mnemonic passed to ledger derivation');
|
||||
} else if (!hdValidatePath(path)) {
|
||||
throw new Error('Invalid derivation path');
|
||||
}
|
||||
|
||||
const parts = path.split('/').slice(1);
|
||||
let seed = ledgerMaster(mnemonic, password);
|
||||
|
||||
@@ -3,13 +3,15 @@
|
||||
|
||||
import type { EncryptedJson } from './types';
|
||||
|
||||
import { assert, hexToU8a, isHex } from '@polkadot/util';
|
||||
import { hexToU8a, isHex } from '@polkadot/util';
|
||||
|
||||
import { base64Decode } from '../base64';
|
||||
import { jsonDecryptData } from './decryptData';
|
||||
|
||||
export function jsonDecrypt ({ encoded, encoding }: EncryptedJson, passphrase?: string | null): Uint8Array {
|
||||
assert(encoded, 'No encrypted data available to decode');
|
||||
if (!encoded) {
|
||||
throw new Error('No encrypted data available to decode');
|
||||
}
|
||||
|
||||
return jsonDecryptData(
|
||||
isHex(encoded)
|
||||
|
||||
@@ -3,15 +3,18 @@
|
||||
|
||||
import type { EncryptedJsonEncoding } from './types';
|
||||
|
||||
import { assert, stringToU8a, u8aFixLength } from '@polkadot/util';
|
||||
import { stringToU8a, u8aFixLength } from '@polkadot/util';
|
||||
|
||||
import { naclDecrypt } from '../nacl';
|
||||
import { scryptEncode, scryptFromU8a } from '../scrypt';
|
||||
import { ENCODING, NONCE_LENGTH, SCRYPT_LENGTH } from './constants';
|
||||
|
||||
export function jsonDecryptData (encrypted?: Uint8Array | null, passphrase?: string | null, encType: EncryptedJsonEncoding[] = ENCODING): Uint8Array {
|
||||
assert(encrypted, 'No encrypted data available to decode');
|
||||
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encrypted data');
|
||||
if (!encrypted) {
|
||||
throw new Error('No encrypted data available to decode');
|
||||
} else if (encType.includes('xsalsa20-poly1305') && !passphrase) {
|
||||
throw new Error('Password required to decode encrypted data');
|
||||
}
|
||||
|
||||
let encoded: Uint8Array | null = encrypted;
|
||||
|
||||
@@ -34,7 +37,9 @@ export function jsonDecryptData (encrypted?: Uint8Array | null, passphrase?: str
|
||||
);
|
||||
}
|
||||
|
||||
assert(encoded, 'Unable to decode using the supplied passphrase');
|
||||
if (!encoded) {
|
||||
throw new Error('Unable to decode using the supplied passphrase');
|
||||
}
|
||||
|
||||
return encoded;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { DeriveJunction } from './DeriveJunction';
|
||||
|
||||
const RE_JUNCTION = /\/(\/?)([^/]+)/g;
|
||||
@@ -28,7 +26,9 @@ export function keyExtractPath (derivePath: string): ExtractResult {
|
||||
}
|
||||
}
|
||||
|
||||
assert(constructed === derivePath, () => `Re-constructed path "${constructed}" does not match input`);
|
||||
if (constructed !== derivePath) {
|
||||
throw new Error(`Re-constructed path "${constructed}" does not match input`);
|
||||
}
|
||||
|
||||
return {
|
||||
parts,
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
|
||||
import type { Keypair } from '../types';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { DeriveJunction } from './DeriveJunction';
|
||||
|
||||
export function createSeedDeriveFn (fromSeed: (seed: Uint8Array) => Keypair, derive: (seed: Uint8Array, chainCode: Uint8Array) => Uint8Array): (keypair: Keypair, junction: DeriveJunction) => Keypair {
|
||||
return (keypair: Keypair, { chainCode, isHard }: DeriveJunction): Keypair => {
|
||||
assert(isHard, 'A soft key was found in the path and is not supported');
|
||||
if (!isHard) {
|
||||
throw new Error('A soft key was found in the path and is not supported');
|
||||
}
|
||||
|
||||
return fromSeed(
|
||||
derive(keypair.secretKey.subarray(0, 32), chainCode)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { entropyToMnemonic, mnemonicToEntropy } from './bip39';
|
||||
import DEFAULT_WORDLIST from './bip39-en';
|
||||
|
||||
describe('wordlist', (): void => {
|
||||
@@ -12,3 +13,13 @@ describe('wordlist', (): void => {
|
||||
expect(DEFAULT_WORDLIST.some((n) => !n.length || n.trim() !== n)).toEqual(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('bip39', (): void => {
|
||||
it('has a two-way entropy <-> mnemonic', (): void => {
|
||||
const m = 'seed sock milk update focus rotate barely fade car face mechanic mercy';
|
||||
|
||||
expect(
|
||||
entropyToMnemonic(mnemonicToEntropy(m))
|
||||
).toEqual(m);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
// - Remove mnemonicToSeed (we only use the sync variant)
|
||||
// - generateMnemonic takes number of words (instead of strength)
|
||||
|
||||
import { assert, stringToU8a, u8aToU8a } from '@polkadot/util';
|
||||
import { stringToU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { pbkdf2Encode } from '../pbkdf2';
|
||||
import { randomAsU8a } from '../random';
|
||||
@@ -53,14 +53,18 @@ export function mnemonicToSeedSync (mnemonic: string, password?: string): Uint8A
|
||||
export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
||||
const words = normalize(mnemonic).split(' ');
|
||||
|
||||
assert(words.length % 3 === 0, INVALID_MNEMONIC);
|
||||
if (words.length % 3 !== 0) {
|
||||
throw new Error(INVALID_MNEMONIC);
|
||||
}
|
||||
|
||||
// convert word indices to 11 bit binary strings
|
||||
const bits = words
|
||||
.map((word): string => {
|
||||
const index = DEFAULT_WORDLIST.indexOf(word);
|
||||
|
||||
assert(index !== -1, INVALID_MNEMONIC);
|
||||
if (index === -1) {
|
||||
throw new Error(INVALID_MNEMONIC);
|
||||
}
|
||||
|
||||
return index.toString(2).padStart(11, '0');
|
||||
})
|
||||
@@ -72,30 +76,36 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
|
||||
const checksumBits = bits.slice(dividerIndex);
|
||||
|
||||
// calculate the checksum and compare
|
||||
const entropyBytes = entropyBits.match(/(.{1,8})/g)?.map(binaryToByte);
|
||||
const matched = entropyBits.match(/(.{1,8})/g);
|
||||
const entropyBytes = matched && matched.map(binaryToByte);
|
||||
|
||||
assert(entropyBytes && (entropyBytes.length % 4 === 0) && (entropyBytes.length >= 16) && (entropyBytes.length <= 32), INVALID_ENTROPY);
|
||||
if (!entropyBytes || (entropyBytes.length % 4 !== 0) || (entropyBytes.length < 16) || (entropyBytes.length > 32)) {
|
||||
throw new Error(INVALID_ENTROPY);
|
||||
}
|
||||
|
||||
const entropy = u8aToU8a(entropyBytes);
|
||||
const newChecksum = deriveChecksumBits(entropy);
|
||||
|
||||
assert(newChecksum === checksumBits, INVALID_CHECKSUM);
|
||||
if (deriveChecksumBits(entropy) !== checksumBits) {
|
||||
throw new Error(INVALID_CHECKSUM);
|
||||
}
|
||||
|
||||
return entropy;
|
||||
}
|
||||
|
||||
export function entropyToMnemonic (entropy: Uint8Array): string {
|
||||
// 128 <= ENT <= 256
|
||||
assert((entropy.length % 4 === 0) && (entropy.length >= 16) && (entropy.length <= 32), INVALID_ENTROPY);
|
||||
if ((entropy.length % 4 !== 0) || (entropy.length < 16) || (entropy.length > 32)) {
|
||||
throw new Error(INVALID_ENTROPY);
|
||||
}
|
||||
|
||||
const entropyBits = bytesToBinary(Array.from(entropy));
|
||||
const checksumBits = deriveChecksumBits(entropy);
|
||||
const matched = `${bytesToBinary(Array.from(entropy))}${deriveChecksumBits(entropy)}`.match(/(.{1,11})/g);
|
||||
const mapped = matched && matched.map((binary) => DEFAULT_WORDLIST[binaryToByte(binary)]);
|
||||
|
||||
// we just set it prior, so this is a safe check
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
return (entropyBits + checksumBits).match(/(.{1,11})/g)!
|
||||
.map((binary) => DEFAULT_WORDLIST[binaryToByte(binary)])
|
||||
.join(' ');
|
||||
if (!mapped || (mapped.length < 12)) {
|
||||
throw new Error('Unable to map entropy to mnemonic');
|
||||
}
|
||||
|
||||
return mapped.join(' ');
|
||||
}
|
||||
|
||||
export function generateMnemonic (numWords: 12 | 15 | 18 | 21 | 24): string {
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -10,21 +10,23 @@ describe('xxhashAsHex', (): void => {
|
||||
await waitReady();
|
||||
});
|
||||
|
||||
it('returns a 64-bit value by default', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc')
|
||||
).toEqual('0x990977adf52cbc44');
|
||||
});
|
||||
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
|
||||
it('returns a 64-bit value by default', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc', undefined, onlyJs)
|
||||
).toEqual('0x990977adf52cbc44');
|
||||
});
|
||||
|
||||
it('returns a 128-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc', 128)
|
||||
).toEqual('0x990977adf52cbc440889329981caa9be');
|
||||
});
|
||||
it('returns a 128-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc', 128, onlyJs)
|
||||
).toEqual('0x990977adf52cbc440889329981caa9be');
|
||||
});
|
||||
|
||||
it('returns a 256-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc', 256)
|
||||
).toEqual('0x990977adf52cbc440889329981caa9bef7da5770b2b8a05303b75d95360dd62b');
|
||||
it('returns a 256-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
xxhashAsHex('abc', 256, onlyJs)
|
||||
).toEqual('0x990977adf52cbc440889329981caa9bef7da5770b2b8a05303b75d95360dd62b');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -34,18 +34,18 @@
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-bigint": "10.1.1",
|
||||
"@polkadot/x-global": "10.1.1",
|
||||
"@polkadot/x-textdecoder": "10.1.1",
|
||||
"@polkadot/x-textencoder": "10.1.1",
|
||||
"@types/bn.js": "^5.1.0",
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-bigint": "10.1.8",
|
||||
"@polkadot/x-global": "10.1.8",
|
||||
"@polkadot/x-textdecoder": "10.1.8",
|
||||
"@polkadot/x-textencoder": "10.1.8",
|
||||
"@types/bn.js": "^5.1.1",
|
||||
"bn.js": "^5.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/x-randomvalues": "10.1.1"
|
||||
"@polkadot/x-randomvalues": "10.1.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,31 @@
|
||||
// Copyright 2017-2022 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { perf } from '../test/performance';
|
||||
import { arrayFlatten } from '.';
|
||||
|
||||
const PERF_ONE = [[1, 2, 3, 4, 5]];
|
||||
const PERF_MUL = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
|
||||
|
||||
describe('arrayFlatten', (): void => {
|
||||
it('flattens arrays', (): void => {
|
||||
expect(
|
||||
arrayFlatten([[0], [1, 2, 3], [4, 5], [6], [], [7, 8]])
|
||||
).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8]);
|
||||
});
|
||||
|
||||
it('flattens a single entry', (): void => {
|
||||
expect(
|
||||
arrayFlatten([[1, 2, 3, 4, 5]])
|
||||
).toEqual([1, 2, 3, 4, 5]);
|
||||
});
|
||||
|
||||
it('flattens an empty', (): void => {
|
||||
expect(
|
||||
arrayFlatten([])
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
perf('arrayFlatten (single)', 10_000_000, [[PERF_ONE]], arrayFlatten);
|
||||
perf('arrayFlatten (multi)', 700_000, [[PERF_MUL]], arrayFlatten);
|
||||
});
|
||||
|
||||
@@ -19,8 +19,10 @@
|
||||
* ```
|
||||
*/
|
||||
export function arrayFlatten <T> (arrays: readonly T[][]): T[] {
|
||||
// noop for the single-entry case
|
||||
if (arrays.length === 1) {
|
||||
// noop for the empty & single-entry case
|
||||
if (arrays.length === 0) {
|
||||
return [];
|
||||
} else if (arrays.length === 1) {
|
||||
return arrays[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -21,4 +21,10 @@ describe('isObject', (): void => {
|
||||
isObject(null)
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('returns false on bigint', (): void => {
|
||||
expect(
|
||||
isObject(123n)
|
||||
).toEqual(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -18,7 +18,7 @@ declare const process: { env: Record<string, string> };
|
||||
type ConsoleType = 'error' | 'log' | 'warn';
|
||||
type LogType = ConsoleType | 'debug';
|
||||
|
||||
const logTo = {
|
||||
const logTo = <const> {
|
||||
debug: 'log',
|
||||
error: 'error',
|
||||
log: 'log',
|
||||
@@ -72,7 +72,7 @@ function apply (log: LogType, type: string, values: Logger$Data, maxSize = -1):
|
||||
return apply(log, type, Array.isArray(fnResult) ? fnResult : [fnResult], maxSize);
|
||||
}
|
||||
|
||||
console[logTo[log] as 'log'](
|
||||
console[logTo[log]](
|
||||
formatDate(new Date()),
|
||||
type,
|
||||
...values
|
||||
|
||||
@@ -6,16 +6,21 @@
|
||||
* @description Defer the operation to the queue for evaluation on the next tick
|
||||
*/
|
||||
export function nextTick (onExec: () => unknown, onError?: (error: Error) => unknown): void {
|
||||
Promise
|
||||
.resolve()
|
||||
.then((): void => {
|
||||
onExec();
|
||||
})
|
||||
.catch((error): void => {
|
||||
if (onError) {
|
||||
onError(error as Error);
|
||||
} else {
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
// While Promise.resolve().then(...) would defer to the nextTick, this
|
||||
// actually does not play as nicely in browsers like the setTimeout(...)
|
||||
// approach. So the safer, though less optimal approach is the one taken here
|
||||
setTimeout((): void => {
|
||||
Promise
|
||||
.resolve()
|
||||
.then((): void => {
|
||||
onExec();
|
||||
})
|
||||
.catch((error: Error): void => {
|
||||
if (onError) {
|
||||
onError(error);
|
||||
} else {
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
"./shim.cjs"
|
||||
],
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/util": "10.1.1",
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/util": "10.1.8",
|
||||
"buffer-es6": "^4.9.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1",
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8",
|
||||
"@types/node-fetch": "^2.6.2",
|
||||
"node-fetch": "^3.2.9"
|
||||
"node-fetch": "^3.2.10"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9"
|
||||
"@babel/runtime": "^7.19.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-global', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-native": "^0.69.3"
|
||||
"@types/react-native": "^0.70.1"
|
||||
},
|
||||
"denoDependencies": {
|
||||
"crypto": "std@0.148.0/node/crypto.ts"
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8"
|
||||
},
|
||||
"denoDependencies": {
|
||||
"util": "std@0.148.0/node/util.ts"
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-textdecoder', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-textdecoder', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1"
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8"
|
||||
},
|
||||
"denoDependencies": {
|
||||
"util": "std@0.148.0/node/util.ts"
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-textencoder', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-textencoder', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"version": "10.1.1",
|
||||
"version": "10.1.8",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.9",
|
||||
"@polkadot/x-global": "10.1.1",
|
||||
"@babel/runtime": "^7.19.0",
|
||||
"@polkadot/x-global": "10.1.8",
|
||||
"@types/websocket": "^1.0.5",
|
||||
"websocket": "^1.0.34"
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Do not edit, auto-generated by @polkadot/dev
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-ws', path: 'auto', type: 'auto', version: '10.1.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-ws', path: 'auto', type: 'auto', version: '10.1.8' };
|
||||
|
||||
Reference in New Issue
Block a user