Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8acc5680ac | ||
|
|
4d54ce4686 | ||
|
|
441e89edd7 | ||
|
|
f1da9f05fb | ||
|
|
464d2d38b4 | ||
|
|
1ea282c803 | ||
|
|
974559bf2e | ||
|
|
c353003c70 | ||
|
|
623bde1a61 | ||
|
|
67234fc013 | ||
|
|
4a6d6d647a | ||
|
|
b375b6c2d5 | ||
|
|
1c6fd4558c | ||
|
|
3800ffd61a | ||
|
|
d447ed8fc9 | ||
|
|
abb1062462 | ||
|
|
c6bdf78606 | ||
|
|
7687d5bf00 | ||
|
|
5b246891d7 | ||
|
|
3b9617faf4 | ||
|
|
aa57da0806 | ||
|
|
66841bba88 | ||
|
|
7d963e3602 | ||
|
|
82b25aecfb | ||
|
|
9b204fc660 | ||
|
|
68bcce7a27 | ||
|
|
3a57c7da69 | ||
|
|
055c4f82f5 | ||
|
|
12d8b07ff1 | ||
|
|
f07d66562b | ||
|
|
80f28da707 | ||
|
|
1aec77922f | ||
|
|
f431f02f11 | ||
|
|
2063183f50 | ||
|
|
8280af08a6 | ||
|
|
8029a54508 | ||
|
|
9e5478e0c0 | ||
|
|
c67c1966d7 | ||
|
|
e1aa096cef | ||
|
|
7135941b6a | ||
|
|
dc24fb82a8 | ||
|
|
32cfe3707e | ||
|
|
97378be94e | ||
|
|
db0559e9c9 | ||
|
|
94d6a900f7 | ||
|
|
d751c03d45 | ||
|
|
aef8003d50 | ||
|
|
2810b35d6c | ||
|
|
6148932389 | ||
|
|
f4889a36d4 | ||
|
|
e8879c0ffc | ||
|
|
ed64514415 | ||
|
|
fcc25ee2c8 | ||
|
|
695e19a8a7 | ||
|
|
384bf9a41a | ||
|
|
8f24a2758e | ||
|
|
3230663ae1 | ||
|
|
4a0fa7f615 | ||
|
|
0f05954dc5 | ||
|
|
55f442f9fa | ||
|
|
7e5edc46a3 | ||
|
|
d500f98fb4 | ||
|
|
7b8902ce3f | ||
|
|
98b3ad642f | ||
|
|
14466e27ac | ||
|
|
16ffd1b467 | ||
|
|
ca52fd7e5b | ||
|
|
ea5d3df64c | ||
|
|
b51ed71796 | ||
|
|
bf28507ae8 | ||
|
|
6715bef24a | ||
|
|
badbbd76cb | ||
|
|
253776a510 | ||
|
|
e1ef295bfa | ||
|
|
73c89f4e3c | ||
|
|
a52e0dfb16 | ||
|
|
9f8ed7bb50 | ||
|
|
a932f9408a | ||
|
|
7907ce6dbf | ||
|
|
230d510491 | ||
|
|
415fd1b2d1 | ||
|
|
89c954216d | ||
|
|
b689796b25 | ||
|
|
c4c18d324b | ||
|
|
b7bf500343 |
@@ -1,4 +0,0 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module.exports = require('./babel.config.js');
|
||||
+2
-1
@@ -1,4 +1,5 @@
|
||||
exclude_patterns:
|
||||
- "**/*.spec.js"
|
||||
- "**/*.spec.ts"
|
||||
- "docs/**/*.js"
|
||||
- "packages/networks/src/index.ts"
|
||||
- "packages/util/src/is/utf8.ts"
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
.eslintrc.js
|
||||
**/build/*
|
||||
**/coverage/*
|
||||
**/node_modules/*
|
||||
+10
-1
@@ -1,10 +1,19 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
const base = require('@polkadot/dev/config/eslint');
|
||||
const base = require('@polkadot/dev/config/eslint.cjs');
|
||||
|
||||
module.exports = {
|
||||
...base,
|
||||
ignorePatterns: [
|
||||
'.eslintrc.js',
|
||||
'.github/**',
|
||||
'.vscode/**',
|
||||
'.yarn/**',
|
||||
'**/build/*',
|
||||
'**/coverage/*',
|
||||
'**/node_modules/*'
|
||||
],
|
||||
parserOptions: {
|
||||
...base.parserOptions,
|
||||
project: [
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
---
|
||||
title: SS58 registry is outdated
|
||||
labels: ci
|
||||
labels: ['ci', '@networks']
|
||||
---
|
||||
|
||||
cc @polkadot-js/notifications
|
||||
|
||||
Discrepancies detected between https://github.com/paritytech/substrate/blob/master/ss58-registry.json and https://github.com/polkadot-js/common/blob/master/packages/networks/src/index.ts
|
||||
|
||||
Check the nightly cron output or run `yarn networks:crosscheck` locally. The output as found from the test includes:
|
||||
|
||||
@@ -5,11 +5,11 @@ jobs:
|
||||
pr:
|
||||
strategy:
|
||||
matrix:
|
||||
step: ['lint', 'test', 'build']
|
||||
step: ['lint', 'test', 'build', 'networks:crosscheck']
|
||||
name: ${{ matrix.step }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2
|
||||
- name: ${{ matrix.step }}
|
||||
env:
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
if: "! startsWith(github.event.head_commit.message, '[CI Skip]') && github.repository == 'polkadot-js/common'"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
token: ${{ secrets.GH_PAT }}
|
||||
- name: ${{ matrix.step }}
|
||||
|
||||
@@ -7,7 +7,7 @@ jobs:
|
||||
ss58:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2
|
||||
- name: check
|
||||
env:
|
||||
CI_LOG: 123
|
||||
|
||||
Vendored
-55
File diff suppressed because one or more lines are too long
+55
File diff suppressed because one or more lines are too long
+1
-1
@@ -12,4 +12,4 @@ plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
|
||||
spec: "@yarnpkg/plugin-workspace-tools"
|
||||
|
||||
yarnPath: .yarn/releases/yarn-2.2.2.cjs
|
||||
yarnPath: .yarn/releases/yarn-2.3.3.cjs
|
||||
|
||||
@@ -1,5 +1,42 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 4.1.1 Nov 16, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Expand ETH tests, allow for verification against address (Thanks to https://github.com/joelamouche)
|
||||
|
||||
Changes:
|
||||
|
||||
- Replace pbkdf2 imports with explicit use from sync-only package
|
||||
- Adjust secp256k1 imports with shared elliptic
|
||||
- Expand crypto tests for explicit wasm vs JS compares in all cases
|
||||
|
||||
|
||||
## 4.0.1 Nov 8, 2020
|
||||
|
||||
- **Breaking change** Polyfills are not injected by these libraries anymore to avoid clobbering external globals, the user should provide them if their environment is missing base functionality.
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove built-in utility polyfills for `Array.fill`, `String.padStart`, `String.padEnd` as well as `Object.setPrototypeOf`. These should be provided by the actual user of the libraries if so required.
|
||||
- Update `@polkadot/wasm-crypto` library (under-the-hood cleanups)
|
||||
- Remove explicit crypto polyfill injection (aligning with updated `@polkadot/wasm-crypto`)
|
||||
- Add cross-environment `@polkadot/x-randomvalues` (for use in `@polkadot/wasm-crypto`)
|
||||
|
||||
|
||||
## 3.7.1 Nov 1, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove the use of `chalk` (logger) for less overall dependencies
|
||||
- `string*` utilities now also allows `String` (class) inputs
|
||||
- Align bip39 use with wasm-crypto for English-only wordlist, default, non supplied)
|
||||
- Adjust elliptic imports for explicit paths (allows tree-shaking)
|
||||
- Add Totem (ss58 prefix 14) into `@polkadot/networks`
|
||||
- Move `@polkadot/x-{fetch,textdecoder,textencoder,ws}` into `common` repo
|
||||
|
||||
|
||||
## 3.6.1 Oct 18, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module.exports = require('@polkadot/dev/config/babel');
|
||||
module.exports = require('@polkadot/dev/config/babel-config-cjs.cjs');
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
function copy_folder () {
|
||||
SRC="packages/$1/build"
|
||||
DST="../apps/node_modules/@polkadot/$1"
|
||||
|
||||
echo "** Copying $SRC to $DST"
|
||||
|
||||
rm -rf $DST
|
||||
cp -r $SRC $DST
|
||||
}
|
||||
|
||||
yarn polkadot-dev-build-ts
|
||||
|
||||
copy_folder "keyring"
|
||||
copy_folder "util"
|
||||
copy_folder "util-crypto"
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="initial-scale=0.5, maximum-scale=1">
|
||||
<meta http-equiv="refresh" content="0;URL='https://polkadot.js.org/docs/'" />
|
||||
<title>Redirecting to https://polkadot.js.org/docs/</title>
|
||||
</head>
|
||||
<body>
|
||||
Redirecting to <a href="https://polkadot.js.org/docs/">https://polkadot.js.org/docs/</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="initial-scale=0.5, maximum-scale=1">
|
||||
<meta http-equiv="refresh" content="0;URL='https://polkadot.js.org/docs/'" />
|
||||
<title>Redirecting to https://polkadot.js.org/docs/</title>
|
||||
</head>
|
||||
<body>
|
||||
Redirecting to <a href="https://polkadot.js.org/docs/">https://polkadot.js.org/docs/</a>
|
||||
</body>
|
||||
</html>
|
||||
+10
-4
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
const config = require('@polkadot/dev/config/jest');
|
||||
const config = require('@polkadot/dev/config/jest.cjs');
|
||||
|
||||
module.exports = Object.assign({}, config, {
|
||||
moduleNameMapper: {
|
||||
@@ -9,13 +9,19 @@ module.exports = Object.assign({}, config, {
|
||||
'@polkadot/networks(.*)$': '<rootDir>/packages/networks/src/$1',
|
||||
'@polkadot/util-(crypto)(.*)$': '<rootDir>/packages/util-$1/src/$2',
|
||||
// eslint-disable-next-line sort-keys
|
||||
'@polkadot/util(.*)$': '<rootDir>/packages/util/src/$1'
|
||||
'@polkadot/util(.*)$': '<rootDir>/packages/util/src/$1',
|
||||
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node'
|
||||
},
|
||||
modulePathIgnorePatterns: [
|
||||
'<rootDir>/packages/keyring/build',
|
||||
'<rootDir>/packages/networks/build',
|
||||
'<rootDir>/packages/util/build',
|
||||
'<rootDir>/packages/util-crypto/build'
|
||||
'<rootDir>/packages/util-crypto/build',
|
||||
'<rootDir>/packages/x-fetch/build',
|
||||
'<rootDir>/packages/x-randomvalues/build',
|
||||
'<rootDir>/packages/x-textdecoder/build',
|
||||
'<rootDir>/packages/x-textencoder/build',
|
||||
'<rootDir>/packages/x-ws/build'
|
||||
],
|
||||
resolver: './jest.resolver.js'
|
||||
resolver: '@polkadot/dev/config/jest-resolver.cjs'
|
||||
});
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
const path = require('path');
|
||||
|
||||
module.exports = function resolver (file, config) {
|
||||
return file.includes('package.json')
|
||||
? path.join(config.basedir.replace('/src', '/'), file)
|
||||
: config.defaultResolver(file, config);
|
||||
};
|
||||
+5
-6
@@ -7,8 +7,7 @@
|
||||
"packages/*"
|
||||
],
|
||||
"resolutions": {
|
||||
"babel-core": "^7.0.0-bridge.0",
|
||||
"typescript": "^4.0.3"
|
||||
"typescript": "^4.0.5"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "polkadot-dev-build-ts",
|
||||
@@ -22,9 +21,9 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.3",
|
||||
"@polkadot/dev": "^0.58.3",
|
||||
"@polkadot/ts": "^0.3.49",
|
||||
"@types/jest": "^26.0.14"
|
||||
"@polkadot/dev": "^0.60.2",
|
||||
"@polkadot/ts": "^0.3.55",
|
||||
"@types/jest": "^26.0.15"
|
||||
},
|
||||
"version": "3.6.1"
|
||||
"version": "4.1.1"
|
||||
}
|
||||
|
||||
@@ -1,34 +1,28 @@
|
||||
{
|
||||
"name": "@polkadot/keyring",
|
||||
"version": "3.6.1",
|
||||
"version": "4.1.1",
|
||||
"description": "Keyring management",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"main": "index.js",
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"registry": "https://registry.npmjs.org"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"keywords": [
|
||||
"Polkadot",
|
||||
"Keyring",
|
||||
"ed25519"
|
||||
],
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [
|
||||
"Jaco Greeff <jacogr@gmail.com>"
|
||||
],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/polkadot-js/common/issues"
|
||||
},
|
||||
"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.12.1",
|
||||
"@polkadot/util": "3.6.1",
|
||||
"@polkadot/util-crypto": "3.6.1"
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@polkadot/util": "4.1.1",
|
||||
"@polkadot/util-crypto": "4.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "4.1.1",
|
||||
"@polkadot/util-crypto": "4.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
detectPackage(require('./package.json'), typeof __dirname !== 'undefined' && __dirname);
|
||||
@@ -1,19 +1,12 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
import { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
|
||||
import './detectPackage';
|
||||
|
||||
import Keyring from './keyring';
|
||||
import { Keyring } from './keyring';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
detectPackage(require('./package.json'), typeof __dirname !== 'undefined' && __dirname);
|
||||
export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
|
||||
|
||||
export default Keyring;
|
||||
|
||||
export {
|
||||
Keyring,
|
||||
decodeAddress,
|
||||
encodeAddress,
|
||||
setSS58Format
|
||||
};
|
||||
export { Keyring };
|
||||
|
||||
@@ -8,8 +8,8 @@ import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/uti
|
||||
import { base64Decode, decodeAddress, encodeAddress, keyExtractSuri, keyFromPath, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed, mnemonicToLegacySeed, mnemonicToMiniSecret } from '@polkadot/util-crypto';
|
||||
|
||||
import { DEV_PHRASE } from './defaults';
|
||||
import createPair from './pair';
|
||||
import Pairs from './pairs';
|
||||
import { createPair } from './pair';
|
||||
import { Pairs } from './pairs';
|
||||
|
||||
const keypairFromSeed = {
|
||||
ecdsa: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
|
||||
@@ -34,7 +34,7 @@ const keypairFromSeed = {
|
||||
* lookup of a pair for a given account address or public key using `getPair`. JSON metadata associated with
|
||||
* an account may be obtained using `toJson` accompanied by the account passphrase.
|
||||
*/
|
||||
export default class Keyring implements KeyringInstance {
|
||||
export class Keyring implements KeyringInstance {
|
||||
readonly #pairs: Pairs;
|
||||
|
||||
readonly #type: KeypairType;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '../testingPairs';
|
||||
import { createTestPairs } from '../testingPairs';
|
||||
|
||||
const keyring = testingPairs({ type: 'ed25519' }, false);
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
describe('decode', (): void => {
|
||||
it('fails when no data provided', (): void => {
|
||||
|
||||
@@ -42,7 +42,7 @@ function decodePkcs8 (encoded: Uint8Array): DecodeResult {
|
||||
};
|
||||
}
|
||||
|
||||
export default function decode (passphrase?: string, encrypted?: Uint8Array | null, encType: KeyringPair$JsonEncodingTypes[] = ENCODING): DecodeResult {
|
||||
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, encType: KeyringPair$JsonEncodingTypes[] = ENCODING): DecodeResult {
|
||||
assert(encrypted, 'No encrypted data available to decode');
|
||||
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encypted data');
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '../testingPairs';
|
||||
import { createTestPairs } from '../testingPairs';
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, NONCE_LENGTH, PUB_LENGTH, SCRYPT_LENGTH, SEC_LENGTH } from './defaults';
|
||||
|
||||
const PKCS8_LENGTH = PKCS8_DIVIDER.length + PKCS8_HEADER.length + PUB_LENGTH + SEC_LENGTH;
|
||||
const ENCODED_LENGTH = 16 + PKCS8_LENGTH + NONCE_LENGTH + SCRYPT_LENGTH;
|
||||
|
||||
const keyring = testingPairs({ type: 'ed25519' }, false);
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
describe('encode', (): void => {
|
||||
it('returns PKCS8 when no passphrase supplied', (): void => {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
|
||||
|
||||
export default function encode ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
|
||||
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
|
||||
assert(secretKey, 'Expected a valid secretKey to be passed to encode');
|
||||
|
||||
const encoded = u8aConcat(
|
||||
|
||||
@@ -6,10 +6,10 @@ import { cryptoWaitReady, encodeAddress as toSS58, setSS58Format } from '@polkad
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
|
||||
import { PAIRS } from '../testing';
|
||||
import testingPairs from '../testingPairs';
|
||||
import createPair from '.';
|
||||
import { createTestPairs } from '../testingPairs';
|
||||
import { createPair } from '.';
|
||||
|
||||
const keyring = testingPairs({ type: 'ed25519' }, false);
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
describe('pair', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
|
||||
@@ -8,9 +8,9 @@ import { PairInfo } from './types';
|
||||
import { assert, u8aConcat, u8aToHex } from '@polkadot/util';
|
||||
import { blake2AsU8a, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, secp256k1Compress, signatureVerify } from '@polkadot/util-crypto';
|
||||
|
||||
import decode from './decode';
|
||||
import encode from './encode';
|
||||
import toJson from './toJson';
|
||||
import { decodePair } from './decode';
|
||||
import { encodePair } from './encode';
|
||||
import { pairToJson } from './toJson';
|
||||
|
||||
interface Setup {
|
||||
toSS58: (publicKey: Uint8Array) => string;
|
||||
@@ -57,7 +57,7 @@ function isLocked (secretKey?: Uint8Array): secretKey is undefined {
|
||||
}
|
||||
|
||||
/**
|
||||
* @name pair
|
||||
* @name createPair
|
||||
* @summary Creates a keyring pair object
|
||||
* @description Creates a keyring pair object with provided account public key, metadata, and encoded arguments.
|
||||
* The keyring pair stores the account state including the encoded address and associated metadata.
|
||||
@@ -87,9 +87,9 @@ function isLocked (secretKey?: Uint8Array): secretKey is undefined {
|
||||
* an `encoded` property that is assigned with the encoded public key in hex format, and an `encoding`
|
||||
* property that indicates whether the public key value of the `encoded` property is encoded or not.
|
||||
*/
|
||||
export default function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: PairInfo, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, encTypes?: KeyringPair$JsonEncodingTypes[]): KeyringPair {
|
||||
export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: PairInfo, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, encTypes?: KeyringPair$JsonEncodingTypes[]): KeyringPair {
|
||||
const decodePkcs8 = (passphrase?: string, userEncoded?: Uint8Array | null): void => {
|
||||
const decoded = decode(passphrase, userEncoded || encoded, encTypes);
|
||||
const decoded = decodePair(passphrase, userEncoded || encoded, encTypes);
|
||||
|
||||
if (decoded.secretKey.length === 64) {
|
||||
publicKey = decoded.publicKey;
|
||||
@@ -105,7 +105,7 @@ export default function createPair ({ toSS58, type }: Setup, { publicKey, secret
|
||||
const recode = (passphrase?: string): Uint8Array => {
|
||||
isLocked(secretKey) && encoded && decodePkcs8(passphrase, encoded);
|
||||
|
||||
encoded = encode({ publicKey, secretKey }, passphrase); // re-encode, latest version
|
||||
encoded = encodePair({ publicKey, secretKey }, passphrase); // re-encode, latest version
|
||||
encTypes = undefined; // swap to defaults, latest version follows
|
||||
|
||||
return encoded;
|
||||
@@ -175,9 +175,9 @@ export default function createPair ({ toSS58, type }: Setup, { publicKey, secret
|
||||
? u8aToHex(secp256k1Compress(publicKey))
|
||||
: encodeAddress();
|
||||
|
||||
return toJson(type, { address, meta }, recode(passphrase), !!passphrase);
|
||||
return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);
|
||||
},
|
||||
verify: (message: Uint8Array, signature: Uint8Array): boolean =>
|
||||
signatureVerify(message, signature, TYPE_ADDRESS[type](publicKey), type === 'ethereum').isValid
|
||||
signatureVerify(message, signature, TYPE_ADDRESS[type](publicKey)).isValid
|
||||
};
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ const json: KeyringPair$Json = {
|
||||
meta
|
||||
};
|
||||
|
||||
export default function everybody (): KeyringPair {
|
||||
export function nobody (): KeyringPair {
|
||||
const pair: KeyringPair = {
|
||||
address,
|
||||
addressRaw: publicKey,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '../testingPairs';
|
||||
import { createTestPairs } from '../testingPairs';
|
||||
|
||||
const keyring = testingPairs({ type: 'ed25519' }, false);
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
describe('toJson', (): void => {
|
||||
it('creates an unencoded output with no passphrase', (): void => {
|
||||
|
||||
@@ -19,7 +19,7 @@ const VERSION = '3';
|
||||
|
||||
const ENC_NONE: KeyringPair$JsonEncodingTypes[] = ['none'];
|
||||
|
||||
export default function toJson (type: KeypairType, { address, meta }: PairStateJson, encoded: Uint8Array, isEncrypted: boolean): KeyringPair$Json {
|
||||
export function pairToJson (type: KeypairType, { address, meta }: PairStateJson, encoded: Uint8Array, isEncrypted: boolean): KeyringPair$Json {
|
||||
return {
|
||||
address,
|
||||
encoded: base64Encode(encoded),
|
||||
|
||||
@@ -8,7 +8,7 @@ import { decodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
type KeyringPairMap = Record<string, KeyringPair>;
|
||||
|
||||
export default class Pairs implements KeyringPairs {
|
||||
export class Pairs implements KeyringPairs {
|
||||
readonly #map: KeyringPairMap = {};
|
||||
|
||||
public add (pair: KeyringPair): KeyringPair {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { KeyringInstance, KeyringOptions } from './types';
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
|
||||
import createPair from './pair';
|
||||
import { createPair } from './pair';
|
||||
import Keyring from '.';
|
||||
|
||||
interface PairDef {
|
||||
@@ -67,9 +67,9 @@ export const PAIRS: PairDef[] = [
|
||||
* @name testKeyring
|
||||
* @summary Create an instance of Keyring pre-populated with locked test accounts
|
||||
* @description The test accounts (i.e. alice, bob, dave, eve, ferdie)
|
||||
* are available on the dev chain and each test account is initialised with DOT funds.
|
||||
* are available on the dev chain and each test account is initialized with DOT funds.
|
||||
*/
|
||||
export default function testKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
|
||||
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
|
||||
const keyring = new Keyring(options);
|
||||
|
||||
PAIRS.forEach(({ name, publicKey, secretKey, seed, type = 'sr25519' }): void => {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { cryptoWaitReady } from '@polkadot/util-crypto';
|
||||
|
||||
import testingPairs from './testingPairs';
|
||||
import { createTestPairs } from './testingPairs';
|
||||
|
||||
describe('testingPairs', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
@@ -12,19 +12,19 @@ describe('testingPairs', (): void => {
|
||||
|
||||
it('creates without failing', (): void => {
|
||||
expect(
|
||||
Object.keys(testingPairs())
|
||||
Object.keys(createTestPairs())
|
||||
).toHaveLength(2 + 0 + 7); // stash, session, pairs
|
||||
});
|
||||
|
||||
it('has the correct address for Alice (non-HDKD)', (): void => {
|
||||
expect(
|
||||
testingPairs({ type: 'ed25519' }, false).alice.address
|
||||
createTestPairs({ type: 'ed25519' }, false).alice.address
|
||||
).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
|
||||
});
|
||||
|
||||
it('has the correct address for Alice (HDKD)', (): void => {
|
||||
expect(
|
||||
testingPairs({ type: 'ed25519' }).alice.address
|
||||
createTestPairs({ type: 'ed25519' }).alice.address
|
||||
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
|
||||
import { KeyringPair, KeyringOptions } from './types';
|
||||
|
||||
import createKeyring from './testing';
|
||||
import nobody from './pair/nobody';
|
||||
import { createTestKeyring } from './testing';
|
||||
import { nobody } from './pair/nobody';
|
||||
|
||||
export interface TestKeyringMap {
|
||||
[index: string]: KeyringPair;
|
||||
}
|
||||
|
||||
export default function testKeyringPairs (options?: KeyringOptions, isDerived = true): TestKeyringMap {
|
||||
const keyring = createKeyring(options, isDerived);
|
||||
export function createTestPairs (options?: KeyringOptions, isDerived = true): TestKeyringMap {
|
||||
const keyring = createTestKeyring(options, isDerived);
|
||||
const pairs = keyring.getPairs();
|
||||
const map: TestKeyringMap = { nobody: nobody() };
|
||||
|
||||
|
||||
@@ -1,36 +1,25 @@
|
||||
{
|
||||
"name": "@polkadot/networks",
|
||||
"version": "3.6.1",
|
||||
"version": "4.1.1",
|
||||
"description": "A list of all available Substrate networks and their applicable prefixes",
|
||||
"main": "index.js",
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"registry": "https://registry.npmjs.org"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"repository": "github:polkadot-js/common",
|
||||
"keywords": [
|
||||
"Polkadot",
|
||||
"Keyring",
|
||||
"ed25519"
|
||||
"ss58"
|
||||
],
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [
|
||||
"Jaco Greeff <jacogr@gmail.com>"
|
||||
],
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/polkadot-js/common/issues"
|
||||
},
|
||||
"bugs": "https://github.com/polkadot-js/common/issues",
|
||||
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.12.1"
|
||||
"@babel/runtime": "^7.12.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/util": "3.6.1",
|
||||
"@polkadot/x-fetch": "^0.3.3"
|
||||
"@polkadot/util": "4.1.1",
|
||||
"@polkadot/x-fetch": "4.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,16 @@ const UNSORTED = [0, 2, 42];
|
||||
// last. This make lookups for the current a simple genesisHash[0]
|
||||
// (See Kusama as an example)
|
||||
|
||||
const createReserved = (prefix: number, displayName = 'This prefix is reserved.'): NetworkFromSubstrate => ({
|
||||
decimals: null,
|
||||
displayName,
|
||||
network: `reserved${prefix}`,
|
||||
prefix,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
});
|
||||
|
||||
const all: NetworkFromSubstrate[] = [
|
||||
{
|
||||
decimals: [10],
|
||||
@@ -23,15 +33,7 @@ const all: NetworkFromSubstrate[] = [
|
||||
symbols: ['DOT'],
|
||||
website: 'https://polkadot.network'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'This prefix is reserved.',
|
||||
network: 'reserved1',
|
||||
prefix: 1,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
createReserved(1),
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Kusama Relay Chain',
|
||||
@@ -47,15 +49,7 @@ const all: NetworkFromSubstrate[] = [
|
||||
symbols: ['KSM'],
|
||||
website: 'https://kusama.network'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'This prefix is reserved.',
|
||||
network: 'reserved3',
|
||||
prefix: 3,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
createReserved(3),
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Katal Chain',
|
||||
@@ -148,6 +142,24 @@ const all: NetworkFromSubstrate[] = [
|
||||
symbols: null,
|
||||
website: 'https://www.substratee.com'
|
||||
},
|
||||
{
|
||||
decimals: [0],
|
||||
displayName: 'Totem',
|
||||
network: 'totem',
|
||||
prefix: 14,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['XTX'],
|
||||
website: 'https://totemaccounting.com'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Synesthesia',
|
||||
network: 'synesthesia',
|
||||
prefix: 15,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['SYN'],
|
||||
website: 'https://synesthesia.network/'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Kulupu',
|
||||
@@ -186,14 +198,14 @@ const all: NetworkFromSubstrate[] = [
|
||||
website: 'https://geekcash.org'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
decimals: [12],
|
||||
displayName: 'Stafi',
|
||||
genesisHash: ['0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'],
|
||||
network: 'stafi',
|
||||
prefix: 20,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
symbols: ['FIS'],
|
||||
website: 'https://stafi.io'
|
||||
},
|
||||
{
|
||||
decimals: [6],
|
||||
@@ -324,15 +336,7 @@ const all: NetworkFromSubstrate[] = [
|
||||
symbols: null,
|
||||
website: 'https://substrate.dev/'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'This prefix is reserved.',
|
||||
network: 'reserved43',
|
||||
prefix: 43,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
createReserved(43),
|
||||
{
|
||||
decimals: [8],
|
||||
displayName: 'ChainX',
|
||||
@@ -342,33 +346,9 @@ const all: NetworkFromSubstrate[] = [
|
||||
symbols: ['PCX'],
|
||||
website: 'https://chainx.org/'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'This prefix is reserved.',
|
||||
network: 'reserved46',
|
||||
prefix: 46,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'This prefix is reserved.',
|
||||
network: 'reserved47',
|
||||
prefix: 47,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'All prefixes 48 and higher are reserved and cannot be allocated.',
|
||||
network: 'reserved48',
|
||||
prefix: 48,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
}
|
||||
createReserved(46),
|
||||
createReserved(47),
|
||||
createReserved(48, 'All prefixes 48 and higher are reserved and cannot be allocated.')
|
||||
];
|
||||
|
||||
// The list of available/claimed prefixes
|
||||
|
||||
@@ -1,50 +1,44 @@
|
||||
{
|
||||
"name": "@polkadot/util-crypto",
|
||||
"version": "3.6.1",
|
||||
"version": "4.1.1",
|
||||
"description": "A collection of useful crypto utilities for @polkadot",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"keywords": [
|
||||
"Polkadot"
|
||||
],
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [
|
||||
"Jaco Greeff <jacogr@gmail.com>"
|
||||
],
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"registry": "https://registry.npmjs.org"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/polkadot-js/common/issues"
|
||||
},
|
||||
"repository": "github:polkadot-js/common",
|
||||
"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.12.1",
|
||||
"@polkadot/networks": "3.6.1",
|
||||
"@polkadot/util": "3.6.1",
|
||||
"@polkadot/wasm-crypto": "^1.4.1",
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@polkadot/networks": "4.1.1",
|
||||
"@polkadot/util": "4.1.1",
|
||||
"@polkadot/wasm-crypto": "^2.0.1",
|
||||
"@polkadot/x-randomvalues": "4.1.1",
|
||||
"base-x": "^3.0.8",
|
||||
"bip39": "^3.0.2",
|
||||
"blakejs": "^1.1.0",
|
||||
"bn.js": "^5.1.3",
|
||||
"create-hash": "^1.2.0",
|
||||
"elliptic": "^6.5.3",
|
||||
"hash.js": "^1.1.7",
|
||||
"js-sha3": "^0.8.0",
|
||||
"pbkdf2": "^3.1.1",
|
||||
"scryptsy": "^2.1.0",
|
||||
"tweetnacl": "^1.0.3",
|
||||
"xxhashjs": "^0.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bn.js": "^4.11.6",
|
||||
"@types/create-hash": "^1.2.2",
|
||||
"@types/elliptic": "^6.4.12",
|
||||
"@types/pbkdf2": "^3.1.0",
|
||||
"@types/scryptsy": "^2.0.0",
|
||||
"@types/xxhashjs": "^0.2.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "4.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
|
||||
import addressToEvm from './addressToEvm';
|
||||
import { addressToEvm } from './addressToEvm';
|
||||
|
||||
describe('addressToEvm', (): void => {
|
||||
it('creates a valid known EVM address', (): void => {
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import decode from './decode';
|
||||
import { decodeAddress } from './decode';
|
||||
|
||||
/**
|
||||
* @name addressToEvm
|
||||
* @summary Converts an SS58 address to its corresponding EVM address.
|
||||
*/
|
||||
export default function addressToEvm (address: string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||
const decoded = decode(address, ignoreChecksum);
|
||||
export function addressToEvm (address: string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
|
||||
const decoded = decodeAddress(address, ignoreChecksum);
|
||||
|
||||
return decoded.subarray(0, 20);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import checkAddress from './check';
|
||||
import { checkAddress } from '.';
|
||||
|
||||
describe('checkAddress', (): void => {
|
||||
it('returns [true, null] for Kusama', (): void => {
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
import { Prefix } from './types';
|
||||
|
||||
import base58Decode from '../base58/decode';
|
||||
import checkChecksum from './checkChecksum';
|
||||
import defaults from './defaults';
|
||||
import { base58Decode } from '../base58/decode';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
/**
|
||||
* @name checkAddress
|
||||
@@ -13,7 +13,7 @@ import defaults from './defaults';
|
||||
* @description
|
||||
* From the provided input, validate that the address is a valid input.
|
||||
*/
|
||||
export default function check (address: string, prefix: Prefix): [boolean, string | null] {
|
||||
export function checkAddress (address: string, prefix: Prefix): [boolean, string | null] {
|
||||
let decoded;
|
||||
|
||||
try {
|
||||
@@ -28,7 +28,7 @@ export default function check (address: string, prefix: Prefix): [boolean, strin
|
||||
return [false, 'Invalid decoded address length'];
|
||||
}
|
||||
|
||||
const [isValid] = checkChecksum(decoded);
|
||||
const [isValid] = checkAddressChecksum(decoded);
|
||||
|
||||
return [isValid, isValid ? null : 'Invalid decoded address checksum'];
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import sshash from './sshash';
|
||||
import { sshash } from './sshash';
|
||||
|
||||
export default function checkChecksum (decoded: Uint8Array): [boolean, number] {
|
||||
export function checkAddressChecksum (decoded: Uint8Array): [boolean, number] {
|
||||
const isPublicKey = [35, 36].includes(decoded.length);
|
||||
|
||||
// non-publicKeys has 1 byte checksums, else default to 2
|
||||
@@ -3,19 +3,19 @@
|
||||
|
||||
import { stringToU8a, u8aToHex, hexToU8a } from '@polkadot/util';
|
||||
|
||||
import testingPairs, { TestKeyringMap } from '../../../keyring/src/testingPairs';
|
||||
import decode from './decode';
|
||||
import { TestKeyringMap, createTestPairs } from '../../../keyring/src/testingPairs';
|
||||
import { decodeAddress } from '.';
|
||||
|
||||
describe('decodeAddress', (): void => {
|
||||
let keyring: TestKeyringMap;
|
||||
|
||||
beforeAll((): void => {
|
||||
keyring = testingPairs({ type: 'sr25519' });
|
||||
keyring = createTestPairs({ type: 'sr25519' });
|
||||
});
|
||||
|
||||
it('decodes an address', (): void => {
|
||||
expect(
|
||||
decode('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
|
||||
decodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
|
||||
).toEqual(
|
||||
keyring.alice.publicKey
|
||||
);
|
||||
@@ -23,13 +23,13 @@ describe('decodeAddress', (): void => {
|
||||
|
||||
it('decodes the council address', (): void => {
|
||||
expect(
|
||||
u8aToHex(decode('F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29'))
|
||||
u8aToHex(decodeAddress('F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29'))
|
||||
).toEqual(u8aToHex(stringToU8a('modlpy/trsry'.padEnd(32, '\0'))));
|
||||
});
|
||||
|
||||
it('converts a publicKey (u8a) as-is', (): void => {
|
||||
expect(
|
||||
decode(new Uint8Array([1, 2, 3]))
|
||||
decodeAddress(new Uint8Array([1, 2, 3]))
|
||||
).toEqual(
|
||||
new Uint8Array([1, 2, 3])
|
||||
);
|
||||
@@ -37,7 +37,7 @@ describe('decodeAddress', (): void => {
|
||||
|
||||
it('converts a publicKey (hex) as-is', (): void => {
|
||||
expect(
|
||||
decode('0x01020304')
|
||||
decodeAddress('0x01020304')
|
||||
).toEqual(
|
||||
new Uint8Array([1, 2, 3, 4])
|
||||
);
|
||||
@@ -45,37 +45,37 @@ describe('decodeAddress', (): void => {
|
||||
|
||||
it('decodes a short address', (): void => {
|
||||
expect(
|
||||
decode('F7NZ')
|
||||
decodeAddress('F7NZ')
|
||||
).toEqual(new Uint8Array([1]));
|
||||
});
|
||||
|
||||
it('decodes a 1-byte accountId (with prefix)', (): void => {
|
||||
expect(
|
||||
decode('PqtB', false, 68)
|
||||
decodeAddress('PqtB', false, 68)
|
||||
).toEqual(new Uint8Array([1]));
|
||||
});
|
||||
|
||||
it('decodes a 2-byte accountId', (): void => {
|
||||
expect(
|
||||
decode('2jpAFn', false, 68)
|
||||
decodeAddress('2jpAFn', false, 68)
|
||||
).toEqual(new Uint8Array([0, 1]));
|
||||
});
|
||||
|
||||
it('encodes a 4-byte address', (): void => {
|
||||
expect(
|
||||
decode('as7QnGMf', false, 68)
|
||||
decodeAddress('as7QnGMf', false, 68)
|
||||
).toEqual(new Uint8Array([1, 2, 3, 4]));
|
||||
});
|
||||
|
||||
it('decodes a 8-byte address', (): void => {
|
||||
expect(
|
||||
decode('4q7qY5RBG7Z4wv', false, 68)
|
||||
decodeAddress('4q7qY5RBG7Z4wv', false, 68)
|
||||
).toEqual(new Uint8Array([42, 44, 10, 0, 0, 0, 0, 0]));
|
||||
});
|
||||
|
||||
it('decodes a 33-byte address', (): void => {
|
||||
expect(
|
||||
decode('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
|
||||
decodeAddress('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
|
||||
).toEqual(
|
||||
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
|
||||
);
|
||||
@@ -83,28 +83,28 @@ describe('decodeAddress', (): void => {
|
||||
|
||||
it.skip('allows invalid prefix (in list)', (): void => {
|
||||
expect(
|
||||
(): Uint8Array => decode('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
|
||||
(): Uint8Array => decodeAddress('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
|
||||
).toThrow(/address prefix/);
|
||||
});
|
||||
|
||||
it('fails when length is invalid', (): void => {
|
||||
expect(
|
||||
(): Uint8Array => decode('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
|
||||
(): Uint8Array => decodeAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
|
||||
).toThrow(/address length/);
|
||||
});
|
||||
|
||||
it('fails when the checksum does not match', (): void => {
|
||||
expect(
|
||||
(): Uint8Array => decode('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMa9cj')
|
||||
(): Uint8Array => decodeAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMa9cj')
|
||||
).toThrow(/address checksum/);
|
||||
expect(
|
||||
(): Uint8Array => decode('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaDwU')
|
||||
(): Uint8Array => decodeAddress('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaDwU')
|
||||
).toThrow(/address checksum/);
|
||||
});
|
||||
|
||||
it('fails when invalid base58 encoded address is found', (): void => {
|
||||
expect(
|
||||
() => u8aToHex(decode('F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29'))
|
||||
() => u8aToHex(decodeAddress('F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29'))
|
||||
).toThrow(/Decoding F3opIRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29: Invalid base58 character "I" \(0x49\) at index 4/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -7,12 +7,12 @@ import { Prefix } from './types';
|
||||
|
||||
import { assert, isHex, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import base58Decode from '../base58/decode';
|
||||
import checkChecksum from './checkChecksum';
|
||||
import defaults from './defaults';
|
||||
import { base58Decode } from '../base58/decode';
|
||||
import { checkAddressChecksum } from './checksum';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
export default function decode (encoded: string | Uint8Array, ignoreChecksum?: boolean, ss58Format: Prefix = 99): Uint8Array {
|
||||
export function decodeAddress (encoded: string | Uint8Array, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
|
||||
if (isU8a(encoded) || isHex(encoded)) {
|
||||
return u8aToU8a(encoded);
|
||||
}
|
||||
@@ -30,11 +30,11 @@ export default function decode (encoded: string | Uint8Array, ignoreChecksum?: b
|
||||
assert(defaults.allowedEncodedLengths.includes(decoded.length), wrapError('Invalid decoded address length'));
|
||||
|
||||
// TODO Unless it is an "use everywhere" prefix, throw an error
|
||||
// if (decoded[0] !== prefix) {
|
||||
// console.log(`WARN: Expected ${prefix}, found ${decoded[0]}`);
|
||||
// if (ss58Format !== -1 && (decoded[0] !== ss58Format)) {
|
||||
// console.log(`WARN: Expected ${ss58Format}, found ${decoded[0]}`);
|
||||
// }
|
||||
|
||||
const [isValid, endPos] = checkChecksum(decoded);
|
||||
const [isValid, endPos] = checkAddressChecksum(decoded);
|
||||
|
||||
assert(ignoreChecksum || isValid, wrapError('Invalid decoded address checksum'));
|
||||
|
||||
|
||||
@@ -3,12 +3,10 @@
|
||||
|
||||
import { available } from '@polkadot/networks';
|
||||
|
||||
const defaults = {
|
||||
export const defaults = {
|
||||
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
|
||||
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
|
||||
allowedEncodedLengths: [3, 4, 6, 10, 35, 36],
|
||||
allowedPrefix: available.map(({ prefix }) => prefix),
|
||||
prefix: 42
|
||||
};
|
||||
|
||||
export default defaults;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
import derive from './derive';
|
||||
import { deriveAddress } from '.';
|
||||
|
||||
describe('deriveAddress', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
@@ -12,13 +12,13 @@ describe('deriveAddress', (): void => {
|
||||
|
||||
it('derives a known path', (): void => {
|
||||
expect(
|
||||
derive('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '/joe/polkadot/0')
|
||||
deriveAddress('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '/joe/polkadot/0')
|
||||
).toEqual('5GZ4srnepXvdsuNVoxCGyVZd8ScDm4gkGLTKuaGARy9akjTa');
|
||||
});
|
||||
|
||||
it('fails on hard paths', (): void => {
|
||||
expect(
|
||||
() => derive('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '//bob')
|
||||
() => deriveAddress('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '//bob')
|
||||
).toThrow(/Expected suri to contain a combination of non-hard paths/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,11 +5,11 @@ import { Prefix } from './types';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import DeriveJunction from '../key/DeriveJunction';
|
||||
import { DeriveJunction } from '../key/DeriveJunction';
|
||||
import { keyExtractPath } from '../key';
|
||||
import { schnorrkelDerivePublic } from '../schnorrkel';
|
||||
import decode from './decode';
|
||||
import encode from './encode';
|
||||
import { decodeAddress } from './decode';
|
||||
import { encodeAddress } from './encode';
|
||||
|
||||
/**
|
||||
* @name deriveAddress
|
||||
@@ -17,12 +17,12 @@ import encode from './encode';
|
||||
* @description
|
||||
* Creates a sr25519 derived address based on the input address/publicKey and the uri supplied.
|
||||
*/
|
||||
export default function deriveAddress (who: Uint8Array | string, suri: string, ss58Format?: Prefix): string {
|
||||
export function deriveAddress (who: Uint8Array | string, suri: string, ss58Format?: Prefix): string {
|
||||
const { path } = keyExtractPath(suri);
|
||||
|
||||
assert(path.length && !path.some((path) => path.isHard), 'Expected suri to contain a combination of non-hard paths');
|
||||
|
||||
return encode(path.reduce((publicKey: Uint8Array, path: DeriveJunction): Uint8Array => {
|
||||
return encodeAddress(path.reduce((publicKey: Uint8Array, path: DeriveJunction): Uint8Array => {
|
||||
return schnorrkelDerivePublic(publicKey, path.chainCode);
|
||||
}, decode(who)), ss58Format);
|
||||
}, decodeAddress(who)), ss58Format);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '@polkadot/keyring/testingPairs';
|
||||
import { createTestPairs } from '@polkadot/keyring/testingPairs';
|
||||
|
||||
import encode from './encode';
|
||||
import { encodeAddress } from '.';
|
||||
|
||||
const keyring = testingPairs({ type: 'ed25519' }, false);
|
||||
const keyring = createTestPairs({ type: 'ed25519' }, false);
|
||||
|
||||
describe('encode', (): void => {
|
||||
it('encodes an address to a valid value', (): void => {
|
||||
@@ -16,19 +16,19 @@ describe('encode', (): void => {
|
||||
|
||||
it('can re-encode an address', (): void => {
|
||||
expect(
|
||||
encode('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 68)
|
||||
encodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 68)
|
||||
).toEqual('7sL6eNJj5ZGV5cn3hhV2deRUsivXfBfMH76wCALCqWj1EKzv');
|
||||
});
|
||||
|
||||
it('can re-encode an address to Polkadot live', (): void => {
|
||||
expect(
|
||||
encode('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 0)
|
||||
encodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 0)
|
||||
).toEqual('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5');
|
||||
});
|
||||
|
||||
it('fails when non-valid publicKey provided', (): void => {
|
||||
expect(
|
||||
(): string => encode(
|
||||
(): string => encodeAddress(
|
||||
keyring.alice.publicKey.slice(0, 30)
|
||||
)
|
||||
).toThrow(/Expected a valid key/);
|
||||
@@ -36,7 +36,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes a 1-byte address', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([1])
|
||||
)
|
||||
).toEqual('F7NZ');
|
||||
@@ -44,7 +44,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes a 1-byte address (with prefix)', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([1]), 68
|
||||
)
|
||||
).toEqual('PqtB');
|
||||
@@ -52,7 +52,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes a 2-byte address', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([0, 1]), 68
|
||||
)
|
||||
).toEqual('2jpAFn');
|
||||
@@ -60,7 +60,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes a 4-byte address', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([1, 2, 3, 4]), 68
|
||||
)
|
||||
).toEqual('as7QnGMf');
|
||||
@@ -68,7 +68,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes a 8-byte address', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([42, 44, 10, 0, 0, 0, 0, 0]), 68
|
||||
)
|
||||
).toEqual('4q7qY5RBG7Z4wv');
|
||||
@@ -76,7 +76,7 @@ describe('encode', (): void => {
|
||||
|
||||
it('encodes an 33-byte address', (): void => {
|
||||
expect(
|
||||
encode('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
|
||||
encodeAddress('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
|
||||
).toEqual('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -7,14 +7,14 @@ import { Prefix } from './types';
|
||||
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import base58Encode from '../base58/encode';
|
||||
import decode from './decode';
|
||||
import defaults from './defaults';
|
||||
import sshash from './sshash';
|
||||
import { base58Encode } from '../base58/encode';
|
||||
import { decodeAddress } from './decode';
|
||||
import { defaults } from './defaults';
|
||||
import { sshash } from './sshash';
|
||||
|
||||
export default function encode (_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 = decode(_key);
|
||||
const key = decodeAddress(_key);
|
||||
|
||||
assert(defaults.allowedDecodedLengths.includes(key.length), `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import encodeDerivedAddress from './encodeDerived';
|
||||
import { encodeDerivedAddress } from '.';
|
||||
|
||||
describe('encodeDerivedAddress', (): void => {
|
||||
it('creates a valid known derived address', (): void => {
|
||||
|
||||
@@ -5,9 +5,9 @@ import { Prefix } from './types';
|
||||
|
||||
import BN from 'bn.js';
|
||||
|
||||
import decode from './decode';
|
||||
import encode from './encode';
|
||||
import keyDerived from './keyDerived';
|
||||
import { decodeAddress } from './decode';
|
||||
import { encodeAddress } from './encode';
|
||||
import { createKeyDerived } from './keyDerived';
|
||||
|
||||
/**
|
||||
* @name encodeDerivedAddress
|
||||
@@ -15,6 +15,6 @@ import keyDerived from './keyDerived';
|
||||
* @description
|
||||
* Creates a Substrate derived address based on the input address/publicKey and the index supplied.
|
||||
*/
|
||||
export default function encodeDerivedAddress (who: Uint8Array | string, index: BigInt | BN | number, ss58Format?: Prefix): string {
|
||||
return encode(keyDerived(decode(who), index), ss58Format);
|
||||
export function encodeDerivedAddress (who: Uint8Array | string, index: BigInt | BN | number, ss58Format?: Prefix): string {
|
||||
return encodeAddress(createKeyDerived(decodeAddress(who), index), ss58Format);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import encodeMultiAddress from './encodeMulti';
|
||||
import { encodeMultiAddress } from '.';
|
||||
|
||||
describe('encodeMultiAddress', (): void => {
|
||||
it('creates a valid known multi address', (): void => {
|
||||
|
||||
@@ -5,8 +5,8 @@ import { Prefix } from './types';
|
||||
|
||||
import BN from 'bn.js';
|
||||
|
||||
import encode from './encode';
|
||||
import keyMulti from './keyMulti';
|
||||
import { encodeAddress } from './encode';
|
||||
import { createKeyMulti } from './keyMulti';
|
||||
|
||||
/**
|
||||
* @name encodeMultiAddress
|
||||
@@ -14,6 +14,6 @@ import keyMulti from './keyMulti';
|
||||
* @description
|
||||
* Creates a Substrate multisig address based on the input address and the required threshold.
|
||||
*/
|
||||
export default function encodeMultiAddress (who: (Uint8Array | string)[], threshold: BigInt | BN | number, ss58Format?: Prefix): string {
|
||||
return encode(keyMulti(who, threshold), ss58Format);
|
||||
export function encodeMultiAddress (who: (Uint8Array | string)[], threshold: BigInt | BN | number, ss58Format?: Prefix): string {
|
||||
return encodeAddress(createKeyMulti(who, threshold), ss58Format);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '@polkadot/keyring/testingPairs';
|
||||
import { createTestPairs } from '@polkadot/keyring/testingPairs';
|
||||
import { addressEq } from '.';
|
||||
|
||||
describe('addressEq', (): void => {
|
||||
@@ -33,7 +33,7 @@ describe('addressEq', (): void => {
|
||||
});
|
||||
|
||||
it('returns true for equal, address vs publicKey', (): void => {
|
||||
const keyring = testingPairs({ type: 'sr25519' });
|
||||
const keyring = createTestPairs({ type: 'sr25519' });
|
||||
|
||||
expect(
|
||||
addressEq(
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { u8aEq } from '@polkadot/util';
|
||||
|
||||
import decode from './decode';
|
||||
import { decodeAddress } from './decode';
|
||||
|
||||
/**
|
||||
* @name addressEq
|
||||
@@ -19,6 +19,6 @@ import decode from './decode';
|
||||
* u8aEq(new Uint8Array([0x68, 0x65]), new Uint8Array([0x68, 0x65])); // true
|
||||
* ```
|
||||
*/
|
||||
export default function addressEq (a: string | Uint8Array, b: string | Uint8Array): boolean {
|
||||
return u8aEq(decode(a), decode(b));
|
||||
export function addressEq (a: string | Uint8Array, b: string | Uint8Array): boolean {
|
||||
return u8aEq(decodeAddress(a), decodeAddress(b));
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import evmToAddress from './evmToAddress';
|
||||
import { evmToAddress } from '.';
|
||||
|
||||
describe('evmToAddress', (): void => {
|
||||
it('creates a valid known SS58 address', (): void => {
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import encode from './encode';
|
||||
import { Prefix } from './types';
|
||||
|
||||
import hasher from '../secp256k1/hasher';
|
||||
import { HashType } from '../secp256k1/types';
|
||||
|
||||
import { u8aConcat } from '@polkadot/util';
|
||||
|
||||
import { secp256k1Hasher } from '../secp256k1/hasher';
|
||||
import { HashType } from '../secp256k1/types';
|
||||
import { encodeAddress } from './encode';
|
||||
|
||||
/**
|
||||
* @name evmToAddress
|
||||
* @summary Converts an EVM address to its corresponding SS58 address.
|
||||
*/
|
||||
export default function evmToAddress (evmAddress: string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
|
||||
export function evmToAddress (evmAddress: string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
|
||||
const wrapError = (message: string) => `Converting ${evmAddress as string}: ${message}`;
|
||||
|
||||
const message = u8aConcat('evm:', evmAddress);
|
||||
@@ -22,7 +22,7 @@ export default function evmToAddress (evmAddress: string | Uint8Array, ss58Forma
|
||||
throw new Error(wrapError('Invalid evm address length'));
|
||||
}
|
||||
|
||||
const address = hasher(hashType, message);
|
||||
const address = secp256k1Hasher(hashType, message);
|
||||
|
||||
return encode(address, ss58Format);
|
||||
return encodeAddress(address, ss58Format);
|
||||
}
|
||||
|
||||
@@ -1,34 +1,17 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import addressToEvm from './addressToEvm';
|
||||
import checkAddress from './check';
|
||||
import checkAddressChecksum from './checkChecksum';
|
||||
import createKeyMulti from './keyMulti';
|
||||
import createKeyDerived from './keyDerived';
|
||||
import decodeAddress from './decode';
|
||||
import deriveAddress from './derive';
|
||||
import encodeAddress from './encode';
|
||||
import encodeDerivedAddress from './encodeDerived';
|
||||
import encodeMultiAddress from './encodeMulti';
|
||||
import evmToAddress from './evmToAddress';
|
||||
import addressEq from './eq';
|
||||
import setSS58Format from './setSS58Format';
|
||||
import sortAddresses from './sort';
|
||||
|
||||
export {
|
||||
addressEq,
|
||||
addressToEvm,
|
||||
checkAddress,
|
||||
checkAddressChecksum,
|
||||
createKeyDerived,
|
||||
createKeyMulti,
|
||||
decodeAddress,
|
||||
deriveAddress,
|
||||
encodeAddress,
|
||||
encodeDerivedAddress,
|
||||
encodeMultiAddress,
|
||||
evmToAddress,
|
||||
setSS58Format,
|
||||
sortAddresses
|
||||
};
|
||||
export { addressToEvm } from './addressToEvm';
|
||||
export { checkAddress } from './check';
|
||||
export { checkAddressChecksum } from './checksum';
|
||||
export { createKeyMulti } from './keyMulti';
|
||||
export { createKeyDerived } from './keyDerived';
|
||||
export { decodeAddress } from './decode';
|
||||
export { deriveAddress } from './derive';
|
||||
export { encodeAddress } from './encode';
|
||||
export { encodeDerivedAddress } from './encodeDerived';
|
||||
export { encodeMultiAddress } from './encodeMulti';
|
||||
export { evmToAddress } from './evmToAddress';
|
||||
export { addressEq } from './eq';
|
||||
export { setSS58Format } from './setSS58Format';
|
||||
export { sortAddresses } from './sort';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import createKeyDerived from './keyDerived';
|
||||
import { createKeyDerived } from '.';
|
||||
|
||||
describe('createKeyDerived', (): void => {
|
||||
it('matches sub accounts with Rust', (): void => {
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
import BN from 'bn.js';
|
||||
import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import blake2AsU8a from '../blake2/asU8a';
|
||||
import decodeAddress from './decode';
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
import { decodeAddress } from './decode';
|
||||
|
||||
const PREFIX = stringToU8a('modlpy/utilisuba');
|
||||
|
||||
export default function createKeyDerived (who: Uint8Array | string, index: BigInt | BN | number): Uint8Array {
|
||||
export function createKeyDerived (who: Uint8Array | string, index: BigInt | BN | number): Uint8Array {
|
||||
return blake2AsU8a(
|
||||
u8aConcat(
|
||||
PREFIX,
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
import BN from 'bn.js';
|
||||
import { bnToU8a, compactToU8a, stringToU8a, u8aConcat, u8aSorted } from '@polkadot/util';
|
||||
|
||||
import blake2AsU8a from '../blake2/asU8a';
|
||||
import decodeAddress from './decode';
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
import { decodeAddress } from './decode';
|
||||
|
||||
const PREFIX = stringToU8a('modlpy/utilisuba');
|
||||
|
||||
export default function createKeyMulti (who: (Uint8Array | string)[], threshold: BigInt | BN | number): Uint8Array {
|
||||
export function createKeyMulti (who: (Uint8Array | string)[], threshold: BigInt | BN | number): Uint8Array {
|
||||
return blake2AsU8a(
|
||||
u8aConcat(
|
||||
PREFIX,
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import encode from './encode';
|
||||
import setSS58Format from './setSS58Format';
|
||||
import { encodeAddress, setSS58Format } from '.';
|
||||
|
||||
describe('setSS58Format', (): void => {
|
||||
beforeEach((): void => {
|
||||
@@ -11,7 +10,7 @@ describe('setSS58Format', (): void => {
|
||||
|
||||
it('sets and allows encoding using', (): void => {
|
||||
expect(
|
||||
encode(
|
||||
encodeAddress(
|
||||
new Uint8Array([1])
|
||||
)
|
||||
).toEqual('PqtB');
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
|
||||
import { Prefix } from './types';
|
||||
|
||||
import defaults from './defaults';
|
||||
import { defaults } from './defaults';
|
||||
|
||||
/**
|
||||
* @description Sets the global SS58 format to use for address encoding
|
||||
* @deprecated Use keyring.setSS58Format
|
||||
*/
|
||||
export default function setSS58Format (prefix: Prefix): void {
|
||||
export function setSS58Format (prefix: Prefix): void {
|
||||
defaults.prefix = prefix;
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@ import { Prefix } from './types';
|
||||
|
||||
import { u8aSorted } from '@polkadot/util';
|
||||
|
||||
import decodeAddress from './decode';
|
||||
import encodeAddress from './encode';
|
||||
import { decodeAddress } from './decode';
|
||||
import { encodeAddress } from './encode';
|
||||
|
||||
export default function sortAddresses (addresses: (Uint8Array | string)[], ss58Format?: Prefix): string[] {
|
||||
export function sortAddresses (addresses: (Uint8Array | string)[], ss58Format?: Prefix): string[] {
|
||||
return u8aSorted(
|
||||
addresses.map((who) => decodeAddress(who))
|
||||
).map((u8a) => encodeAddress(u8a, ss58Format));
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
|
||||
import { stringToU8a, u8aConcat } from '@polkadot/util';
|
||||
|
||||
import blake2AsU8a from '../blake2/asU8a';
|
||||
import { blake2AsU8a } from '../blake2/asU8a';
|
||||
|
||||
const SS58_PREFIX = stringToU8a('SS58PRE');
|
||||
|
||||
export default function hash (key: Uint8Array): Uint8Array {
|
||||
export function sshash (key: Uint8Array): Uint8Array {
|
||||
return blake2AsU8a(u8aConcat(SS58_PREFIX, key), 512);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { BASE32_ALPHABET, BITS_PER_CHAR } from './bs32';
|
||||
import validate from './validate';
|
||||
import { base32Validate } from './validate';
|
||||
|
||||
// Build the character lookup table:
|
||||
const LOOKUP = BASE32_ALPHABET
|
||||
@@ -17,31 +17,42 @@ const LOOKUP = BASE32_ALPHABET
|
||||
return lookup;
|
||||
}, {});
|
||||
|
||||
/** @internal */
|
||||
function decode (output: Uint8Array, input: string, offset: number): [Uint8Array, number, number] {
|
||||
let bits = 0;
|
||||
let buffer = 0;
|
||||
let written = 0;
|
||||
|
||||
for (let i = offset; i < input.length; i++) {
|
||||
buffer = (buffer << BITS_PER_CHAR) | LOOKUP[input[i]];
|
||||
bits += BITS_PER_CHAR;
|
||||
|
||||
if (bits >= 8) {
|
||||
bits -= 8;
|
||||
output[written++] = 0xff & (buffer >> bits);
|
||||
}
|
||||
}
|
||||
|
||||
return [output, bits, buffer];
|
||||
}
|
||||
|
||||
/**
|
||||
* @name base32Decode
|
||||
* @summary Delookup a base32 value.
|
||||
* @description
|
||||
* From the provided input, decode the base32 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export default function base32Decode (value: string, ipfsCompat = false): Uint8Array {
|
||||
validate(value, ipfsCompat);
|
||||
export function base32Decode (value: string, ipfsCompat = false): Uint8Array {
|
||||
base32Validate(value, ipfsCompat);
|
||||
|
||||
const out = new Uint8Array(((value.length - (ipfsCompat ? 1 : 0)) * BITS_PER_CHAR / 8) | 0);
|
||||
let bits = 0;
|
||||
let buffer = 0;
|
||||
let written = 0;
|
||||
|
||||
for (let i = (ipfsCompat ? 1 : 0); i < value.length; ++i) {
|
||||
buffer = (buffer << BITS_PER_CHAR) | LOOKUP[value[i]];
|
||||
bits += BITS_PER_CHAR;
|
||||
|
||||
if (bits >= 8) {
|
||||
bits -= 8;
|
||||
out[written++] = 0xff & (buffer >> bits);
|
||||
}
|
||||
}
|
||||
const offset = (ipfsCompat ? 1 : 0);
|
||||
const [output, bits, buffer] = decode(
|
||||
new Uint8Array(((value.length - offset) * BITS_PER_CHAR / 8) | 0),
|
||||
value,
|
||||
offset
|
||||
);
|
||||
|
||||
assert(!(bits >= BITS_PER_CHAR || 0xff & (buffer << (8 - bits))), 'Unexpected end of data');
|
||||
|
||||
return out;
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ const MASK = (1 << BITS_PER_CHAR) - 1;
|
||||
* @description
|
||||
* From the provided input, create the base32 and return the result as a string.
|
||||
*/
|
||||
export default function base32Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat = false): string {
|
||||
export function base32Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat = false): string {
|
||||
const u8a = u8aToU8a(value);
|
||||
let out = '';
|
||||
let bits = 0;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @summary Encode and decode base32 values
|
||||
*/
|
||||
|
||||
export { default as base32Decode } from './decode';
|
||||
export { default as base32Encode } from './encode';
|
||||
export { default as base32Validate } from './validate';
|
||||
export { default as isBase32 } from './is';
|
||||
export { base32Decode } from './decode';
|
||||
export { base32Encode } from './encode';
|
||||
export { base32Validate } from './validate';
|
||||
export { isBase32 } from './is';
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import validate from './validate';
|
||||
import { base32Validate } from './validate';
|
||||
|
||||
export default function isBase32 (value?: string | null): boolean {
|
||||
export function testValidator (validate: (value?: string | null, ipfsCompat?: boolean) => boolean, value?: string | null, ipfsCompat?: boolean): boolean {
|
||||
try {
|
||||
return validate(value);
|
||||
return validate(value, ipfsCompat);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function isBase32 (value?: string | null, ipfsCompat?: boolean): boolean {
|
||||
return testValidator(base32Validate, value, ipfsCompat);
|
||||
}
|
||||
|
||||
@@ -4,12 +4,14 @@
|
||||
import { validateChars } from '../base58/validate';
|
||||
import { BASE32_ALPHABET } from './bs32';
|
||||
|
||||
const BASE_CONFIG = { alphabet: BASE32_ALPHABET, ipfsChar: 'b', type: 'base32' };
|
||||
|
||||
/**
|
||||
* @name base32Validate
|
||||
* @summary Validates a base32 value.
|
||||
* @description
|
||||
* Validates the the supplied value is valid base32
|
||||
*/
|
||||
export default function base32Validate (value?: string | null, ipfsCompat = false): true {
|
||||
return validateChars('base32', BASE32_ALPHABET, value, ipfsCompat ? 'b' : undefined);
|
||||
export function base32Validate (value?: string | null, ipfsCompat?: boolean): true {
|
||||
return validateChars(BASE_CONFIG, value, ipfsCompat);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { bufferToU8a } from '@polkadot/util';
|
||||
|
||||
import { bs58 } from './bs58';
|
||||
import validate from './validate';
|
||||
import { base58Validate } from './validate';
|
||||
|
||||
/**
|
||||
* @name base58Decode
|
||||
@@ -12,8 +12,8 @@ import validate from './validate';
|
||||
* @description
|
||||
* From the provided input, decode the base58 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export default function base58Decode (value: string, ipfsCompat?: boolean): Uint8Array {
|
||||
validate(value, ipfsCompat);
|
||||
export function base58Decode (value: string, ipfsCompat?: boolean): Uint8Array {
|
||||
base58Validate(value, ipfsCompat);
|
||||
|
||||
return bufferToU8a(bs58.decode(value.substr(ipfsCompat ? 1 : 0)));
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import { bs58 } from './bs58';
|
||||
* @description
|
||||
* From the provided input, create the base58 and return the result as a string.
|
||||
*/
|
||||
export default function base58Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat?: boolean): string {
|
||||
export function base58Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat?: boolean): string {
|
||||
const out = bs58.encode(
|
||||
u8aToBuffer(u8aToU8a(value))
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @summary Encode and decode base58 values
|
||||
*/
|
||||
|
||||
export { default as base58Decode } from './decode';
|
||||
export { default as base58Encode } from './encode';
|
||||
export { default as base58Validate } from './validate';
|
||||
export { default as isBase58 } from './is';
|
||||
export { base58Decode } from './decode';
|
||||
export { base58Encode } from './encode';
|
||||
export { base58Validate } from './validate';
|
||||
export { isBase58 } from './is';
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import validate from './validate';
|
||||
import { testValidator } from '../base32/is';
|
||||
import { base58Validate } from './validate';
|
||||
|
||||
export default function isBase58 (value?: string | null, ipfsCompat?: boolean): boolean {
|
||||
try {
|
||||
return validate(value, ipfsCompat);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
export function isBase58 (value?: string | null, ipfsCompat?: boolean): boolean {
|
||||
return testValidator(base58Validate, value, ipfsCompat);
|
||||
}
|
||||
|
||||
@@ -5,11 +5,19 @@ import { assert } from '@polkadot/util';
|
||||
|
||||
import { BASE58_ALPHABET } from './bs58';
|
||||
|
||||
export function validateChars (type: string, alphabet: string, value?: string | null, startChar?: string): true {
|
||||
assert(value, `Expected non-null, non-empty ${type} input`);
|
||||
assert(!startChar || value[0] === startChar, `Expected ${type} to start with '${startChar || ''}'`);
|
||||
interface CheckConfig {
|
||||
alphabet: string;
|
||||
ipfsChar: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
for (let i = (startChar ? 1 : 0); i < value.length; i++) {
|
||||
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}'`);
|
||||
|
||||
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}`);
|
||||
}
|
||||
|
||||
@@ -22,6 +30,6 @@ export function validateChars (type: string, alphabet: string, value?: string |
|
||||
* @description
|
||||
* Validates the the supplied value is valid base58
|
||||
*/
|
||||
export default function base58Validate (value?: string | null, ipfsCompat = false): true {
|
||||
return validateChars('base58', BASE58_ALPHABET, value, ipfsCompat ? 'z' : undefined);
|
||||
export function base58Validate (value?: string | null, ipfsCompat?: boolean): true {
|
||||
return validateChars(BASE_CONFIG, value, ipfsCompat);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { bufferToU8a } from '@polkadot/util';
|
||||
|
||||
import validate from './validate';
|
||||
import { base64Validate } from './validate';
|
||||
|
||||
/**
|
||||
* @name base64Decode
|
||||
@@ -11,8 +11,8 @@ import validate from './validate';
|
||||
* @description
|
||||
* From the provided input, decode the base64 and return the result as an `Uint8Array`.
|
||||
*/
|
||||
export default function base64Decode (value: string): Uint8Array {
|
||||
validate(value);
|
||||
export function base64Decode (value: string): Uint8Array {
|
||||
base64Validate(value);
|
||||
|
||||
return bufferToU8a(Buffer.from(value, 'base64'));
|
||||
}
|
||||
|
||||
@@ -9,6 +9,6 @@ import { u8aToBuffer, u8aToU8a } from '@polkadot/util';
|
||||
* @description
|
||||
* From the provided input, create the base64 and return the result as a string.
|
||||
*/
|
||||
export default function base58Encode (value: Uint8Array | string | Buffer | number[]): string {
|
||||
export function base64Encode (value: Uint8Array | string | Buffer | number[]): string {
|
||||
return u8aToBuffer(u8aToU8a(value)).toString('base64');
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
* @summary Encode and decode base64 values
|
||||
*/
|
||||
|
||||
export { default as base64Decode } from './decode';
|
||||
export { default as base64Encode } from './encode';
|
||||
export { default as base64Pad } from './pad';
|
||||
export { default as base64Trim } from './trim';
|
||||
export { default as base64Validate } from './validate';
|
||||
export { default as isBase64 } from './is';
|
||||
export { base64Decode } from './decode';
|
||||
export { base64Encode } from './encode';
|
||||
export { base64Pad } from './pad';
|
||||
export { base64Trim } from './trim';
|
||||
export { base64Validate } from './validate';
|
||||
export { isBase64 } from './is';
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import validate from './validate';
|
||||
import { base64Validate } from './validate';
|
||||
|
||||
export default function isBase64 (value?: string | null): boolean {
|
||||
export function isBase64 (value?: string | null): boolean {
|
||||
try {
|
||||
return validate(value);
|
||||
return base64Validate(value);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export default function base64Trim (value: string): string {
|
||||
export function base64Pad (value: string): string {
|
||||
return value.padEnd(value.length + (value.length % 4), '=');
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export default function base64Trim (value: string): string {
|
||||
export function base64Trim (value: string): string {
|
||||
while (value.length && value[value.length - 1] === '=') {
|
||||
value = value.slice(0, -1);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import { assert } from '@polkadot/util';
|
||||
* @description
|
||||
* Validates the the supplied value is valid base64
|
||||
*/
|
||||
export default function base64Validate (value?: string | null): true {
|
||||
export function base64Validate (value?: string | null): true {
|
||||
assert(value, 'Expected non-null, non-empty base64 input');
|
||||
assert(/^(?:[A-Za-z0-9+/]{2}[A-Za-z0-9+/]{2})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value), 'Invalid base64 encoding');
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
|
||||
import blake2AsU8a from './asU8a';
|
||||
import { blake2AsU8a } from './asU8a';
|
||||
|
||||
/**
|
||||
* @name blake2AsHex
|
||||
@@ -19,7 +19,7 @@ import blake2AsU8a from './asU8a';
|
||||
* blake2AsHex('abc'); // => 0xba80a53f981c4d0d
|
||||
* ```
|
||||
*/
|
||||
export default function blake2AsHex (data: Uint8Array | string, bitLength = 256): string {
|
||||
export function blake2AsHex (data: Uint8Array | string, bitLength = 256): string {
|
||||
return u8aToHex(
|
||||
blake2AsU8a(data, bitLength)
|
||||
);
|
||||
|
||||
@@ -11,36 +11,44 @@ describe('blake2AsU8a', (): void => {
|
||||
await waitReady();
|
||||
});
|
||||
|
||||
it('returns a 64-bit value by default', (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc')
|
||||
).toEqual(
|
||||
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
|
||||
);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns a 64-bit value by default (onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', undefined, undefined, onlyJs)
|
||||
).toEqual(
|
||||
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns a 128-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 128)
|
||||
).toEqual(
|
||||
new Uint8Array([207, 74, 183, 145, 198, 43, 141, 43, 33, 9, 201, 2, 117, 40, 120, 22])
|
||||
);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns a 128-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 128, undefined, onlyJs)
|
||||
).toEqual(
|
||||
new Uint8Array([207, 74, 183, 145, 198, 43, 141, 43, 33, 9, 201, 2, 117, 40, 120, 22])
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns a 256-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 256)
|
||||
).toEqual(
|
||||
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
|
||||
);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns a 256-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 256, undefined, onlyJs)
|
||||
).toEqual(
|
||||
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns a 512-bit value (as specified)', (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 512)
|
||||
).toEqual(
|
||||
hexToU8a('0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923')
|
||||
);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns a 512-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
blake2AsU8a('abc', 512, undefined, onlyJs)
|
||||
).toEqual(
|
||||
hexToU8a('0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923')
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('has equivalent Wasm/Js outputs on hex inputs', (): void => {
|
||||
|
||||
@@ -19,7 +19,7 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto';
|
||||
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa53, 0xf98, 0x1c, 0x4d, 0x0d]
|
||||
* ```
|
||||
*/
|
||||
export default function blake2AsU8a (data: Uint8Array | string, bitLength = 256, key: Uint8Array | null = null, onlyJs = false): Uint8Array {
|
||||
export function blake2AsU8a (data: Uint8Array | string, bitLength = 256, key: Uint8Array | null = null, onlyJs = false): Uint8Array {
|
||||
const byteLength = Math.ceil(bitLength / 8);
|
||||
|
||||
return isReady() && !onlyJs
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
* @summary Create blake2b values with specified bitlengths
|
||||
*/
|
||||
|
||||
export { default as blake2AsHex } from './asHex';
|
||||
export { default as blake2AsU8a } from './asU8a';
|
||||
export { blake2AsHex } from './asHex';
|
||||
export { blake2AsU8a } from './asU8a';
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import wasmCrypto from '@polkadot/wasm-crypto';
|
||||
import { isReady, waitReady } from '@polkadot/wasm-crypto';
|
||||
|
||||
export function cryptoIsReady (): boolean {
|
||||
return wasmCrypto.isReady();
|
||||
return isReady();
|
||||
}
|
||||
|
||||
export function cryptoWaitReady (): Promise<boolean> {
|
||||
return wasmCrypto
|
||||
.waitReady()
|
||||
return waitReady()
|
||||
.then((): boolean => true)
|
||||
.catch((error): boolean => {
|
||||
console.error('Unable to initialize @polkadot/util-crypto', error);
|
||||
@@ -0,0 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { cryptoWaitReady } from './crypto';
|
||||
|
||||
// start init process immediately
|
||||
cryptoWaitReady().catch((): void => {
|
||||
// shouldn't happen, logged above
|
||||
});
|
||||
@@ -14,7 +14,7 @@ function getH160 (u8a: Uint8Array): Uint8Array {
|
||||
return u8a.slice(-20);
|
||||
}
|
||||
|
||||
export default function ethereumEncode (addressOrPublic?: string | Uint8Array): string {
|
||||
export function ethereumEncode (addressOrPublic?: string | Uint8Array): string {
|
||||
if (!addressOrPublic) {
|
||||
return '0x';
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export { default as ethereumEncode } from './encode';
|
||||
export { default as isEthereumAddress } from './isAddress';
|
||||
export { default as isEthereumChecksum } from './isChecksum';
|
||||
export { ethereumEncode } from './encode';
|
||||
export { isEthereumAddress } from './isAddress';
|
||||
export { isEthereumChecksum } from './isChecksum';
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
import { isHex } from '@polkadot/util';
|
||||
|
||||
import isEthereumChecksum from './isChecksum';
|
||||
import { isEthereumChecksum } from './isChecksum';
|
||||
|
||||
export default function isEthereumAddress (address?: string): boolean {
|
||||
export function isEthereumAddress (address?: string): boolean {
|
||||
if (!address || address.length !== 42 || !isHex(address)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5,15 +5,16 @@ import { u8aToHex } from '@polkadot/util';
|
||||
|
||||
import { keccakAsU8a } from '../keccak';
|
||||
|
||||
export default function isEthereumChecksum (_address: string): boolean {
|
||||
function isInvalidChar (char: string, byte: number): boolean {
|
||||
return (byte > 7 && char !== char.toUpperCase()) || (byte <= 7 && char !== char.toLowerCase());
|
||||
}
|
||||
|
||||
export function isEthereumChecksum (_address: string): boolean {
|
||||
const address = _address.replace('0x', '');
|
||||
const hash = u8aToHex(keccakAsU8a(address.toLowerCase()), -1, false);
|
||||
|
||||
for (let index = 0; index < 40; index++) {
|
||||
const char = address[index];
|
||||
const hashval = parseInt(hash[index], 16);
|
||||
|
||||
if ((hashval > 7 && char !== char.toUpperCase()) || (hashval <= 7 && char !== char.toLowerCase())) {
|
||||
if (isInvalidChar(address[index], parseInt(hash[index], 16))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ const ADDRESS = '0x00a329c0648769A73afAc7F9381E08FB43dBEA72';
|
||||
|
||||
describe('isEthereumChecksum', () => {
|
||||
it('returns false on invalid address', () => {
|
||||
expect(isEthereumChecksum('0xinvalid')).toBe(false);
|
||||
expect(isEthereumChecksum('0x00a329c0648769')).toBe(false);
|
||||
});
|
||||
|
||||
it('returns false on non-checksum address', () => {
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// polyfills
|
||||
import './polyfill';
|
||||
import './cryptoInit';
|
||||
|
||||
// out of order and early in the chain, this also kicks off initialization on require
|
||||
export * from './init';
|
||||
export * from './crypto';
|
||||
|
||||
// all internal exports
|
||||
export * from './address';
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
|
||||
import keccakAsU8a from './asU8a';
|
||||
import { keccakAsU8a } from './asU8a';
|
||||
|
||||
/**
|
||||
* @name keccakAsHex
|
||||
@@ -19,7 +19,7 @@ import keccakAsU8a from './asU8a';
|
||||
* keccakAsHex('123'); // => 0x...
|
||||
* ```
|
||||
*/
|
||||
export default function keccakAsHex (value: Buffer | Uint8Array | string): string {
|
||||
export function keccakAsHex (value: Buffer | Uint8Array | string): string {
|
||||
return u8aToHex(
|
||||
keccakAsU8a(value)
|
||||
);
|
||||
|
||||
@@ -16,25 +16,27 @@ describe('keccakAsU8a', (): void => {
|
||||
'0x2d07364b5c231c56ce63d49430e085ea3033c750688ba532b24029124c26ca5e'
|
||||
);
|
||||
|
||||
it('returns an hex representation (string)', (): void => {
|
||||
expect(
|
||||
keccakAsU8a(input)
|
||||
).toEqual(output);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns an hex representation (string, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
keccakAsU8a(input, onlyJs)
|
||||
).toEqual(output);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an hex representation (Buffer)', (): void => {
|
||||
expect(
|
||||
keccakAsU8a(
|
||||
Buffer.from(input)
|
||||
)
|
||||
).toEqual(output);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns an hex representation (Buffer, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
keccakAsU8a(Buffer.from(input), onlyJs)
|
||||
).toEqual(output);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an hex representation (Uint8Array)', (): void => {
|
||||
expect(
|
||||
keccakAsU8a(
|
||||
stringToU8a(input)
|
||||
)
|
||||
).toEqual(output);
|
||||
[false, true].forEach((onlyJs): void => {
|
||||
it(`returns an hex representation (Uint8Array, onlyJs=${onlyJs.toString()})`, (): void => {
|
||||
expect(
|
||||
keccakAsU8a(stringToU8a(input), onlyJs)
|
||||
).toEqual(output);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user