Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0cbb06a6da | ||
|
|
9992feaa7b | ||
|
|
bb968d51b0 | ||
|
|
b6001796d7 | ||
|
|
8ab9387076 | ||
|
|
f9fd0eeda3 | ||
|
|
f2cee9c33d | ||
|
|
a860b09638 | ||
|
|
be3e83f4e3 | ||
|
|
5788df3f57 | ||
|
|
ec286a57d1 | ||
|
|
655eb9f128 | ||
|
|
37d95fe314 | ||
|
|
830a2c69d8 | ||
|
|
ead94a4493 | ||
|
|
cff15f9027 | ||
|
|
13d7dcfef5 | ||
|
|
259bb1a0ca | ||
|
|
d0fb629217 | ||
|
|
ab55c37a33 | ||
|
|
93a0a194bc | ||
|
|
3df71c9943 | ||
|
|
4d4e3988ab | ||
|
|
1bfabae65b | ||
|
|
eb08291de2 | ||
|
|
d63d92e488 | ||
|
|
bd047063ef | ||
|
|
d725bf21ae | ||
|
|
f7699edaaf | ||
|
|
47501aee7a | ||
|
|
e4f526bdda | ||
|
|
29bf23cd18 | ||
|
|
39d6da414d | ||
|
|
e7233de48f | ||
|
|
255d6ef66c | ||
|
|
b41e27d7c3 | ||
|
|
e3c858ac01 | ||
|
|
014075c313 | ||
|
|
eb3e77c572 | ||
|
|
512ae89fea | ||
|
|
7f57d05281 | ||
|
|
5892f70c83 | ||
|
|
699f775141 | ||
|
|
a09e06898f | ||
|
|
565314ff5f | ||
|
|
bd669f333f | ||
|
|
829d8bc985 | ||
|
|
218dba5623 | ||
|
|
b8bf2fed0d | ||
|
|
d505dc1072 | ||
|
|
20148b05c4 | ||
|
|
2516309b93 | ||
|
|
92d3a2e208 | ||
|
|
286d7a036e | ||
|
|
4556822a8a | ||
|
|
be227926c8 | ||
|
|
42626a780c | ||
|
|
afd8a9610f | ||
|
|
393334409f | ||
|
|
0fb52a929d | ||
|
|
50b10e214c | ||
|
|
bbadfbebfa | ||
|
|
a52a6253b5 | ||
|
|
4ca010cc99 | ||
|
|
a136d938df | ||
|
|
132ba0128d | ||
|
|
6b705a9838 | ||
|
|
f3381b0aae | ||
|
|
ba086159ad | ||
|
|
3a98323e8b | ||
|
|
1de30914c2 | ||
|
|
984bb7c04f |
+1
-1
@@ -1,4 +1,4 @@
|
||||
6
|
||||
7
|
||||
|
||||
2.6.2
|
||||
2.12.2
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '15 2 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
repo-token: ${{ secrets.GH_PAT }}
|
||||
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.'
|
||||
stale-issue-label: 'stale'
|
||||
exempt-issue-labels: '-size-l,-size-m,-size-s,-size-xl,-size-xs,[bug]'
|
||||
days-before-stale: 21
|
||||
days-before-close: 7
|
||||
@@ -1,5 +1,47 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 6.6.1 May 29, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust HD path validation & replacement
|
||||
- Sync with Substrate ss58 registry
|
||||
|
||||
|
||||
## 6.5.1 May 22, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow hdLedger derivation with optional 25th word password
|
||||
- Sync with Substrate ss58 registry
|
||||
|
||||
|
||||
## 6.4.1 May 15, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Update genesis for HydraDx gen-3 (Thanks to https://github.com/jak-pan)
|
||||
- Allow Ethereum pair in keyring addAddress (Thanks to https://github.com/joelamouche)
|
||||
|
||||
Changes:
|
||||
|
||||
- Added additional double-byte ss58 tests
|
||||
- Aligned ss58 registry with Substrate
|
||||
- Add explicit log for deprecation of `setSS58Format`
|
||||
|
||||
|
||||
## 6.3.1 Apr 25, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Added `stringify` util to correctly handle `JSON.stringify` with `BigInt` values
|
||||
- Additional input asserts for non-convertible values in `u8aToU8a`
|
||||
- Adapt `@polkadot/x-global` to return `globalThis` as available
|
||||
- Minor readability cleanups
|
||||
- BN manipulation via in-place shifts (as applicable)
|
||||
- Add explicit `engines` config to `package.json`
|
||||
|
||||
|
||||
## 6.2.1 Apr 18, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
+5
-5
@@ -21,10 +21,10 @@
|
||||
"test:one": "polkadot-dev-run-test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.13.15",
|
||||
"@polkadot/dev": "^0.62.8",
|
||||
"@polkadot/ts": "^0.3.62",
|
||||
"@types/jest": "^26.0.22"
|
||||
"@babel/core": "^7.14.3",
|
||||
"@polkadot/dev": "^0.62.20",
|
||||
"@polkadot/ts": "^0.3.69",
|
||||
"@types/jest": "^26.0.23"
|
||||
},
|
||||
"version": "6.2.1"
|
||||
"version": "6.6.1"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/hw-ledger-transports",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
@@ -11,15 +11,18 @@
|
||||
"browser": "browser.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@ledgerhq/hw-transport-webusb": "^5.49.0"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@ledgerhq/hw-transport-webusb": "^5.51.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/ledgerhq__hw-transport-node-hid": "^4.22.2",
|
||||
"@types/ledgerhq__hw-transport-webusb": "^4.70.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^5.49.0"
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^5.51.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '6.6.1' };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/hw-ledger",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
@@ -12,10 +12,13 @@
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/hw-ledger-transports": "6.2.1",
|
||||
"@polkadot/util": "^6.2.1",
|
||||
"@zondax/ledger-polkadot": "^0.13.6"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/hw-ledger-transports": "6.6.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@zondax/ledger-polkadot": "^0.14.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,13 +4,14 @@
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { SubstrateApp } from '@zondax/ledger-polkadot';
|
||||
|
||||
import { newDockApp, newKusamaApp, newPolkadotApp, newPolymeshApp } from '@zondax/ledger-polkadot';
|
||||
import { newDockApp, newEquilibriumApp, newKusamaApp, newPolkadotApp, newPolymeshApp } from '@zondax/ledger-polkadot';
|
||||
|
||||
// These match up with the network keys in the @polkadot/networks package
|
||||
// (which is turn aligns with the substrate/ss58-registry.json as the single
|
||||
// source of truth)
|
||||
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
'dock-mainnet': newDockApp,
|
||||
equilibrium: newEquilibriumApp,
|
||||
kusama: newKusamaApp,
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp
|
||||
|
||||
@@ -28,8 +28,8 @@ export class Ledger {
|
||||
|
||||
constructor (transport: LedgerTypes, chain: Chain) {
|
||||
// u2f is deprecated
|
||||
assert(['hid', 'webusb'].includes(transport), `Unsupported transport ${transport}`);
|
||||
assert(Object.keys(ledgerApps).includes(chain), `Unsupported chain ${chain}`);
|
||||
assert(['hid', 'webusb'].includes(transport), () => `Unsupported transport ${transport}`);
|
||||
assert(Object.keys(ledgerApps).includes(chain), () => `Unsupported chain ${chain}`);
|
||||
|
||||
this.#chain = chain;
|
||||
this.#transport = transport;
|
||||
@@ -73,7 +73,7 @@ export class Ledger {
|
||||
if (!this.#app) {
|
||||
const def = transports.find(({ type }) => type === this.#transport);
|
||||
|
||||
assert(def, `Unable to find a transport for ${this.#transport}`);
|
||||
assert(def, () => `Unable to find a transport for ${this.#transport}`);
|
||||
|
||||
const transport = await def.create();
|
||||
|
||||
@@ -98,7 +98,7 @@ export class Ledger {
|
||||
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
|
||||
const result = await promise;
|
||||
|
||||
assert(result.return_code === LEDGER_SUCCESS_CODE, result.error_message);
|
||||
assert(result.return_code === LEDGER_SUCCESS_CODE, () => result.error_message);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/hw-ledger', version: '6.6.1' };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/keyring",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "Keyring management",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
@@ -12,16 +12,19 @@
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"repository": "github:polkadot-js/common",
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/util": "6.2.1",
|
||||
"@polkadot/util-crypto": "6.2.1"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/util": "6.6.1",
|
||||
"@polkadot/util-crypto": "6.6.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "6.2.1",
|
||||
"@polkadot/util-crypto": "6.2.1"
|
||||
"@polkadot/util": "6.6.1",
|
||||
"@polkadot/util-crypto": "6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,6 +121,14 @@ describe('keypair', (): void => {
|
||||
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
|
||||
});
|
||||
|
||||
it('creates via dev seed (2-byte encoding)', (): void => {
|
||||
keyring.setSS58Format(252);
|
||||
|
||||
expect(
|
||||
keyring.addFromUri('//Alice').address
|
||||
).toEqual('xw8P6urbSAronL3zZFB7dg8p7LLSgKCUFDUgjohnf1iP434ic');
|
||||
});
|
||||
|
||||
it('adds the pair', (): void => {
|
||||
expect(
|
||||
keyring.addFromSeed(seedTwo, {}).publicKey
|
||||
@@ -311,6 +319,7 @@ describe('keypair', (): void => {
|
||||
const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy' + '/m/44\'/60\'/0\'/0/0';
|
||||
const PRIV_KEY_ONE = '0x070dc3117300011918e26b02176945cc15c3d548cf49fd8418d97f93af699e46';
|
||||
const ETH_ADDRESS_ONE = '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d';
|
||||
const ETH_ADDRESS_TWO = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
|
||||
|
||||
let keyring: Keyring;
|
||||
|
||||
@@ -388,13 +397,13 @@ describe('keypair', (): void => {
|
||||
);
|
||||
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
|
||||
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
expect(pair.address).toEqual(ETH_ADDRESS_TWO);
|
||||
|
||||
pair.decodePkcs8('password');
|
||||
|
||||
expect(pair.isLocked).toBe(false);
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
|
||||
expect(pair.address).toBe('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
expect(pair.address).toBe(ETH_ADDRESS_TWO);
|
||||
});
|
||||
|
||||
it('allows for signing/verification', (): void => {
|
||||
|
||||
@@ -47,7 +47,7 @@ export class Keyring implements KeyringInstance {
|
||||
constructor (options: KeyringOptions = {}) {
|
||||
options.type = options.type || 'ed25519';
|
||||
|
||||
assert(options && ['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type}`);
|
||||
assert(['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), () => `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
|
||||
|
||||
this.#pairs = new Pairs();
|
||||
this.#ss58 = options.ss58Format;
|
||||
@@ -86,7 +86,7 @@ export class Keyring implements KeyringInstance {
|
||||
/**
|
||||
* @name addFromAddress
|
||||
* @summary Stores an account, given an account address, as a Key/Value (public key, pair) in Keyring Pair Dictionary
|
||||
* @description Allows user to explicitely provide separate inputs including account address or public key, and optionally
|
||||
* @description Allows user to explicitly provide separate inputs including account address or public key, and optionally
|
||||
* the associated account metadata, and the default encoded value as arguments (that may be obtained from the json file
|
||||
* of an account backup), and then generates a keyring pair from them that it passes to
|
||||
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
|
||||
@@ -168,7 +168,7 @@ export class Keyring implements KeyringInstance {
|
||||
? [type]
|
||||
: type;
|
||||
|
||||
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), `Unknown crypto type ${cryptoType}`);
|
||||
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), () => `Unknown crypto type ${cryptoType}`);
|
||||
|
||||
// Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs
|
||||
const publicKey = isHex(address)
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/keyring', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/keyring', version: '6.6.1' };
|
||||
|
||||
@@ -10,6 +10,8 @@ import { createPair } from '.';
|
||||
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
const TEST_ADDRESS = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
|
||||
|
||||
describe('pair', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
await cryptoWaitReady();
|
||||
@@ -159,8 +161,15 @@ describe('pair', (): void => {
|
||||
it('has a valid address from a known public', (): void => {
|
||||
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') });
|
||||
|
||||
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
expect(pair.addressRaw).toEqual(hexToU8a('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887'));
|
||||
expect(pair.address).toEqual(TEST_ADDRESS);
|
||||
expect(pair.addressRaw).toEqual(hexToU8a(TEST_ADDRESS));
|
||||
});
|
||||
|
||||
it('has a valid address from a known ethereum address (20 length)', (): void => {
|
||||
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: new Uint8Array([75, 32, 205, 127, 248, 119, 52, 31, 46, 171, 170, 23, 158, 23, 46, 108, 95, 180, 186, 168]), secretKey: new Uint8Array([]) });
|
||||
|
||||
expect(pair.address.toLowerCase()).toEqual('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8');
|
||||
expect(pair.addressRaw).toEqual(hexToU8a('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8'));
|
||||
});
|
||||
|
||||
it('converts to json', (): void => {
|
||||
|
||||
@@ -44,7 +44,7 @@ const TYPE_SIGNATURE = {
|
||||
const TYPE_ADDRESS = {
|
||||
ecdsa: (p: Uint8Array) => p.length > 32 ? blake2AsU8a(p) : p,
|
||||
ed25519: (p: Uint8Array) => p,
|
||||
ethereum: (p: Uint8Array) => keccakAsU8a(secp256k1Expand(p)),
|
||||
ethereum: (p: Uint8Array) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),
|
||||
sr25519: (p: Uint8Array) => p
|
||||
};
|
||||
|
||||
|
||||
@@ -24,13 +24,11 @@ export class Pairs implements KeyringPairs {
|
||||
public get (address: string | Uint8Array): KeyringPair {
|
||||
const pair = this.#map[decodeAddress(address).toString()];
|
||||
|
||||
assert(pair, (): string => {
|
||||
const formatted: string = isU8a(address) || isHex(address)
|
||||
assert(pair, () => `Unable to retrieve keypair '${
|
||||
isU8a(address) || isHex(address)
|
||||
? u8aToHex(u8aToU8a(address))
|
||||
: address;
|
||||
|
||||
return `Unable to retrieve keypair '${formatted}'`;
|
||||
});
|
||||
: address
|
||||
}'`);
|
||||
|
||||
return pair;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ import { cryptoWaitReady } from '@polkadot/util-crypto';
|
||||
import { createTestPairs } from './testingPairs';
|
||||
import Keyring from '.';
|
||||
|
||||
const TEST_ADD = '0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac';
|
||||
|
||||
describe('testingPairs', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
await cryptoWaitReady();
|
||||
@@ -33,7 +35,7 @@ describe('testingPairs', (): void => {
|
||||
it('has the correct address for Alith (Eth)', (): void => {
|
||||
expect(
|
||||
createTestPairs({ type: 'ethereum' }).Alith.address
|
||||
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
|
||||
).toEqual(TEST_ADD);
|
||||
});
|
||||
|
||||
it('has the correct address for Alith (Eth), same as obtained by createFromUri', (): void => {
|
||||
@@ -42,7 +44,7 @@ describe('testingPairs', (): void => {
|
||||
|
||||
expect(
|
||||
pair && pair.address
|
||||
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
|
||||
).toEqual(TEST_ADD);
|
||||
});
|
||||
|
||||
it('checks eth test addresses', (): void => {
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
{
|
||||
"name": "@polkadot/networks",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A list of all available Substrate networks and their applicable prefixes",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
@@ -13,10 +16,10 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10"
|
||||
"@babel/runtime": "^7.14.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/util": "6.2.1",
|
||||
"@polkadot/x-fetch": "6.2.1"
|
||||
"@polkadot/util": "6.6.1",
|
||||
"@polkadot/x-fetch": "6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Ss58Registry } from './types';
|
||||
import type { KnownSubstrate, Ss58Registry } from './types';
|
||||
|
||||
import fs from 'fs';
|
||||
|
||||
import { stringify } from '@polkadot/util';
|
||||
import { fetch } from '@polkadot/x-fetch';
|
||||
|
||||
import { all } from './';
|
||||
@@ -39,7 +40,7 @@ describe('check latest Substrate ss58 registry', (): void => {
|
||||
.filter(({ prefix }) => !all.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Missing entries found: ${JSON.stringify(missing, null, 2)}`);
|
||||
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has no extra entries', (): void => {
|
||||
@@ -47,11 +48,11 @@ describe('check latest Substrate ss58 registry', (): void => {
|
||||
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Extra entries found: ${JSON.stringify(missing, null, 2)}`);
|
||||
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
|
||||
});
|
||||
|
||||
it('has the same values as the original', (): void => {
|
||||
const fields = Object.keys(original.schema);
|
||||
const fields = Object.keys(original.schema) as (keyof KnownSubstrate)[];
|
||||
const errors = original.registry
|
||||
.map((n): [string, string[]] => {
|
||||
const other = all.find(({ prefix }) => prefix === n.prefix);
|
||||
@@ -59,14 +60,12 @@ describe('check latest Substrate ss58 registry', (): void => {
|
||||
return [
|
||||
`${n.displayName} (${n.prefix})`,
|
||||
other
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
? fields.filter((f) => JSON.stringify(n[f]) !== JSON.stringify(other[f]))
|
||||
? fields.filter((f) => stringify(n[f]) !== stringify(other[f]))
|
||||
: []
|
||||
];
|
||||
})
|
||||
.filter(([, fields]) => fields.length);
|
||||
|
||||
assertAndLog(!errors.length, `Mismatches found: ${JSON.stringify(errors.map(([name, m]) => `${name}:: ${m.join(', ')}`), null, 2)}`);
|
||||
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,9 +14,14 @@ export const knownGenesis: KnownGenesis = {
|
||||
edgeware: [
|
||||
'0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
|
||||
],
|
||||
equilibrium: [
|
||||
'0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
|
||||
],
|
||||
hydradx: [
|
||||
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047',
|
||||
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2'
|
||||
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
|
||||
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
|
||||
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
|
||||
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
|
||||
],
|
||||
kulupu: [
|
||||
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
|
||||
@@ -49,12 +54,13 @@ export const knownIcon: KnownIcon = {
|
||||
// support for ledger
|
||||
export const knownLedger: KnownLedger = {
|
||||
'dock-mainnet': 0x00000252,
|
||||
equilibrium: 0x05f5e0fd,
|
||||
kusama: 0x000001b2,
|
||||
polkadot: 0x00000162,
|
||||
polymesh: 0x00000253
|
||||
};
|
||||
|
||||
// testenets should not allow selection
|
||||
// testnets should not allow selection
|
||||
export const knownTestnet: KnownTestnet = {
|
||||
'dock-testnet': true,
|
||||
jupiter: true,
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/networks', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/networks', version: '6.6.1' };
|
||||
|
||||
@@ -84,13 +84,13 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
website: 'https://edgewa.re'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Acala Karura Canary',
|
||||
decimals: [12],
|
||||
displayName: 'Karura',
|
||||
network: 'karura',
|
||||
prefix: 8,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KAR'],
|
||||
website: 'https://acala.network/'
|
||||
website: 'https://karura.network/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
@@ -102,7 +102,7 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
website: 'http://laminar.network/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
decimals: [12],
|
||||
displayName: 'Acala',
|
||||
network: 'acala',
|
||||
prefix: 10,
|
||||
@@ -254,15 +254,6 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['jDOT'],
|
||||
website: 'https://jupiter.patract.io'
|
||||
},
|
||||
{
|
||||
decimals: [10, 12],
|
||||
displayName: 'Patract',
|
||||
network: 'patract',
|
||||
prefix: 27,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['pDOT', 'pKSM'],
|
||||
website: 'https://patract.network'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Subsocial',
|
||||
@@ -479,6 +470,15 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['CRU'],
|
||||
website: 'https://crust.network'
|
||||
},
|
||||
{
|
||||
decimals: [0, 9, 9, 9, 9, 9, 9, 9],
|
||||
displayName: 'Equilibrium Network',
|
||||
network: 'equilibrium',
|
||||
prefix: 67,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['Unknown', 'USD', 'EQ', 'ETH', 'BTC', 'EOS', 'DOT', 'CRV'],
|
||||
website: 'https://equilibrium.io'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'SORA Network',
|
||||
@@ -488,6 +488,24 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
symbols: ['XOR'],
|
||||
website: 'https://sora.org'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Manta network',
|
||||
network: 'manta',
|
||||
prefix: 77,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['MA'],
|
||||
website: 'https://manta.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Calamari: Manta Canary Network',
|
||||
network: 'calamari',
|
||||
prefix: 78,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KMA'],
|
||||
website: 'https://manta.network'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Social Network',
|
||||
@@ -496,5 +514,14 @@ export const knownSubstrate: KnownSubstrate[] = [
|
||||
standardAccount: '*25519',
|
||||
symbols: ['NET'],
|
||||
website: 'https://social.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Basilisk',
|
||||
network: 'basilisk',
|
||||
prefix: 10041,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['BSX'],
|
||||
website: 'https://bsx.fi'
|
||||
}
|
||||
];
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/util-crypto",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A collection of useful crypto utilities for @polkadot",
|
||||
"main": "index.js",
|
||||
@@ -8,6 +8,9 @@
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -16,11 +19,11 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util-crypto#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/networks": "6.2.1",
|
||||
"@polkadot/util": "6.2.1",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/networks": "6.6.1",
|
||||
"@polkadot/util": "6.6.1",
|
||||
"@polkadot/wasm-crypto": "^4.0.2",
|
||||
"@polkadot/x-randomvalues": "6.2.1",
|
||||
"@polkadot/x-randomvalues": "6.6.1",
|
||||
"base-x": "^3.0.8",
|
||||
"base64-js": "^1.5.1",
|
||||
"blakejs": "^1.1.0",
|
||||
@@ -41,6 +44,6 @@
|
||||
"@types/xxhashjs": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "6.2.1"
|
||||
"@polkadot/util": "6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,18 @@ describe('checkAddressChecksum', (): void => {
|
||||
).toEqual([true, 34, 2, 66]);
|
||||
});
|
||||
|
||||
it('correctly extracts the info from a 2-byte-prefix address (69)', (): void => {
|
||||
expect(
|
||||
checkAddressChecksum(base58Decode('cnVvyMzRdqjwejTFuByQQ4w2yu78V2hpFixjHQz5zr6NSYsxA'))
|
||||
).toEqual([true, 34, 2, 69]);
|
||||
});
|
||||
|
||||
it('correctly extracts the info from a 2-byte-prefix address (252)', (): void => {
|
||||
expect(
|
||||
checkAddressChecksum(base58Decode('xw8Ffc2SZtDqUJKd9Ky4vc7PRz2D2asuVkEEzf3WGAbw9cnfq'))
|
||||
).toEqual([true, 34, 2, 252]);
|
||||
});
|
||||
|
||||
it('correctly extracts the info from a 2-byte-prefix address (255)', (): void => {
|
||||
expect(
|
||||
checkAddressChecksum(base58Decode('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k'))
|
||||
|
||||
@@ -89,6 +89,22 @@ describe('decodeAddress', (): void => {
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (69)', (): void => {
|
||||
expect(
|
||||
decodeAddress('cnUaoo5wodnTVA4bnr4woSweto8hWZADUvLFXkR9Q6U7BRsbF')
|
||||
).toEqual(
|
||||
hexToU8a('0x88eafe0305d460d1695cf34c2f786050df8e40d215e488790cc70929c9e8316d')
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (252)', (): void => {
|
||||
expect(
|
||||
decodeAddress('xw9Hca4RJTmBRgzJT4ieJBh7XCK9gE3NXBDSEmgGHd4TCrbnG')
|
||||
).toEqual(
|
||||
hexToU8a('0xfc422da6c3bc6dfa2a436a506428072941662f816987baaa8914e02ff5947f4b')
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes a 2-byte prefix (255)', (): void => {
|
||||
expect(
|
||||
decodeAddress('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k')
|
||||
@@ -103,12 +119,6 @@ describe('decodeAddress', (): void => {
|
||||
).toEqual('0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9');
|
||||
});
|
||||
|
||||
it.skip('allows invalid prefix (in list)', (): void => {
|
||||
expect(
|
||||
(): Uint8Array => decodeAddress('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
|
||||
).toThrow(/address prefix/);
|
||||
});
|
||||
|
||||
it('fails when length is invalid', (): void => {
|
||||
expect(
|
||||
(): Uint8Array => decodeAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
|
||||
|
||||
@@ -25,7 +25,7 @@ export function decodeAddress (encoded?: string | Uint8Array | null, ignoreCheck
|
||||
const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
|
||||
|
||||
assert(ignoreChecksum || isValid, 'Invalid decoded address checksum');
|
||||
assert([-1, ss58Decoded].includes(ss58Format), `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
|
||||
assert([-1, ss58Decoded].includes(ss58Format), () => `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
|
||||
|
||||
return decoded.slice(ss58Length, endPos);
|
||||
} catch (error) {
|
||||
|
||||
@@ -26,12 +26,24 @@ const SUBKEY = [
|
||||
publicKey: '0x04a047d52fe542484c69bc528990cfeaf3a663dded0638ee1b51cf78bacd1072',
|
||||
ss58Format: 66
|
||||
},
|
||||
{
|
||||
// sora
|
||||
address: 'cnVRwXfAnz3RSVQyBUC8f8McrK3YBX2QYd4WoctpeSC6VTJYm',
|
||||
publicKey: '0xae640d53cfa815f4a6a50ae70235cd7d9d134d0f1c3a4ccd118e321dfb6ab51f',
|
||||
ss58Format: 69
|
||||
},
|
||||
{
|
||||
// ecdsa
|
||||
address: '4pbsSkWcBaYoFHrKJZp5fDVUKbqSYD9dhZZGvpp3vQ5ysVs5ybV',
|
||||
publicKey: '0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9',
|
||||
ss58Format: 200
|
||||
},
|
||||
{
|
||||
// social-network
|
||||
address: 'xw5g1Eec8LT99pZLZMaTWwrwvNtfM6vrSuZeVbtEszCDUwByg',
|
||||
publicKey: '0x5c64f1151f0ce4358c27238fb20c88e7c899825436f565410724c8c2c5add869',
|
||||
ss58Format: 252
|
||||
},
|
||||
{
|
||||
address: 'yGF4JP7q5AK46d1FPCEm9sYQ4KooSjHMpyVAjLnsCSWVafPnf',
|
||||
publicKey: '0x66cd6cf085627d6c85af1aaf2bd10cf843033e929b4e3b1c2ba8e4aa46fe111b',
|
||||
|
||||
@@ -11,27 +11,27 @@ import { decodeAddress } from './decode';
|
||||
import { defaults } from './defaults';
|
||||
import { sshash } from './sshash';
|
||||
|
||||
export function encodeAddress (_key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
|
||||
export function encodeAddress (key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
|
||||
// decode it, this means we can re-encode an address
|
||||
const key = decodeAddress(_key);
|
||||
const u8a = decodeAddress(key);
|
||||
|
||||
assert(ss58Format >= 0 && ss58Format <= 16383 && ![46, 47].includes(ss58Format), 'Out of range ss58Format specified');
|
||||
assert(defaults.allowedDecodedLengths.includes(key.length), `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
||||
assert(defaults.allowedDecodedLengths.includes(u8a.length), () => `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
||||
|
||||
const isPublicKey = [32, 33].includes(key.length);
|
||||
const input = u8aConcat(
|
||||
new Uint8Array(
|
||||
ss58Format < 64
|
||||
? [ss58Format]
|
||||
: [
|
||||
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
|
||||
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
|
||||
]
|
||||
),
|
||||
key
|
||||
ss58Format < 64
|
||||
? [ss58Format]
|
||||
: [
|
||||
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
|
||||
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
|
||||
],
|
||||
u8a
|
||||
);
|
||||
|
||||
return base58Encode(
|
||||
u8aConcat(input, sshash(input).subarray(0, isPublicKey ? 2 : 1))
|
||||
u8aConcat(
|
||||
input,
|
||||
sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,12 +3,18 @@
|
||||
|
||||
import type { Prefix } from './types';
|
||||
|
||||
import { logger } from '@polkadot/util';
|
||||
|
||||
import { defaults } from './defaults';
|
||||
|
||||
const l = logger('setSS58Format');
|
||||
|
||||
/**
|
||||
* @description Sets the global SS58 format to use for address encoding
|
||||
* @deprecated Use keyring.setSS58Format
|
||||
*/
|
||||
export function setSS58Format (prefix: Prefix): void {
|
||||
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as pat of the address encode function');
|
||||
|
||||
defaults.prefix = prefix;
|
||||
}
|
||||
|
||||
@@ -14,11 +14,11 @@ interface CheckConfig {
|
||||
const BASE_CONFIG = { alphabet: BASE58_ALPHABET, ipfsChar: 'z', type: 'base58' };
|
||||
|
||||
export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?: string | null, ipfsCompat?: boolean): true {
|
||||
assert(value, `Expected non-null, non-empty ${type} input`);
|
||||
assert(!ipfsCompat || value[0] === ipfsChar, `Expected ${type} to start with '${ipfsChar}'`);
|
||||
assert(value, () => `Expected non-null, non-empty ${type} input`);
|
||||
assert(!ipfsCompat || value[0] === ipfsChar, () => `Expected ${type} to start with '${ipfsChar}'`);
|
||||
|
||||
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
|
||||
assert(alphabet.includes(value[i]), `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
|
||||
assert(alphabet.includes(value[i]), () => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -7,6 +7,7 @@ import { hdLedger } from '..';
|
||||
|
||||
const MNE_0 = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
|
||||
const MNE_1 = 'open jelly jeans corn ketchup supreme brief element armed lens vault weather original scissors rug priority vicious lesson raven spot gossip powder person volcano';
|
||||
const MNE_P = `${MNE_1} testing`;
|
||||
|
||||
const TESTS = {
|
||||
Kusama: {
|
||||
@@ -36,6 +37,11 @@ const TESTS = {
|
||||
ed25519: '0xe8c68348586d53e4e8d1a864b0e4e17c75e4eb06e0c63c1432bef2ba29e69d41',
|
||||
index: [0, 0],
|
||||
mnemonic: MNE_0
|
||||
},
|
||||
{
|
||||
ed25519: '0x3890e8db837eba3f8f25215c753e1091062298ce671a51441e7ef89a7adc4f48',
|
||||
index: [0, 0],
|
||||
mnemonic: MNE_P
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -11,7 +11,18 @@ import { HARDENED, hdValidatePath } from '../validatePath';
|
||||
import { ledgerDerivePrivate } from './derivePrivate';
|
||||
import { ledgerMaster } from './master';
|
||||
|
||||
export function hdLedger (mnemonic: string, path: string): Keypair {
|
||||
export function hdLedger (_mnemonic: string, path: string): Keypair {
|
||||
const parts = _mnemonic
|
||||
.split(' ')
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s);
|
||||
|
||||
assert([12, 24, 25].includes(parts.length), 'Expected a mnemonic with 24 words (or 25 including a password)');
|
||||
|
||||
const [mnemonic, password] = parts.length === 25
|
||||
? [parts.slice(0, 24).join(' '), parts[24]]
|
||||
: [parts.join(' '), ''];
|
||||
|
||||
assert(mnemonicValidate(mnemonic), 'Invalid mnemonic passed to ledger derivation');
|
||||
assert(hdValidatePath(path), 'Invalid derivation path');
|
||||
|
||||
@@ -19,9 +30,9 @@ export function hdLedger (mnemonic: string, path: string): Keypair {
|
||||
path
|
||||
.split('/')
|
||||
.slice(1)
|
||||
.map((n) => parseInt(n.replace("'", ''), 10))
|
||||
.map((n) => parseInt(n.replace(/'$/, ''), 10))
|
||||
.map((n) => (n < HARDENED) ? (n + HARDENED) : n)
|
||||
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic))
|
||||
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic, password))
|
||||
.slice(0, 32)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@ import { mnemonicToSeedSync } from '../../mnemonic/bip39';
|
||||
const ED25519_CRYPTO = 'ed25519 seed';
|
||||
|
||||
// gets an xprv from a mnemonic
|
||||
export function ledgerMaster (mnemonic: string): Uint8Array {
|
||||
const seed = mnemonicToSeedSync(mnemonic);
|
||||
export function ledgerMaster (mnemonic: string, password?: string): Uint8Array {
|
||||
const seed = mnemonicToSeedSync(mnemonic, password);
|
||||
const chainCode = hmacSha256(ED25519_CRYPTO, new Uint8Array([1, ...seed]));
|
||||
let priv;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ export function hdValidatePath (path: string): boolean {
|
||||
|
||||
return parts.every((n) => /^\d+'?$/.test(n)) && (
|
||||
!parts
|
||||
.map((n) => parseInt(n.replace("'", ''), 10))
|
||||
.map((n) => parseInt(n.replace(/'$/, ''), 10))
|
||||
.some((n) => isNaN(n) || (n >= HARDENED) || (n < 0))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ 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 encypted data');
|
||||
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encrypted data');
|
||||
|
||||
let encoded: Uint8Array | null = encrypted;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ export function keyExtractPath (derivePath: string): ExtractResult {
|
||||
});
|
||||
}
|
||||
|
||||
assert(constructed === derivePath, `Re-constructed path "${constructed}" does not match input`);
|
||||
assert(constructed === derivePath, () => `Re-constructed path "${constructed}" does not match input`);
|
||||
|
||||
return {
|
||||
parts,
|
||||
|
||||
@@ -26,7 +26,7 @@ import { mnemonicValidate } from './validate';
|
||||
*/
|
||||
export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs = false, byteLength: 32 | 64 = 32): Uint8Array {
|
||||
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
|
||||
assert([32, 64].includes(byteLength), `Invalid seed length ${byteLength}, expected 32 or 64`);
|
||||
assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`);
|
||||
|
||||
if (byteLength && byteLength === 32) {
|
||||
return isReady() && !onlyJs
|
||||
|
||||
@@ -25,8 +25,8 @@ export function naclVerify (message: Uint8Array | string, signature: Uint8Array
|
||||
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`);
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
|
||||
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
|
||||
return isReady() && !onlyJs
|
||||
? ed25519Verify(signatureU8a, messageU8a, publicKeyU8a)
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/util-crypto', version: '6.6.1' };
|
||||
|
||||
@@ -12,8 +12,8 @@ export function schnorrkelVerify (message: Uint8Array | string, signature: Uint8
|
||||
const publicKeyU8a = u8aToU8a(publicKey);
|
||||
const signatureU8a = u8aToU8a(signature);
|
||||
|
||||
assert(publicKeyU8a.length === 32, `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
assert(signatureU8a.length === 64, `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
||||
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
||||
|
||||
return sr25519Verify(signatureU8a, u8aToU8a(message), publicKeyU8a);
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ function verifyDetect (result: VerifyResult, { message, publicKey, signature }:
|
||||
}
|
||||
|
||||
function verifyMultisig (result: VerifyResult, { message, publicKey, signature }: VerifyInput): VerifyResult {
|
||||
assert([0, 1, 2].includes(signature[0]), `Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
|
||||
assert([0, 1, 2].includes(signature[0]), () => `Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
|
||||
|
||||
const type = CRYPTO_TYPES[signature[0]] || 'none';
|
||||
|
||||
@@ -77,7 +77,7 @@ function verifyMultisig (result: VerifyResult, { message, publicKey, signature }
|
||||
export function signatureVerify (message: Uint8Array | string, signature: Uint8Array | string, addressOrPublicKey: Uint8Array | string): VerifyResult {
|
||||
const signatureU8a = u8aToU8a(signature);
|
||||
|
||||
assert([64, 65, 66].includes(signatureU8a.length), `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
|
||||
assert([64, 65, 66].includes(signatureU8a.length), () => `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
|
||||
|
||||
const publicKey = decodeAddress(addressOrPublicKey);
|
||||
const input = { message, publicKey, signature: signatureU8a };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/util",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A collection of useful utilities for @polkadot",
|
||||
"main": "index.js",
|
||||
@@ -8,6 +8,9 @@
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.cjs"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -16,9 +19,9 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-textdecoder": "6.2.1",
|
||||
"@polkadot/x-textencoder": "6.2.1",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-textdecoder": "6.6.1",
|
||||
"@polkadot/x-textencoder": "6.6.1",
|
||||
"@types/bn.js": "^4.11.6",
|
||||
"bn.js": "^4.11.9",
|
||||
"camelcase": "^5.3.1",
|
||||
|
||||
@@ -22,6 +22,7 @@ import { isUndefined } from '../is/undefined';
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function arrayFilter <T = any> (array: T[], allowNulls = true): T[] {
|
||||
return array.filter((value) =>
|
||||
!isUndefined(value) && (allowNulls || !isNull(value))
|
||||
!isUndefined(value) &&
|
||||
(allowNulls || !isNull(value))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ import { assert } from '../assert';
|
||||
import { BN_MAX_INTEGER, BN_ONE, BN_ZERO } from '../bn';
|
||||
import { bnToBn } from './toBn';
|
||||
|
||||
const SQRT_MAX_SAFE_INTEGER = new BN(94906265);
|
||||
|
||||
/**
|
||||
* @name bnSqrt
|
||||
* @summary Calculates the integer square root of a BN
|
||||
@@ -35,7 +37,7 @@ export function bnSqrt <ExtToBn extends ToBn> (value: ExtToBn | BN | BigInt | st
|
||||
|
||||
// Use sqrt(MAX_SAFE_INTEGER) as starting point. since we already know the
|
||||
// output will be larger than this, we expect this to be a safe start
|
||||
let x0 = new BN(94906265);
|
||||
let x0 = SQRT_MAX_SAFE_INTEGER.clone();
|
||||
|
||||
while (true) {
|
||||
const x1 = n.div(x0).iadd(x0).ishrn(1);
|
||||
|
||||
@@ -10,14 +10,6 @@ import { isBigInt } from '../is/bigInt';
|
||||
import { isHex } from '../is/hex';
|
||||
import { isToBn } from '../is/toBn';
|
||||
|
||||
function numberToBn <ExtToBn extends ToBn> (value: number | ExtToBn | BN): BN {
|
||||
return BN.isBN(value)
|
||||
? value
|
||||
: isToBn(value)
|
||||
? value.toBn()
|
||||
: new BN(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name bnToBn
|
||||
* @summary Creates a BN value from a BN, BigInt, string (base 10 or hex) or number input.
|
||||
@@ -43,5 +35,9 @@ export function bnToBn <ExtToBn extends ToBn> (value?: ExtToBn | BN | BigInt | s
|
||||
return new BN(value.toString());
|
||||
}
|
||||
|
||||
return numberToBn(value);
|
||||
return BN.isBN(value)
|
||||
? value
|
||||
: isToBn(value)
|
||||
? value.toBn()
|
||||
: new BN(value);
|
||||
}
|
||||
|
||||
@@ -8,5 +8,5 @@ import { assert } from '../assert';
|
||||
export function checkMaxMin (type: 'max' | 'min', items: BN[]): BN {
|
||||
assert(items.length >= 1, 'Must provide one or more BN arguments');
|
||||
|
||||
return items.reduce((acc: BN, val: BN) => BN[type](acc, val), items[0]);
|
||||
return items.reduce<BN>((a, v) => BN[type](a, v), items[0]);
|
||||
}
|
||||
|
||||
@@ -15,25 +15,28 @@ describe('compactFromU8a', (): void => {
|
||||
|
||||
it('decodes from same u16 encoded value', (): void => {
|
||||
expect(
|
||||
compactFromU8a(new Uint8Array([0b11111101, 0b00000111]), 32)
|
||||
compactFromU8a(new Uint8Array([0b11111101, 0b00000111]))
|
||||
).toEqual([2, new BN(511)]);
|
||||
});
|
||||
|
||||
it('decodes from same u32 encoded value (short)', (): void => {
|
||||
expect(
|
||||
compactFromU8a(new Uint8Array([254, 255, 3, 0]), 32)
|
||||
).toEqual([4, new BN(0xffff)]);
|
||||
compactFromU8a(new Uint8Array([254, 255, 3, 0]))
|
||||
).toEqual(
|
||||
// since we use in-place, the words are different... HACK it
|
||||
[4, new BN(0xffff).ishln(16).ishrn(16)]
|
||||
);
|
||||
});
|
||||
|
||||
it('decodes from same u32 encoded value (full)', (): void => {
|
||||
expect(
|
||||
compactFromU8a(new Uint8Array([3, 249, 255, 255, 255]), 32)
|
||||
compactFromU8a(new Uint8Array([3, 249, 255, 255, 255]))
|
||||
).toEqual([5, new BN(0xfffffff9)]);
|
||||
});
|
||||
|
||||
it('decodes from same u32 as u64 encoded value (full, default)', (): void => {
|
||||
expect(
|
||||
compactFromU8a(new Uint8Array([3 + ((4 - 4) << 2), 249, 255, 255, 255]), 64)
|
||||
compactFromU8a(new Uint8Array([3 + ((4 - 4) << 2), 249, 255, 255, 255]))
|
||||
).toEqual([5, new BN(0xfffffff9)]);
|
||||
});
|
||||
|
||||
@@ -44,4 +47,12 @@ describe('compactFromU8a', (): void => {
|
||||
)
|
||||
).toEqual([7, new BN('5af3107a4000', 16)]);
|
||||
});
|
||||
|
||||
it('decodes an actual value', (): void => {
|
||||
expect(
|
||||
compactFromU8a(
|
||||
hexToU8a('0x0284d717')
|
||||
)[1].toString()
|
||||
).toEqual('100000000');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { BitLength } from './types';
|
||||
|
||||
import BN from 'bn.js';
|
||||
|
||||
import { BN_FOUR } from '../bn';
|
||||
import { u8aToBn, u8aToU8a } from '../u8a';
|
||||
import { DEFAULT_BITLENGTH } from './defaults';
|
||||
|
||||
/**
|
||||
* @name compactFromU8a
|
||||
@@ -17,29 +15,29 @@ import { DEFAULT_BITLENGTH } from './defaults';
|
||||
* ```javascript
|
||||
* import { compactFromU8a } from '@polkadot/util';
|
||||
*
|
||||
* const [offset, length] = compactFromU8a(new Uint8Array([254, 255, 3, 0]), 32));
|
||||
* const [offset, length] = compactFromU8a(new Uint8Array([254, 255, 3, 0]));
|
||||
*
|
||||
* console.log('value offset=', offset, 'length=', length); // 4, 0xffff
|
||||
* ```
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
export function compactFromU8a (_input: Uint8Array | string, bitLength: BitLength = DEFAULT_BITLENGTH): [number, BN] {
|
||||
export function compactFromU8a (_input: Buffer | Uint8Array | string | number[]): [number, BN] {
|
||||
const input = u8aToU8a(_input);
|
||||
const flag = input[0] & 0b11;
|
||||
|
||||
if (flag === 0b00) {
|
||||
return [1, new BN(input[0]).shrn(2)];
|
||||
return [1, new BN(input[0]).ishrn(2)];
|
||||
} else if (flag === 0b01) {
|
||||
return [2, u8aToBn(input.slice(0, 2), true).shrn(2)];
|
||||
return [2, u8aToBn(input.slice(0, 2), true).ishrn(2)];
|
||||
} else if (flag === 0b10) {
|
||||
return [4, u8aToBn(input.slice(0, 4), true).shrn(2)];
|
||||
return [4, u8aToBn(input.slice(0, 4), true).ishrn(2)];
|
||||
}
|
||||
|
||||
const length = new BN(input[0])
|
||||
.shrn(2) // clear flag
|
||||
.addn(4) // add 4 for base length
|
||||
.toNumber();
|
||||
const offset = 1 + length;
|
||||
const offset = 1 + (
|
||||
new BN(input[0])
|
||||
.ishrn(2) // clear flag
|
||||
.iadd(BN_FOUR) // add 4 for base length
|
||||
.toNumber()
|
||||
);
|
||||
|
||||
return [offset, u8aToBn(input.subarray(1, offset), true)];
|
||||
}
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { BitLength } from './types';
|
||||
|
||||
import { DEFAULT_BITLENGTH } from './defaults';
|
||||
import { compactFromU8a } from './fromU8a';
|
||||
|
||||
/**
|
||||
@@ -18,8 +15,8 @@ import { compactFromU8a } from './fromU8a';
|
||||
* console.log(compactStripLength(new Uint8Array([2 << 2, 0xde, 0xad]))); // [2, Uint8Array[0xde, 0xad]]
|
||||
* ```
|
||||
*/
|
||||
export function compactStripLength (input: Uint8Array, bitLength: BitLength = DEFAULT_BITLENGTH): [number, Uint8Array] {
|
||||
const [offset, length] = compactFromU8a(input, bitLength);
|
||||
export function compactStripLength (input: Uint8Array): [number, Uint8Array] {
|
||||
const [offset, length] = compactFromU8a(input);
|
||||
const total = offset + length.toNumber();
|
||||
|
||||
return [
|
||||
|
||||
@@ -72,6 +72,13 @@ describe('encode', (): void => {
|
||||
);
|
||||
});
|
||||
|
||||
it('does not modify the original', (): void => {
|
||||
const original = new BN(123456);
|
||||
|
||||
expect(compactToU8a(original)).toEqual(new Uint8Array([2, 137, 7, 0]));
|
||||
expect(original.toString()).toEqual('123456');
|
||||
});
|
||||
|
||||
describe('from Rust', (): void => {
|
||||
// Copied from https://github.com/paritytech/parity-codec/blob/master/src/codec.rs
|
||||
const testCases = [
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import BN from 'bn.js';
|
||||
|
||||
import { assert } from '../assert';
|
||||
import { bnToBn, bnToU8a } from '../bn';
|
||||
import { BN_ONE, BN_TWO, bnToBn, bnToU8a } from '../bn';
|
||||
import { u8aConcat } from '../u8a';
|
||||
|
||||
const MAX_U8 = new BN(2).pow(new BN(8 - 2)).subn(1);
|
||||
@@ -29,9 +29,9 @@ export function compactToU8a (_value: BN | BigInt | number): Uint8Array {
|
||||
if (value.lte(MAX_U8)) {
|
||||
return new Uint8Array([value.toNumber() << 2]);
|
||||
} else if (value.lte(MAX_U16)) {
|
||||
return bnToU8a(value.shln(2).addn(0b01), 16, true);
|
||||
return bnToU8a(value.shln(2).iadd(BN_ONE), 16, true);
|
||||
} else if (value.lte(MAX_U32)) {
|
||||
return bnToU8a(value.shln(2).addn(0b10), 32, true);
|
||||
return bnToU8a(value.shln(2).iadd(BN_TWO), 32, true);
|
||||
}
|
||||
|
||||
const u8a = bnToU8a(value);
|
||||
@@ -42,13 +42,11 @@ export function compactToU8a (_value: BN | BigInt | number): Uint8Array {
|
||||
length--;
|
||||
}
|
||||
|
||||
assert(length >= 4, 'Previous tests match anyting less than 2^30; qed');
|
||||
assert(length >= 4, 'Invalid length, previous checks match anything less than 2^30');
|
||||
|
||||
return u8aConcat(
|
||||
new Uint8Array([
|
||||
// substract 4 as minimum (also catered for in decoding)
|
||||
((length - 4) << 2) + 0b11
|
||||
]),
|
||||
// subtract 4 as minimum (also catered for in decoding)
|
||||
[((length - 4) << 2) + 0b11],
|
||||
u8a.subarray(0, length)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -22,9 +22,5 @@ export function hexAddPrefix (value?: string | null): string {
|
||||
return value;
|
||||
}
|
||||
|
||||
const prefix = value && value.length % 2 === 1
|
||||
? '0'
|
||||
: '';
|
||||
|
||||
return `0x${prefix}${value || ''}`;
|
||||
return `0x${value && value.length % 2 === 1 ? '0' : ''}${value || ''}`;
|
||||
}
|
||||
|
||||
@@ -22,13 +22,9 @@ const UNPREFIX_HEX_REGEX = /^[a-fA-F0-9]+$/;
|
||||
export function hexStripPrefix (value?: string | null): string {
|
||||
if (!value) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (hexHasPrefix(value)) {
|
||||
} else if (hexHasPrefix(value)) {
|
||||
return value.substr(2);
|
||||
}
|
||||
|
||||
if (UNPREFIX_HEX_REGEX.test(value)) {
|
||||
} else if (UNPREFIX_HEX_REGEX.test(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ function reverse (value: string): string {
|
||||
|
||||
/**
|
||||
* @name hexToBn
|
||||
* @summary Creates a BN.js bignumber object from a hex string.
|
||||
* @summary Creates a BN.js object from a hex string.
|
||||
* @description
|
||||
* `null` inputs returns a `BN(0)` result. Hex input values return the actual value converted to a BN. Anything that is not a hex string (including the `0x` prefix) throws an error.
|
||||
* @param _value The value to convert
|
||||
@@ -43,7 +43,6 @@ export function hexToBn (value?: string | number | null, options: ToBnOptions |
|
||||
// Backwards-compatibility
|
||||
...(isBoolean(options) ? { isLe: options } : options)
|
||||
};
|
||||
|
||||
const _value = hexStripPrefix(value as string);
|
||||
|
||||
// FIXME: Use BN's 3rd argument `isLe` once this issue is fixed
|
||||
|
||||
@@ -25,7 +25,7 @@ export function hexToU8a (_value?: string | null, bitLength = -1): Uint8Array {
|
||||
return new Uint8Array();
|
||||
}
|
||||
|
||||
assert(isHex(_value), `Expected hex value to convert, found '${_value}'`);
|
||||
assert(isHex(_value), () => `Expected hex value to convert, found '${_value}'`);
|
||||
|
||||
const value = hexStripPrefix(_value);
|
||||
const valLength = value.length / 2;
|
||||
|
||||
@@ -22,5 +22,6 @@ export * from './memoize';
|
||||
export * from './number';
|
||||
export * from './promisify';
|
||||
export * from './string';
|
||||
export * from './stringify';
|
||||
export * from './u8a';
|
||||
export * from './versionDetect';
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { stringify } from '../stringify';
|
||||
|
||||
interface ObjectIndexed {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
[index: string]: any;
|
||||
@@ -32,13 +34,13 @@ interface ObjectIndexed {
|
||||
*/
|
||||
export function isJsonObject (value: unknown): value is ObjectIndexed {
|
||||
const str = typeof value !== 'string'
|
||||
? JSON.stringify(value)
|
||||
? stringify(value)
|
||||
: value;
|
||||
|
||||
try {
|
||||
const obj = JSON.parse(str) as unknown;
|
||||
|
||||
return (typeof obj === 'object' && obj !== null);
|
||||
return typeof obj === 'object' && obj !== null;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
import type { Memoized } from './types';
|
||||
|
||||
import { isBigInt } from './is/bigInt';
|
||||
import { isUndefined } from './is/undefined';
|
||||
import { stringify } from './stringify';
|
||||
|
||||
interface Options {
|
||||
getInstanceId?: () => string;
|
||||
@@ -14,20 +14,12 @@ function defaultGetId (): string {
|
||||
return 'none';
|
||||
}
|
||||
|
||||
function normalize (args: unknown[]): string {
|
||||
return JSON.stringify(args, (_, value: unknown) =>
|
||||
isBigInt(value)
|
||||
? value.toString()
|
||||
: value
|
||||
);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function memoize <T, F extends (...args: any[]) => T> (fn: F, { getInstanceId = defaultGetId }: Options = {}): Memoized<F> {
|
||||
const cache: Record<string, Record<string, T>> = {};
|
||||
|
||||
const memoized = (...args: unknown[]): T => {
|
||||
const stringParams = normalize(args);
|
||||
const stringParams = stringify(args);
|
||||
const instanceId = getInstanceId();
|
||||
|
||||
if (!cache[instanceId]) {
|
||||
@@ -42,7 +34,7 @@ export function memoize <T, F extends (...args: any[]) => T> (fn: F, { getInstan
|
||||
};
|
||||
|
||||
memoized.unmemoize = (...args: unknown[]): void => {
|
||||
const stringParams = normalize(args);
|
||||
const stringParams = stringify(args);
|
||||
const instanceId = getInstanceId();
|
||||
|
||||
if (cache[instanceId] && !isUndefined(cache[instanceId][stringParams])) {
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/util', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/util', version: '6.6.1' };
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import BN from 'bn.js';
|
||||
|
||||
import { stringify } from './stringify';
|
||||
|
||||
describe('stringify', (): void => {
|
||||
it('stringifies a BigInt', (): void => {
|
||||
expect(
|
||||
stringify(1234n)
|
||||
).toEqual('"1234"');
|
||||
});
|
||||
|
||||
it('stringifies an array of values', (): void => {
|
||||
expect(
|
||||
stringify(['a', 1, 2n, new BN(3)])
|
||||
).toEqual('["a",1,"2","3"]');
|
||||
});
|
||||
|
||||
it('stringifies an array of values (with spaces)', (): void => {
|
||||
expect(
|
||||
stringify(['a', 1, 2n, new BN(3)], 2)
|
||||
).toEqual('[\n "a",\n 1,\n "2",\n "3"\n]');
|
||||
});
|
||||
|
||||
it('stringifies a nested object', (): void => {
|
||||
expect(
|
||||
stringify({ a: 'a', b: 1, c: { d: 2n, e: new BN(3) } })
|
||||
).toEqual('{"a":"a","b":1,"c":{"d":"2","e":"3"}}');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,15 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { isBigInt } from './is/bigInt';
|
||||
|
||||
export function stringify (args: unknown, space?: string | number): string {
|
||||
return JSON.stringify(
|
||||
args,
|
||||
(_, value: unknown) =>
|
||||
isBigInt(value)
|
||||
? value.toString()
|
||||
: value,
|
||||
space
|
||||
);
|
||||
}
|
||||
@@ -23,11 +23,10 @@ import { u8aToU8a } from './toU8a';
|
||||
export function u8aConcat (...list: (Buffer | Uint8Array | number[] | string)[]): Uint8Array {
|
||||
let length = 0;
|
||||
let offset = 0;
|
||||
const u8as = new Array(list.length) as Uint8Array[];
|
||||
const u8as = new Array<Uint8Array>(list.length);
|
||||
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
u8as[i] = u8aToU8a(list[i]);
|
||||
|
||||
length += u8as[i].length;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,5 @@
|
||||
* ```
|
||||
*/
|
||||
export function u8aToBuffer (value?: Uint8Array | null): Buffer {
|
||||
return !value
|
||||
? Buffer.from([])
|
||||
: Buffer.from(value);
|
||||
return Buffer.from(value || []);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ const ALPHABET = new Array(256).fill(0).map((_, n) => n.toString(16).padStart(2,
|
||||
|
||||
/** @internal */
|
||||
function extract (value: Uint8Array): string {
|
||||
const result = new Array(value.length) as string[];
|
||||
const result = new Array<string>(value.length);
|
||||
|
||||
for (let i = 0; i < value.length; i++) {
|
||||
result[i] = ALPHABET[value[i]];
|
||||
@@ -44,8 +44,9 @@ export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed
|
||||
|
||||
const byteLength = Math.ceil(bitLength / 8);
|
||||
|
||||
return prefix + ((byteLength > 0 && value.length > byteLength)
|
||||
? trim(value, Math.ceil(byteLength / 2))
|
||||
: extract(value)
|
||||
return prefix + (
|
||||
(byteLength > 0 && value.length > byteLength)
|
||||
? trim(value, Math.ceil(byteLength / 2))
|
||||
: extract(value)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -40,6 +40,14 @@ describe('u8aToU8a', (): void => {
|
||||
);
|
||||
});
|
||||
|
||||
it('creates from a Buffer', (): void => {
|
||||
expect(
|
||||
u8aToU8a(Buffer.from([1, 2, 3, 128, 0, 10, 11, 12]))
|
||||
).toEqual(
|
||||
new Uint8Array([1, 2, 3, 128, 0, 10, 11, 12])
|
||||
);
|
||||
});
|
||||
|
||||
it('returns a Uint8Array as-is (u8a input)', (): void => {
|
||||
expect(
|
||||
u8aToU8a(new Uint8Array([128, 0, 10]))
|
||||
@@ -47,4 +55,11 @@ describe('u8aToU8a', (): void => {
|
||||
new Uint8Array([128, 0, 10])
|
||||
);
|
||||
});
|
||||
|
||||
it('fails to create from unknown typed values', (): void => {
|
||||
expect(
|
||||
// this is where completely invalid data is being passed
|
||||
() => u8aToU8a(123 as unknown as Uint8Array)
|
||||
).toThrow('Unable to convert 123 (typeof number) to a Uint8Array');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,25 +1,14 @@
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { bufferToU8a } from '../buffer/toU8a';
|
||||
import { assert } from '../assert';
|
||||
import { hexToU8a } from '../hex/toU8a';
|
||||
import { isBuffer } from '../is/buffer';
|
||||
import { isHex } from '../is/hex';
|
||||
import { isString } from '../is/string';
|
||||
import { isU8a } from '../is/u8a';
|
||||
import { stringToU8a } from '../string/toU8a';
|
||||
|
||||
function convertArray (value: number[] | Uint8Array): Uint8Array {
|
||||
return Array.isArray(value)
|
||||
? Uint8Array.from(value)
|
||||
: value;
|
||||
}
|
||||
|
||||
function convertString (value: string): Uint8Array {
|
||||
return isHex(value)
|
||||
? hexToU8a(value)
|
||||
: stringToU8a(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name u8aToU8a
|
||||
* @summary Creates a Uint8Array value from a Uint8Array, Buffer, string or hex input.
|
||||
@@ -29,7 +18,7 @@ function convertString (value: string): Uint8Array {
|
||||
* <BR>
|
||||
*
|
||||
* ```javascript
|
||||
* import { { u8aToU8a } from '@polkadot/util';
|
||||
* import { u8aToU8a } from '@polkadot/util';
|
||||
*
|
||||
* u8aToU8a(new Uint8Array([0x12, 0x34]); // => Uint8Array([0x12, 0x34])
|
||||
* u8aToU8a(0x1234); // => Uint8Array([0x12, 0x34])
|
||||
@@ -38,11 +27,15 @@ function convertString (value: string): Uint8Array {
|
||||
export function u8aToU8a (value?: number[] | Buffer | Uint8Array | string | null): Uint8Array {
|
||||
if (!value) {
|
||||
return new Uint8Array();
|
||||
} else if (isBuffer(value)) {
|
||||
return bufferToU8a(value);
|
||||
} else if (isString(value)) {
|
||||
return convertString(value);
|
||||
return isHex(value)
|
||||
? hexToU8a(value)
|
||||
: stringToU8a(value);
|
||||
} else if (Array.isArray(value) || isBuffer(value)) {
|
||||
return new Uint8Array(value);
|
||||
}
|
||||
|
||||
return convertArray(value);
|
||||
assert(isU8a(value), () => `Unable to convert ${value.toString()} (typeof ${typeof value}) to a Uint8Array`);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ function getPath (pathOrFn?: FnString | string | false): string {
|
||||
* @summary Checks that a specific package is only imported once
|
||||
*/
|
||||
export function detectPackage ({ name, version }: PackageJson, pathOrFn?: FnString | string | false, deps: PackageJson[] = []): void {
|
||||
assert(name.startsWith('@polkadot'), `Invalid package descriptor ${name}`);
|
||||
assert(name.startsWith('@polkadot'), () => `Invalid package descriptor ${name}`);
|
||||
|
||||
const entry = getEntry(name);
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"name": "@polkadot/x-fetch",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A cross-environment fetch replacement",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -15,8 +18,8 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-fetch#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-global": "6.2.1",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-global": "6.6.1",
|
||||
"@types/node-fetch": "^2.5.10",
|
||||
"node-fetch": "^2.6.1"
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-fetch', version: '6.6.1' };
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
{
|
||||
"name": "@polkadot/x-global",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A cross-environment global replacement",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -13,7 +16,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-global#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@types/node-fetch": "^2.5.10",
|
||||
"node-fetch": "^2.6.1"
|
||||
}
|
||||
|
||||
@@ -4,11 +4,13 @@
|
||||
export { packageInfo } from './packageInfo';
|
||||
|
||||
export const xglobal = (
|
||||
typeof global !== 'undefined'
|
||||
? global
|
||||
: typeof self !== 'undefined'
|
||||
? self
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: this as unknown as (Window & typeof globalThis)
|
||||
typeof globalThis !== 'undefined'
|
||||
? globalThis
|
||||
: typeof global !== 'undefined'
|
||||
? global
|
||||
: typeof self !== 'undefined'
|
||||
? self
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: this as unknown as (Window & typeof globalThis)
|
||||
);
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-global', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-global', version: '6.6.1' };
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"name": "@polkadot/x-randomvalues",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A cross-environment window.crypto.getRandomValues replacement",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -15,10 +18,10 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-randomvalues#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-global": "6.2.1"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-global": "6.6.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-native": "^0.64.2"
|
||||
"@types/react-native": "^0.64.7"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-randomvalues', version: '6.6.1' };
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
{
|
||||
"name": "@polkadot/x-rxjs",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A pass-through interface for RxJs (allowing node + mjs usage)",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -13,7 +16,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-rxjs#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"rxjs": "^6.6.7"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-rxjs', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-rxjs', version: '6.6.1' };
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"name": "@polkadot/x-textdecoder",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A TextDecoder replacement",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -15,7 +18,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-textdecoder#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-global": "6.2.1"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-global": "6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-textdecoder', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-textdecoder', version: '6.6.1' };
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"name": "@polkadot/x-textencoder",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A TextDecoder replacement",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -15,7 +18,7 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-textencoder#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-global": "6.2.1"
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-global": "6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-textencoder', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-textencoder', version: '6.6.1' };
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"name": "@polkadot/x-ws",
|
||||
"version": "6.2.1",
|
||||
"version": "6.6.1",
|
||||
"type": "module",
|
||||
"description": "A cross-environment WebSocket replacement",
|
||||
"browser": "browser.js",
|
||||
"main": "node.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
@@ -15,8 +18,8 @@
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-ws#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.13.10",
|
||||
"@polkadot/x-global": "6.2.1",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/x-global": "6.6.1",
|
||||
"@types/websocket": "^1.0.2",
|
||||
"websocket": "^1.0.34"
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/x-ws', version: '6.2.1' };
|
||||
export const packageInfo = { name: '@polkadot/x-ws', version: '6.6.1' };
|
||||
|
||||
Reference in New Issue
Block a user