Compare commits

...
85 Commits
Author SHA1 Message Date
Github Actions 8acc5680ac [CI Skip] release/stable 4.1.1
skip-checks: true
2020-11-15 14:42:02 +00:00
Jaco Greeff 4d54ce4686 4.1 (#768) 2020-11-15 15:37:22 +01:00
Github Actions 441e89edd7 [CI Skip] release/beta 4.0.2-14
skip-checks: true
2020-11-15 11:49:59 +00:00
Jaco Greeff f1da9f05fb Cleanup/simplify ETH signing (#767)
* Cleanup/simplify ETH signing

* Cleanup options

* Adjust ETH tests

* checksummed

* mutli ethereum
2020-11-15 12:45:09 +01:00
Github Actions 464d2d38b4 [CI Skip] release/beta 4.0.2-13
skip-checks: true
2020-11-15 09:36:48 +00:00
Jaco Greeff 1ea282c803 Bump deps (#766) 2020-11-15 10:32:04 +01:00
Github Actions 974559bf2e [CI Skip] release/beta 4.0.2-12
skip-checks: true
2020-11-11 10:54:28 +00:00
Jaco Greeff c353003c70 Bump dev (#765) 2020-11-11 11:49:33 +01:00
Github Actions 623bde1a61 [CI Skip] release/beta 4.0.2-11
skip-checks: true
2020-11-10 16:38:24 +00:00
Jaco Greeff 67234fc013 Bumps 2020-11-10 17:32:44 +01:00
Github Actions 4a6d6d647a [CI Skip] release/beta 4.0.2-10
skip-checks: true
2020-11-10 15:12:55 +00:00
Jaco Greeff b375b6c2d5 Mark detectPackage as sideEffects (#764) 2020-11-10 16:07:53 +01:00
Github Actions 1c6fd4558c [CI Skip] release/beta 4.0.2-9
skip-checks: true
2020-11-10 14:40:14 +00:00
Antoine Estienne 3800ffd61a Add eth tests and truncate address for keccak (#763)
* add eth tests and truncate address for keccak

* lint

* refactor
2020-11-10 15:34:45 +01:00
Github Actions d447ed8fc9 [CI Skip] release/beta 4.0.2-8
skip-checks: true
2020-11-10 11:30:18 +00:00
Jaco Greeff abb1062462 Re-enable esm modules (#762) 2020-11-10 12:25:05 +01:00
Github Actions c6bdf78606 [CI Skip] release/beta 4.0.2-7
skip-checks: true
2020-11-09 21:32:14 +00:00
Jaco Greeff 7687d5bf00 Unused esnext 2020-11-09 22:26:52 +01:00
Github Actions 5b246891d7 [CI Skip] release/beta 4.0.2-6
skip-checks: true
2020-11-09 21:15:15 +00:00
Jaco Greeff 3b9617faf4 Extract detectPackage /cryptoWait as side effect (#761) 2020-11-09 22:09:53 +01:00
Github Actions aa57da0806 [CI Skip] release/beta 4.0.2-5
skip-checks: true
2020-11-09 15:34:11 +00:00
Jaco Greeff 66841bba88 Build esnext outputs (#760) 2020-11-09 16:28:42 +01:00
Github Actions 7d963e3602 [CI Skip] release/beta 4.0.2-4
skip-checks: true
2020-11-08 20:40:03 +00:00
Jaco Greeff 82b25aecfb Replace pbkdf2 (#758)
* Replace pbkdf2

* Optional length

* cleanups
2020-11-08 21:34:34 +01:00
Github Actions 9b204fc660 [CI Skip] release/beta 4.0.2-3
skip-checks: true
2020-11-08 19:57:23 +00:00
Jaco Greeff 68bcce7a27 Cleanup pbkdf2 use (#757) 2020-11-08 20:52:02 +01:00
Github Actions 3a57c7da69 [CI Skip] release/beta 4.0.2-2
skip-checks: true
2020-11-08 18:47:26 +00:00
Jaco Greeff 055c4f82f5 Adjust nacl imports (#756) 2020-11-08 19:42:13 +01:00
Github Actions 12d8b07ff1 [CI Skip] release/beta 4.0.2-1
skip-checks: true
2020-11-08 17:12:02 +00:00
Jaco Greeff f07d66562b Remove default exports (#755)
* Remove default exports

* Cleanup tests

* Exports in util

* Single secp256k1 instance

* Length check

* format check

* encoded lengths
2020-11-08 18:07:31 +01:00
Github Actions 80f28da707 [CI Skip] release/beta 4.0.2-0
skip-checks: true
2020-11-08 13:58:25 +00:00
Jaco Greeff 1aec77922f Adjust xxhash imports (only 64 used) (#753) 2020-11-08 14:52:28 +01:00
Github Actions f431f02f11 [CI Skip] release/stable 4.0.1
skip-checks: true
2020-11-08 12:49:18 +00:00
Jaco Greeff 2063183f50 4.0 (#752)
* 4.0

* Exact deps
2020-11-08 13:45:10 +01:00
Github Actions 8280af08a6 [CI Skip] release/beta 4.0.0-11
skip-checks: true
2020-11-08 11:15:38 +00:00
Jaco Greeff 8029a54508 Additional complexity adjustments (#751)
* Adjust encoder/decoder fallbacks

* Dep-dup is functions

* Complexity cleanups

* More complexity adjustments
2020-11-08 12:10:29 +01:00
Github Actions 9e5478e0c0 [CI Skip] release/beta 4.0.0-10
skip-checks: true
2020-11-08 10:25:06 +00:00
Jaco Greeff c67c1966d7 Adjust encoder/decoder fallbacks (#750)
* Adjust encoder/decoder fallbacks

* Dep-dup is functions

* Complexity cleanups
2020-11-08 11:20:22 +01:00
Github Actions e1aa096cef [CI Skip] release/beta 4.0.0-9
skip-checks: true
2020-11-07 16:16:46 +00:00
Jaco Greeff 7135941b6a Cleanups to signature verification (#749) 2020-11-07 17:11:49 +01:00
Github Actions dc24fb82a8 [CI Skip] release/beta 4.0.0-8
skip-checks: true
2020-11-07 15:05:33 +00:00
Jaco Greeff 32cfe3707e Remove jest getRandomValues polyfill (#748)
* Remove jest getRandomValues polyfill

* react-native in all x-*
2020-11-07 15:59:56 +01:00
Github Actions 97378be94e [CI Skip] release/beta 4.0.0-7
skip-checks: true
2020-11-07 14:27:52 +00:00
Jaco Greeff db0559e9c9 RN-specific getRandomValues (no node crypto) (#747)
* RN-specific getRandomValues (no node crypto)

* Use polyfilled as available

* === object
2020-11-07 15:22:42 +01:00
Github Actions 94d6a900f7 [CI Skip] release/beta 4.0.0-6
skip-checks: true
2020-11-07 10:22:24 +00:00
Jaco Greeff d751c03d45 Bump wasm-crypto (#745)
* Bump wasm-crypto

* Use x-randomvalues for randomAsU8a
2020-11-07 11:18:06 +01:00
Github Actions aef8003d50 [CI Skip] release/beta 4.0.0-5
skip-checks: true
2020-11-05 15:05:27 +00:00
Jaco Greeff 2810b35d6c Add Synesthesia to networks (#744)
* Add Synesthesia to networks

* Add networks:crosscheck to steps for PR

* Add notifications team
2020-11-05 15:59:47 +01:00
Github Actions 6148932389 [CI Skip] release/beta 4.0.0-4
skip-checks: true
2020-11-05 14:43:13 +00:00
Jaco Greeff f4889a36d4 Bump wasm (#743) 2020-11-05 15:37:38 +01:00
Github Actions e8879c0ffc [CI Skip] release/beta 4.0.0-3
skip-checks: true
2020-11-03 12:09:33 +00:00
Jaco Greeff ed64514415 Bump wasm-crypto 2020-11-03 13:04:10 +01:00
Github Actions fcc25ee2c8 [CI Skip] release/beta 4.0.0-2
skip-checks: true
2020-11-03 09:34:06 +00:00
Jaco Greeff 695e19a8a7 Remove polyfills (#739)
* Remove polyfills

* CHANGELOG

* jestConfig

* Adjust jest

* Revert explicit overrides (from base)

* Fix dev

* 4.0.0

* Bump wasm-crypto

* min/max duplication

* Split tests, update dev

* startChar

* validate params

* complexity?

* secp256k1Verify options

* sign Options

* hasher extraction
2020-11-03 10:29:22 +01:00
Jaco Greeff 384bf9a41a CodeClimate exclusions 2020-11-01 15:08:35 +01:00
Github Actions 8f24a2758e [CI Skip] release/stable 3.7.1
skip-checks: true
2020-11-01 13:49:36 +00:00
Jaco Greeff 3230663ae1 3.7 (#738)
* 3.7

* Update new rules

* RegExp

* formatBalance cleanups

* Revert

* Formatting

* fill

* format test fix

* cleanups

* Cleanups

* Expand bip39 tests

* Cleanups

* Cleanups
2020-11-01 14:44:14 +01:00
Github Actions 4a0fa7f615 [CI Skip] release/beta 3.6.2-12
skip-checks: true
2020-10-29 20:33:55 +00:00
Jaco Greeff 0f05954dc5 Move @polkadot/x-{fetch,textdecoder,textencoder,ws} (#737)
* Move @polkadot/x-{fetch,textdecoder,textencoder,ws}

* Adjust copyrights

* Fix jest aliassing

* tsconfig resolution
2020-10-29 21:28:22 +01:00
Github Actions 55f442f9fa [CI Skip] release/beta 3.6.2-11
skip-checks: true
2020-10-29 19:25:00 +00:00
Jaco Greeff 7e5edc46a3 Add Totem (ss58 = 14) (#736) 2020-10-29 20:19:30 +01:00
Github Actions d500f98fb4 [CI Skip] release/beta 3.6.2-10
skip-checks: true
2020-10-29 13:41:24 +00:00
Jaco Greeff 7b8902ce3f assertResult with undefined 2020-10-29 14:35:28 +01:00
Github Actions 98b3ad642f [CI Skip] release/beta 3.6.2-9
skip-checks: true
2020-10-29 12:33:33 +00:00
Jaco Greeff 14466e27ac assertReturn (#735) 2020-10-29 13:28:19 +01:00
Github Actions 16ffd1b467 [CI Skip] release/beta 3.6.2-8
skip-checks: true
2020-10-28 14:04:56 +00:00
Jaco Greeff ca52fd7e5b Bump dev (#733)
* Bump dev

* Rewrite
2020-10-28 14:59:36 +01:00
Github Actions ea5d3df64c [CI Skip] release/beta 3.6.2-7
skip-checks: true
2020-10-28 12:58:18 +00:00
Jaco Greeff b51ed71796 string* takes in String (class) inputs (#732) 2020-10-28 13:52:40 +01:00
Github Actions bf28507ae8 [CI Skip] release/beta 3.6.2-6
skip-checks: true
2020-10-26 22:02:25 +00:00
Jaco Greeff 6715bef24a Align JS bip39 with wasm-crypto (#730)
* Align JS bip39 with wasm-crypto

* Cleanups
2020-10-26 22:57:11 +01:00
Github Actions badbbd76cb [CI Skip] release/beta 3.6.2-5
skip-checks: true
2020-10-26 20:43:23 +00:00
Jaco Greeff 253776a510 Cleanup elliptic imports (#729) 2020-10-26 21:37:51 +01:00
Github Actions e1ef295bfa [CI Skip] release/beta 3.6.2-4
skip-checks: true
2020-10-26 19:36:31 +00:00
Jaco Greeff 73c89f4e3c Remove chalk dependency (#728) 2020-10-26 20:30:36 +01:00
Github Actions a52e0dfb16 [CI Skip] release/beta 3.6.2-3
skip-checks: true
2020-10-26 14:51:26 +00:00
Jaco Greeff 9f8ed7bb50 Remove copy-to-apps script 2020-10-26 15:46:29 +01:00
Github Actions a932f9408a [CI Skip] release/beta 3.6.2-2
skip-checks: true
2020-10-26 10:37:31 +00:00
Jaco Greeff 7907ce6dbf Bump actions, cleanups (#727) 2020-10-26 11:31:49 +01:00
Github Actions 230d510491 [CI Skip] release/beta 3.6.2-1
skip-checks: true
2020-10-23 11:10:06 +00:00
Jaco Greeff 415fd1b2d1 Bump deps (#726) 2020-10-23 13:05:45 +02:00
Github Actions 89c954216d [CI Skip] release/beta 3.6.2-0
skip-checks: true
2020-10-23 08:08:22 +00:00
Jaco Greeff b689796b25 Create .nojekyll 2020-10-23 10:03:23 +02:00
Jaco Greeff c4c18d324b Create 404.html 2020-10-23 10:02:53 +02:00
Jaco Greeff b7bf500343 Create index.html 2020-10-23 10:02:36 +02:00
340 changed files with 3205 additions and 3979 deletions
-4
View File
@@ -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
View File
@@ -1,4 +1,5 @@
exclude_patterns:
- "**/*.spec.js"
- "**/*.spec.ts"
- "docs/**/*.js"
- "packages/networks/src/index.ts"
- "packages/util/src/is/utf8.ts"
-4
View File
@@ -1,4 +0,0 @@
.eslintrc.js
**/build/*
**/coverage/*
**/node_modules/*
+10 -1
View File
@@ -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: [
+4 -1
View File
@@ -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:
+2 -2
View File
@@ -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 }}
+1 -1
View File
@@ -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 }}
+1 -1
View File
@@ -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
+1 -1
View File
@@ -1 +1 @@
10
12
-55
View File
File diff suppressed because one or more lines are too long
+55
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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
+37
View File
@@ -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
View File
@@ -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');
-19
View File
@@ -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"
+1
View File
@@ -0,0 +1 @@
+12
View File
@@ -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>
+12
View File
@@ -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
View File
@@ -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'
});
-10
View File
@@ -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
View File
@@ -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"
}
+15 -21
View File
@@ -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"
}
}
+7
View File
@@ -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);
+4 -11
View File
@@ -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 };
+3 -3
View File
@@ -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;
+2 -2
View File
@@ -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 => {
+1 -1
View File
@@ -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');
+2 -2
View File
@@ -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 => {
+1 -1
View File
@@ -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(
+3 -3
View File
@@ -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> => {
+9 -9
View File
@@ -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
};
}
+1 -1
View File
@@ -22,7 +22,7 @@ const json: KeyringPair$Json = {
meta
};
export default function everybody (): KeyringPair {
export function nobody (): KeyringPair {
const pair: KeyringPair = {
address,
addressRaw: publicKey,
+2 -2
View File
@@ -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 => {
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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 {
+3 -3
View File
@@ -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 => {
+4 -4
View File
@@ -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');
});
});
+4 -4
View File
@@ -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() };
+9 -20
View File
@@ -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"
}
}
+37 -57
View File
@@ -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
+16 -22
View File
@@ -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 => {
+5 -5
View File
@@ -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'];
}
@@ -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
+18 -18
View File
@@ -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 -7
View File
@@ -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'));
+1 -3
View File
@@ -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/);
});
});
+6 -6
View File
@@ -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);
}
+12 -12
View File
@@ -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');
});
});
+6 -6
View File
@@ -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);
}
+2 -2
View File
@@ -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 -3
View File
@@ -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);
}
+14 -31
View File
@@ -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,
+3 -3
View File
@@ -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;
}
+3 -3
View File
@@ -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));
+2 -2
View File
@@ -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);
}
+29 -18
View File
@@ -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;
}
+1 -1
View File
@@ -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;
+4 -4
View File
@@ -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';
+7 -3
View File
@@ -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 -2
View File
@@ -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);
}
+3 -3
View File
@@ -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)));
}
+1 -1
View File
@@ -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))
);
+4 -4
View File
@@ -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';
+4 -7
View File
@@ -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);
}
+14 -6
View File
@@ -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 -3
View File
@@ -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'));
}
+1 -1
View File
@@ -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');
}
+6 -6
View File
@@ -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';
+3 -3
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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);
}
+1 -1
View File
@@ -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');
+2 -2
View File
@@ -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)
);
+32 -24
View File
@@ -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 => {
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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);
+9
View File
@@ -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
});
+1 -1
View File
@@ -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';
}
+3 -3
View File
@@ -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', () => {
+2 -4
View File
@@ -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';
+2 -2
View File
@@ -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)
);
+18 -16
View File
@@ -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