Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12f3f8695f | ||
|
|
964d308491 | ||
|
|
a1bf03e40e | ||
|
|
ff940e5d26 | ||
|
|
e2fa0ad11f | ||
|
|
654e44aa99 | ||
|
|
476689f615 | ||
|
|
fc1582aa70 | ||
|
|
a616b84045 | ||
|
|
73708b72c7 | ||
|
|
8f0807ddbe | ||
|
|
5547f885be | ||
|
|
5f8d521c6a | ||
|
|
51a169a88a | ||
|
|
ad89ed5f3d | ||
|
|
ca1362c595 | ||
|
|
9621d90613 | ||
|
|
50efeb06d1 | ||
|
|
e236acc29d | ||
|
|
1062ace58d | ||
|
|
298a901921 | ||
|
|
c2f453481c | ||
|
|
54e6b61972 | ||
|
|
c52a7b1e64 | ||
|
|
749cd2e381 | ||
|
|
24b1790c99 | ||
|
|
62823635b0 | ||
|
|
bc84220108 | ||
|
|
5158951326 | ||
|
|
500b739ddd | ||
|
|
b741d228ac | ||
|
|
437ff8b51d | ||
|
|
354dd0a7a4 | ||
|
|
3804123ca6 | ||
|
|
bbc752e475 | ||
|
|
80f69b88b2 | ||
|
|
a02eab478e | ||
|
|
22fdb9a1f9 | ||
|
|
496d2123ed | ||
|
|
15a2e6c6cf | ||
|
|
62a9a7aeb5 | ||
|
|
8541088893 | ||
|
|
e558cf8f7f | ||
|
|
01827deaf5 | ||
|
|
6d71677c17 | ||
|
|
ee42a717aa | ||
|
|
cfa8ab7ab6 | ||
|
|
4ecd14c187 | ||
|
|
d9318bc917 | ||
|
|
6f6db63580 | ||
|
|
ebd1e64694 | ||
|
|
f12aa92383 | ||
|
|
2df0638b19 | ||
|
|
542f484703 | ||
|
|
f9dbedb93a | ||
|
|
2492ae5d60 | ||
|
|
c5ab1c0e1a | ||
|
|
fa9a7c197b | ||
|
|
05b9f13a45 | ||
|
|
b4511920b0 | ||
|
|
4d6ee85071 | ||
|
|
3f96caf54d | ||
|
|
0b804ff776 | ||
|
|
0b1cec4e2d | ||
|
|
dd4bf9feba | ||
|
|
4d41bbcf04 | ||
|
|
04780bda5c | ||
|
|
becc991dc8 | ||
|
|
815756d168 | ||
|
|
c960cee703 | ||
|
|
c7da06215d | ||
|
|
55053f76a9 | ||
|
|
19fb9dafc9 | ||
|
|
f0f0dec8ea | ||
|
|
649b2f5e4a | ||
|
|
af06ec22c5 | ||
|
|
bb976e746a | ||
|
|
814f8418f2 | ||
|
|
a00dd1e4ca | ||
|
|
66e24c3750 | ||
|
|
1ff4c58fe3 | ||
|
|
5ff15b18a1 | ||
|
|
83975e9235 | ||
|
|
3adf475ef4 | ||
|
|
ccc6edebbb | ||
|
|
0d7ed7420d | ||
|
|
dbf1837b97 | ||
|
|
9ae738ac51 | ||
|
|
a4000efc43 | ||
|
|
7871a17942 | ||
|
|
5aad1d09b2 | ||
|
|
4eb5d7dfd3 | ||
|
|
0a841e8f4a | ||
|
|
53ffd0c9f0 | ||
|
|
5d3a9f2e2e | ||
|
|
9d6f38edb3 | ||
|
|
9e5e032e1d | ||
|
|
31426858c6 | ||
|
|
46b4ca0c91 | ||
|
|
f4cb68c567 | ||
|
|
ab4b234510 | ||
|
|
d5151c4f01 | ||
|
|
6df4689aa3 | ||
|
|
9727a6a9a5 | ||
|
|
7f00182fd9 | ||
|
|
261b0add27 | ||
|
|
5d6e753384 | ||
|
|
15c2e79e6e | ||
|
|
f763a66219 | ||
|
|
1061df6e4a | ||
|
|
4c121e6f50 | ||
|
|
74b3a04c4a | ||
|
|
e4488463ba | ||
|
|
c6fd67b5d5 | ||
|
|
e5dc596867 | ||
|
|
a28f8dad37 | ||
|
|
7855658bfd | ||
|
|
de14a85817 | ||
|
|
de2206bb27 | ||
|
|
451a7aecde | ||
|
|
5170194105 | ||
|
|
b2286ac06a | ||
|
|
57cc6d6d46 | ||
|
|
6e1b5901b3 | ||
|
|
203db7467f | ||
|
|
aa7d4838c7 | ||
|
|
b778f606c5 | ||
|
|
45146efce8 | ||
|
|
9229f9f295 | ||
|
|
2e1c29a5a8 | ||
|
|
79f925b589 | ||
|
|
572c2789cc | ||
|
|
913f9636ba | ||
|
|
83e5592305 | ||
|
|
b7e579f6b8 | ||
|
|
c211b811a6 | ||
|
|
4c02b25a2d | ||
|
|
28b2435019 | ||
|
|
a0e5d60a0a | ||
|
|
311eceec0d | ||
|
|
cf24dcdf22 | ||
|
|
ead3eceef4 | ||
|
|
59df9aefc4 | ||
|
|
cb97cc1786 | ||
|
|
cf18ecf193 | ||
|
|
6e6b13f29a | ||
|
|
f75a16159d | ||
|
|
b8fe6be9cc | ||
|
|
9993325679 | ||
|
|
ce8fe9f49d | ||
|
|
408a6706b1 | ||
|
|
79c7fa3b75 | ||
|
|
e9713b6c93 | ||
|
|
706a3e0cc2 | ||
|
|
b1a40516c1 | ||
|
|
7cf449074d | ||
|
|
2ce7a79263 | ||
|
|
cfa5660d54 | ||
|
|
1256f2a54a | ||
|
|
2695afa68e | ||
|
|
af71673c7b | ||
|
|
7f489e1a99 | ||
|
|
10fb33877c | ||
|
|
731def1f56 | ||
|
|
06057da172 | ||
|
|
af3e79e70a | ||
|
|
9e5ee72adf | ||
|
|
6a8344020f | ||
|
|
a1ad6f1dd0 | ||
|
|
71f2b64868 | ||
|
|
ad7e949c8c | ||
|
|
d24241d656 | ||
|
|
91d2e9bbbd | ||
|
|
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 | ||
|
|
e5c6baf425 | ||
|
|
0127899c5e | ||
|
|
f23611cad6 | ||
|
|
a74df109b0 | ||
|
|
9582013bfa | ||
|
|
6c148dcb3b | ||
|
|
65488bbff8 | ||
|
|
40cbb81d1e | ||
|
|
77b896054f | ||
|
|
89c717bd11 | ||
|
|
b22f5643a9 | ||
|
|
8d68ed3117 | ||
|
|
65b1c81c21 | ||
|
|
28cd140cfb | ||
|
|
73b553fbd2 | ||
|
|
f12075798d | ||
|
|
323db21306 | ||
|
|
d54302eacc | ||
|
|
9a98d5b6e4 | ||
|
|
5ec613adf9 | ||
|
|
567ce7955a | ||
|
|
b185dcb072 | ||
|
|
79010f83dc | ||
|
|
5354f93946 | ||
|
|
e787e66ef9 | ||
|
|
440e826fed | ||
|
|
d2e5e1d441 | ||
|
|
32fc32f414 | ||
|
|
0a7b2a7a9f | ||
|
|
c315e6fdaa | ||
|
|
b5d9ed36e1 | ||
|
|
f24c7983c8 | ||
|
|
3447cd40bf | ||
|
|
95f4702e26 | ||
|
|
506142da8a | ||
|
|
34f6eac538 | ||
|
|
ae1a37cdf7 | ||
|
|
fab087bbe5 | ||
|
|
8608098996 | ||
|
|
220f4029b1 | ||
|
|
d21daf1434 | ||
|
|
1a4c16f797 | ||
|
|
975103fd3c | ||
|
|
fb84ac7c25 | ||
|
|
13ae8665d5 | ||
|
|
4e8b2beb0b | ||
|
|
dd1220ac97 | ||
|
|
b46308fa8f | ||
|
|
c366e637e9 | ||
|
|
81acc81ef7 | ||
|
|
eb7270ff3f | ||
|
|
30198d1a6d | ||
|
|
2fc078d994 | ||
|
|
bd1735cafb | ||
|
|
ca73e5bc4d | ||
|
|
aff78c2e30 | ||
|
|
fbd454eb5a | ||
|
|
ce964d2f12 | ||
|
|
2c26bc61da | ||
|
|
4111122cba | ||
|
|
e1e95dc6b3 | ||
|
|
e7c665e5da | ||
|
|
301eb587cb | ||
|
|
5c886b0f81 | ||
|
|
56a79924a0 | ||
|
|
beef1b38ed | ||
|
|
ce46a68187 | ||
|
|
94dc2d76b3 | ||
|
|
dcdde1cf4b | ||
|
|
e3a9099b58 | ||
|
|
fb03ff3994 | ||
|
|
1d42fbf2bf | ||
|
|
c0e4b1b93e | ||
|
|
139f3f90b0 | ||
|
|
cf6fae8e1d | ||
|
|
f8d69736c1 | ||
|
|
a4322cb99a | ||
|
|
9445006127 | ||
|
|
aeeaa91752 | ||
|
|
52fb4ac863 | ||
|
|
2a000a2a14 | ||
|
|
97fe3b2ea3 | ||
|
|
9b8a782d58 | ||
|
|
b56e40ea5b | ||
|
|
37d1bcb6eb | ||
|
|
f2b8c1fb4e | ||
|
|
92cc8fc4e3 | ||
|
|
701bd9335d | ||
|
|
d176c74715 | ||
|
|
0bf7c799f3 | ||
|
|
2f7d5cd4e1 | ||
|
|
c42b517293 | ||
|
|
e5dd55e419 | ||
|
|
83fdd11c59 | ||
|
|
08de8ce25a | ||
|
|
800bafc00c | ||
|
|
3b383b97ca | ||
|
|
b381c09ecf | ||
|
|
a53008fd67 | ||
|
|
899056c5a2 | ||
|
|
8554d47030 | ||
|
|
9808f58540 | ||
|
|
7228100835 | ||
|
|
08c1b413d2 | ||
|
|
27ae11860d | ||
|
|
9cc984e8ae | ||
|
|
d352782927 | ||
|
|
6e4a5281ed | ||
|
|
d11f6d9307 | ||
|
|
61b57687af | ||
|
|
3ab1623a40 | ||
|
|
f5acd60253 | ||
|
|
c4d368d2b5 | ||
|
|
e487d0a454 | ||
|
|
99ffcc52ec | ||
|
|
64510af8d3 | ||
|
|
52b14db475 | ||
|
|
c5fe5cd8d4 | ||
|
|
bdfc614ad5 | ||
|
|
0d03eac307 | ||
|
|
6c84edcb9d | ||
|
|
9d145e72b8 | ||
|
|
4529bc37b5 | ||
|
|
038ef42fe5 | ||
|
|
1871d36a97 | ||
|
|
45c2afae07 | ||
|
|
51edae2f67 | ||
|
|
437314e5ea | ||
|
|
ce6f9d8bc8 | ||
|
|
0cf65e1671 | ||
|
|
a0251ff650 | ||
|
|
9696badcd1 | ||
|
|
08817d199d | ||
|
|
df69a02e6f | ||
|
|
e845132d89 | ||
|
|
21e9b9a033 | ||
|
|
db61ea3077 | ||
|
|
d4a3d2392e | ||
|
|
88ecda706d | ||
|
|
184fb1f12e | ||
|
|
91340577df | ||
|
|
36729678e2 | ||
|
|
1c6b4bfc34 | ||
|
|
bbfd175579 | ||
|
|
0a6bd41444 | ||
|
|
ab21274c36 | ||
|
|
d4e6ad5553 | ||
|
|
49dbd757df | ||
|
|
20e82cc45b | ||
|
|
6a7fa80c55 | ||
|
|
12e34cd3e8 | ||
|
|
0a598fdf92 | ||
|
|
659b896ee7 | ||
|
|
7cda007a30 | ||
|
|
2288c4da8a | ||
|
|
fbfc21be1c | ||
|
|
787beb2aea | ||
|
|
6234e16c37 | ||
|
|
e9cbc0a0d9 | ||
|
|
166eeb8852 | ||
|
|
b321f92161 | ||
|
|
cf7d9d9ff5 | ||
|
|
fb5b3c1663 | ||
|
|
46bbc45145 | ||
|
|
dc8b4a6447 | ||
|
|
8ec38eca4a | ||
|
|
24b533689c | ||
|
|
5421e06fc9 | ||
|
|
7115efd94f | ||
|
|
92f88222c4 | ||
|
|
bc7aba71a6 | ||
|
|
1d8b8b3204 | ||
|
|
4a2e090ef8 | ||
|
|
8cf8d5b7e8 | ||
|
|
8d355ff6fc | ||
|
|
72456bb2bd | ||
|
|
87f3fd2827 | ||
|
|
7254aab68d | ||
|
|
95d7160ad0 | ||
|
|
611b1be481 | ||
|
|
73b35fc188 | ||
|
|
6c30d5b9fd | ||
|
|
56d151fe66 | ||
|
|
cd20fe6c8b | ||
|
|
28f8ca73aa | ||
|
|
f4a8bfc0c0 | ||
|
|
94b058d6a3 | ||
|
|
3d7ddb85a2 | ||
|
|
f7a2bb895f | ||
|
|
c1bfcc00b6 | ||
|
|
b16d8e7c26 | ||
|
|
2a4b363fcd | ||
|
|
de689b8e6f | ||
|
|
2e72ab920b | ||
|
|
565e6baecd | ||
|
|
1e15203b6c |
+11
-2
@@ -1,2 +1,11 @@
|
||||
5
|
||||
2.6.22.12.2
|
||||
6
|
||||
2.6.2
|
||||
2.12.2
|
||||
5.2.2
|
||||
5.2.3
|
||||
|
||||
5.4.2
|
||||
5.4.3
|
||||
5.4.4
|
||||
5.5.2
|
||||
5.6.2
|
||||
@@ -1 +0,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/*
|
||||
+18
-1
@@ -1,11 +1,28 @@
|
||||
const base = require('@polkadot/dev/config/eslint');
|
||||
// Copyright 2017-2021 @polkadot/util authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
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: [
|
||||
'./tsconfig.json'
|
||||
]
|
||||
},
|
||||
rules: {
|
||||
...base.rules,
|
||||
// this seems very broken atm, false positives
|
||||
'@typescript-eslint/unbound-method': 'off'
|
||||
}
|
||||
};
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: SS58 registry is outdated
|
||||
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', 'docs']
|
||||
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 }}
|
||||
|
||||
@@ -8,18 +8,17 @@ jobs:
|
||||
master:
|
||||
strategy:
|
||||
matrix:
|
||||
step: ['build:release', 'docs:release']
|
||||
step: ['build:release']
|
||||
name: ${{ matrix.step }}
|
||||
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 }}
|
||||
env:
|
||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||
GH_PAGES_SRC: build-docs
|
||||
GH_PAT: ${{ secrets.GH_PAT }}
|
||||
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
name: SS58
|
||||
on:
|
||||
schedule:
|
||||
- cron: '45 3 * * *'
|
||||
|
||||
jobs:
|
||||
ss58:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: check
|
||||
env:
|
||||
CI_LOG: 123
|
||||
run: |
|
||||
yarn install --immutable | grep -v 'YN0013'
|
||||
yarn networks:crosscheck
|
||||
|
||||
- name: issue
|
||||
if: ${{ failure() }}
|
||||
uses: JasonEtco/create-an-issue@v2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_PAT_BOT }}
|
||||
with:
|
||||
filename: .github/ss58-check.md
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+77
File diff suppressed because one or more lines are too long
+55
File diff suppressed because one or more lines are too long
Vendored
-56
File diff suppressed because one or more lines are too long
+4
-2
@@ -5,7 +5,9 @@ enableProgressBars: false
|
||||
nodeLinker: node-modules
|
||||
|
||||
plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.js
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
||||
spec: "@yarnpkg/plugin-interactive-tools"
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-version.cjs
|
||||
spec: "@yarnpkg/plugin-version"
|
||||
|
||||
yarnPath: .yarn/releases/yarn-rc.js
|
||||
yarnPath: .yarn/releases/yarn-2.4.0.cjs
|
||||
|
||||
+464
-48
@@ -1,140 +1,510 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 5.6.2 Feb 8, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- `@polkadot/networks` now filters the new upstream-introduced `null` networks
|
||||
|
||||
|
||||
## 5.6.1 Feb 7, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Fix installation instructions in `@polkadot/x-global` (Thanks to https://github.com/raoulmillais)
|
||||
|
||||
Changes:
|
||||
|
||||
- Conform to new ss58 encoding with ids up to 16,383 (>= 64 as 2 bytes)
|
||||
- Use JS sqrt inside `bnSqrt` when value <= MAX_SAFE_INTEGER
|
||||
- Adjust all `Buffer.from` usages, prefer `Uint8Array` where possible
|
||||
- Expand tests for keyring with `vrf{Sign, Verify}`
|
||||
- Align `@polkadot/networks` with latest ss58 registry
|
||||
|
||||
|
||||
## 5.5.2 Feb 2, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Expose `BN_{MILLION, BILLION}` constants (in addition to 2-9)
|
||||
|
||||
|
||||
## 5.5.1 Jan 31, 2021
|
||||
|
||||
Changes:
|
||||
|
||||
- Added `hdLedger` to util-crypto for Ledger-compatible bip32+ed25519 derivation
|
||||
- Added `hmac{Sha256, 512}` to util-crypto
|
||||
- Add `slip44` indices for Ledger into `@polkadot/networks`
|
||||
- Remove `module` entry in `package.json` (only rely on exports map)
|
||||
- Remove direct references to `global` object, use `@polkadot/x-global`
|
||||
- Update `@ledgerhq` dependencies to latest
|
||||
|
||||
|
||||
## 5.4.1 Jan 24, 2021
|
||||
|
||||
Contributed:
|
||||
|
||||
- Adjust Ledger app lookup for Polymesh (Thanks to https://github.com/adamdossa)
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow decimals as `number[]` & symbol as `string[]` in balanceFormat defaults
|
||||
- Add `schnorrkelVrf{Sign, Verify}` to `@polkadot/util-crypto`
|
||||
- Export `vrf{Sign, Verify}` on keyring interface
|
||||
- Move `@polkadot/x-rxjs` packages from the api repo
|
||||
- Align `@polkadot/networks` with Substrate master
|
||||
- Explicit edcsa tests for derivation
|
||||
- `@polkadot/wasm-crypto` 3.2.1
|
||||
|
||||
|
||||
## 5.3.1 Jan 17, 2021
|
||||
|
||||
**Important** For users of the `@polkadot/ledger` package, it is now included in this repo (since it is a general utility) and renamed to `@polkadot/hw-ledger`
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Dock Ledger integration (Thanks to https://github.com/lovesh)
|
||||
- Add Polymesh Ledger integration (Thanks to https://github.com/adamdossa)
|
||||
- Add flag for Ledger capabilities on networks (Thanks to https://github.com/Tbaut)
|
||||
|
||||
Changes:
|
||||
|
||||
- Move `@polkadot/ledger` packages into common
|
||||
- Update `@polkadot/networks` to align with latest Substrate ss58-registry
|
||||
|
||||
|
||||
## 5.2.1 Dec 27, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `arrayFlatten` to merge a series of arrays into a single
|
||||
- Add `arrayChunk` to chunk an array into multiples of defined size
|
||||
- Add `bitLength` param (allowed 256, 512) to `keccakAs{Hex, U8a}`
|
||||
- Align `@polkadot/networks` with Substrate master
|
||||
|
||||
|
||||
## 5.1.1 Dec 19, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- `detectPackage` now can take a path-retrieval callback as second argument
|
||||
- Adjust `blake2js` imports to consistently cater for esm & cjs usage
|
||||
- Explicitly mark `detectPackage` usage as having side-effects
|
||||
- Align `@polkadot/networks` with Substrate master
|
||||
- `@polkadot/wasm-crypto` 3.1.1
|
||||
|
||||
|
||||
## 5.0.1 Dec 13, 2020
|
||||
|
||||
**Important** While this package contains no external interface changes, it now compiles and ships both cjs and esm modules. This means that modern bundlers will have more information for tree-shaking available. Additionally when using Node with `.mjs` extensions, the esm version imports will be used on recent Node versions. Adding an export map, as here, may have some impacts so a major semver bump is advised. There may be (small) dragons hiding in the dark corners...
|
||||
|
||||
Changes:
|
||||
|
||||
- Build and expose both cjs and esm via exports map
|
||||
- Use `import type { ... }` form for all type imports
|
||||
- Align with Substrate master network list
|
||||
- Debug logs now don't depend on `NODE_ENV`, but rather `DEBUG=<type,type,...>` (`*` logs all)
|
||||
- Limit debug console output via `DEBUG_MAX=<number>` value, trimming when passed
|
||||
- Add `memoize` util, allowing for function memoization (as used in the API)
|
||||
- Align `@polkadot/networks` with Substrate master
|
||||
- `@polkadot/wasm-crypto` 3.0.1
|
||||
|
||||
|
||||
## 4.2.1 Nov 23, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Rename default Mega to Million, Giga to Billion and Tera to Trillion in formatter
|
||||
- Dedupe bn.js by aligning versions between different libraries
|
||||
- Add explicit link to base Substrate ss58 formats (as managed in `@polkadot/util`)
|
||||
|
||||
|
||||
## 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:
|
||||
|
||||
- Add evmToAddress and addressToEvm `@polkadot/util-crypto` (Thanks to https://github.com/jnaviask)
|
||||
- Remove invalid link to docs (thanks to https://github.com/roccomuso)
|
||||
|
||||
Changes:
|
||||
|
||||
- Rename `mnemonicToBip39` to `mnemonicToLegacySeed` (used in non-Substrate compatible fashion)
|
||||
- Update pair signature verification to handle MultiSignature results
|
||||
- Move documentation to docs repo
|
||||
- Added `@polkadot/networks` for a list of known networks and their identifying information
|
||||
|
||||
|
||||
## 3.5.1 Sep 27, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Dock network identifiers (Thanks to https://github.com/lovesh)
|
||||
|
||||
Changes:
|
||||
|
||||
- Use cross-environment TextDecoder & TextEncoder from the polkadot-js polyfills
|
||||
- Add `isBase{32, 58, 64}` to `@polkadot/util-crypto`
|
||||
- Add `base64{Pad, Trim}` to add/remove padding characters
|
||||
- Add `createFromJson(json)` to keyring (create pair without adding)
|
||||
- Balance formatter now outputs 4 numbers after the decimal point
|
||||
|
||||
|
||||
## 3.4.1 Aug 31, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow for WASM-as-available `mnemonicToBip39` call (used for Ethereum-compatible keypairs)
|
||||
- Add `isWasm` utility to check for valid WASM headers
|
||||
- `@polkadot/wasm-crypto` 1.4.1
|
||||
|
||||
|
||||
## 3.3.1 Aug 24, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `addressRaw` to Keyring interface (if address encoding is different to publicKey)
|
||||
- Allow for Ethereum pair signing and verification
|
||||
|
||||
|
||||
## 3.2.1 Aug 17, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow for (optional, default blake2) hasher to secp256k1 sign/verify functions
|
||||
- Utilities for secp256k1 publicKey expansion and compression
|
||||
- Add basic Ethereum address utils (encode with checksum & checksum verification)
|
||||
- Add Ethereum-compatible `mnemonicToBip39` seed creation function
|
||||
|
||||
|
||||
## 3.1.1 Aug 10, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `deriveAddress(<address>, '/<soft>/<soft-b>')` via sr25519 soft
|
||||
- Use `scrypt` from WASM as available (JS fallback in place)
|
||||
- Add `base32{Encode, Decode}` utilities (IPFS-compatible alphabet)
|
||||
- Support IPFS compatibility flag in base58 encoding/decoding
|
||||
- Update to `@polkadot/wasm-crypto` 1.3.1
|
||||
|
||||
|
||||
## 3.0.1 Jul 27, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Katal ss58Format (Thanks to https://github.com/retotrinkler)
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust JSON pair output with scrypt kdf (version 3 output)
|
||||
|
||||
|
||||
## 2.18.1 Jul 13, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `base64{Decode, Encode, Validate}` as crypto utils
|
||||
- Extract `base58Validate` from base58 decode checks
|
||||
- Add `isAscii` to allow detection of printable ASCII sequences (including tab, newline)
|
||||
- Add `isUtf8` to allow detection of valid Utf8 sequences
|
||||
|
||||
|
||||
## 2.17.1 Jul 6, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `encode{Derived, Multi}Address` to encode derived/multi addresses
|
||||
- Correctly handle 0 inputs in `numberToU8a`
|
||||
- Simplify and flatten base58 dependencies
|
||||
|
||||
|
||||
## 2.16.1 Jun 29, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust `addressCheck` and `encodeAddress` function to check for valid base58 alphabets (better error reporting)
|
||||
- Rename `createKeySub` to `createKeyDerived` based on changed in Substrate (sub keys now named derived)
|
||||
|
||||
|
||||
## 2.15.1 Jun 22, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Adjust keyring to no override 0-prefix (Polkadot live) settings with keychain default
|
||||
|
||||
|
||||
## 2.14.1 Jun 16, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add `extractTime` utility conversion (Thanks to https://github.com/kwingram25)
|
||||
|
||||
|
||||
## 2.13.1 Jun 8, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix JS blake2 fallback (non-wasm) to correctly deal with hex inputs
|
||||
- Align `bnToHex` signature with `bnToU8a` (with old/new style)
|
||||
- Allow `bnTo{Hex,U8a}` to take any value with `.toBn()` signatures
|
||||
|
||||
|
||||
## 2.12.2 Jun 1, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix `isFunction` signature to assert `Function`
|
||||
|
||||
|
||||
## 2.12.1 Jun 1, 2020
|
||||
|
||||
- **Important** Removed `mnemonicToSeed`, it is only for bip39, use `mnemonicToMiniSecret` for the Substrate variant
|
||||
|
||||
Changes:
|
||||
|
||||
- Added `u8aEq` to compare two Uint8Array or hex values for an exact match
|
||||
- Added `addressEq` to compare two addresses (ss58, Uint8array or hex) for an exact match
|
||||
- Throw error on `{nacl,schnorrkel}Verify` on invalid input lengths
|
||||
- Performance optimizations in `u8aToHex` & `u8aConcat`
|
||||
|
||||
|
||||
## 2.11.1 May 26, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Internal cleanups on typings
|
||||
- Support for latest TypeScript, eslint & typescript-eslint
|
||||
|
||||
|
||||
## 2.10.1 May 14, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add Kulupu ss58 prefix as an allowed value (Thanks to https://github.com/sorpaas)
|
||||
|
||||
Changes:
|
||||
|
||||
- Make the `TextEncoder` polyfill handle non-compliant Buffer implementations (newer versions of Jest)
|
||||
- `DeriveJunction` now also allows for BigInt values (aligning with number types elsewhere)
|
||||
- Small code-flow optimizations
|
||||
|
||||
|
||||
## 2.9.1 Apr 30, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add support for ECDSA keypairs (Thanks to https://github.com/akru)
|
||||
|
||||
Changes:
|
||||
|
||||
- Added `createKeyMulti` & `createKeySub` to create utility sub & multi keys
|
||||
- Added `u8aSorted` to sort `Uint8Arrays`
|
||||
- Added `sortAddresses` to sort addresses based on their internal representation
|
||||
|
||||
|
||||
## 2.8.1 Apr 9, 2020
|
||||
|
||||
- Keypair will now throw an error when attempting to sign/derive using a locked pair (Thanks to https://github.com/h4x3rotab)
|
||||
|
||||
Changes:
|
||||
|
||||
- Cleanup `isDevelopment` regex to cater for chains such as `Westend Development`
|
||||
|
||||
|
||||
## 2.7.1 Mar 31, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `bnSqrt` to calculate the integer sqrt via Newton iteration
|
||||
- Allow for optional wasm-crypto, specifically via `@polkadot/util-crypto/noWasm`
|
||||
- Misc. CI infrastructure cleanups
|
||||
|
||||
|
||||
## 2.6.1 Feb 29, 2020
|
||||
|
||||
- **Breaking change** Following on the 2.0 release, `@polkadot/wasm` was updated to 1.1+. sr25510 now only verifies 0.8+ signatures, closing the loop on dropping Substrate 1.x-era support
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `signatureVerify (message: Uint8Array | string, signature: Uint8Array | string, addressOrPublicKey: Uint8Array | string): VerifyResult` to verify any signature, regardless of type. Returns validity & detected crypto type.
|
||||
- Add `cryptoIsReady (): boolean` function to check status of initialization
|
||||
- Add `addressCheckChecksum (decoded: Uint8Array)` as an helper to extract and verify the ss58 checksum
|
||||
- Swap to yarn 2, allow use in yarn 2 projects
|
||||
|
||||
|
||||
## 2.5.1 Feb 22, 2020
|
||||
|
||||
- **Breaking change** (TypeScript only) The `*.d.ts` files now contain TypeScript 3.8 features, `#private`, which is not usable in older versions
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `isBigInt(value)` to allow `BigInt` checks. Also add support in `bnToBn` as well as number conversion utils
|
||||
- Add `isChildClass(Parent, Child?)` to check if a class extends the parent, asserting Child is Parent
|
||||
- (internal) Use `#<field>` instead of `private _<field>` for private class variables
|
||||
|
||||
|
||||
## 2.4.1 Feb 18, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Ensure that `formatBalance` does not apply unit overrides apply when no SI is applicable
|
||||
- Adjust `formatBalance(<balance>, <options>)` to take expanded `withUnit: string | boolean` option where string is an actual unit, e.g. `KSM`
|
||||
- The `decimals` option to `formatBalance` should now be passed as part of the `options` (previous last-param deprecated)
|
||||
- The `.setSS58Format` on keyring will now just operate on pairs created on the keyring, not globally. The global `setSS58Format` in `@polkadot/util-crypto` will be deprecated.
|
||||
- The deprecated `addressPrefix` option to keyring has been belatedly removed (Use `ss58Format` rather)
|
||||
|
||||
|
||||
## 2.3.1 Feb 15, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Remove dependency on moment.js with `formatDate` function (Thanks to https://github.com/AndreasGassmann)
|
||||
- Move TypeScript `@types/*` to dev deps (Thanks to https://github.com/AndreasGassmann)
|
||||
|
||||
Changes:
|
||||
|
||||
- Update to `@polkadot/wasm-crypto` 1.0
|
||||
- Cleanup dependencies to pave the way for using yarn 2 (Explicit instead of implicit)
|
||||
|
||||
|
||||
## 2.2.1 Feb 06, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Add resolver for jest requires (tests from src)
|
||||
|
||||
|
||||
## 2.1.1 Feb 04, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Update `detectPackage(<package.json>, __dirname?)` with calling folder
|
||||
|
||||
|
||||
## 2.0.1 Jan 30, 2020
|
||||
|
||||
Changes:
|
||||
|
||||
- Update w3f/schnorrkel to 0.8.5 (Full Substrate 2.x support, no 1.x support)
|
||||
- Remove Alice session (ed2551) account from testing keyring (not applicable to Substrate 2.x)
|
||||
- Remove `chainspec`, `db`, `trie-codec`, `trie-db` and `trie-hash` packages (moved to client)
|
||||
- Renamed `assertSingletonPackage` to `detectPackage` with inclusion of version listing
|
||||
- Swap to elliptic library for secp2561 recovery (No node bindings)
|
||||
|
||||
|
||||
## 1.8.1 Jan 09, 2020
|
||||
|
||||
Contributed:
|
||||
|
||||
- Add cross-client encryption/decryption support (Thanks to https://github.com/hskang9)
|
||||
|
||||
|
||||
## 1.7.1 Nov 27, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- `formatBalance` signature now allows to force unit displays
|
||||
- Keypair now allows for derive on a pair, with `pair.derive(...)`
|
||||
- `assert` now acts like a real asserts, with no return - signature adapted for new TS 3.7
|
||||
|
||||
|
||||
## 1.6.1 Oct 24, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- `pair.sign(message)` now takes an optional second `options?: SignOptions` parameter, where `SignOptions` is currently defined as `{ withType: boolean }`. Here `withType` instructs the signing to prepend the type of signature (ed2551, sr25519 or ecdsa). This is used for the new Polkadot/Substrate MultiSignature format.
|
||||
|
||||
|
||||
## 1.5.1 Sep 25, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix typings on the Keyring-exposed encode & decodeAddress
|
||||
- Allow ss58Format = 0 as a valid value
|
||||
- Loosen type definitions for allowed ss58format values (still checked against allowed array)
|
||||
|
||||
|
||||
## 1.4.1 Sep 12, 2019
|
||||
|
||||
- **Breaking change** To set the `ss58Format`, you should now use `setSS58Format` as opposed to the old `setAddressPrefix`
|
||||
|
||||
Changes:
|
||||
|
||||
- Renamed `keyring.setAddressPrefix` to `keyring.setSS58Format`
|
||||
- Deprecated `addressPrefix` on the keyring options, added the `ss58Format` as a replacement (aligning with chain properties - the old version is still accepted)
|
||||
- Added `stringToHex` and `hexToString` conversion utilities to `@polkadot/util`
|
||||
- Swap to [Babel 7.6.0](https://babeljs.io/) for all compilation, for latest improvements in code generation
|
||||
|
||||
|
||||
## 1.3.1 Sep 10, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove the `ExtError` class, always prefer the standard JS `Error` object for errors. This would bre a breaking change for any applications using `ExtError`
|
||||
|
||||
|
||||
## 1.2.1 Sep 09, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Keyring `addFromAddress` can now be used to store external accounts, for example those provided by external signers
|
||||
- Maintainability updates
|
||||
|
||||
|
||||
## 1.1.1 Aug 09, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- `assertSingletonPackage` now warns via console.warn, but does not throw. This does allow the info to come accross while still allowing the app developers using multiple libraries time to fix.
|
||||
|
||||
|
||||
## 1.0.1 Aug 02, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- `formatBalance` now allows for `Compact` inputs
|
||||
- `formaBalance` now allows correct formatting of very large decimals
|
||||
|
||||
### 0.94.1 Jul 20, 2019
|
||||
|
||||
## 0.94.1 Jul 20, 2019
|
||||
Changes:
|
||||
|
||||
- Add `checkAddress(address, prefix)` to `@polkadot/util-crypto` that validates an ss-58 address
|
||||
- Add support for the Kusama network (as a valid checked prefix)
|
||||
@@ -142,7 +512,10 @@
|
||||
- The ed25519 key for Alice (representing the session), now appears in the test keyrings
|
||||
- Fix missing dependencies for keyring (after address moves in 0.93.1)
|
||||
|
||||
### 0.93.1 Jun 14, 2019
|
||||
|
||||
## 0.93.1 Jun 14, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Breaking: External pair interface for keyring has been changed. Instead of
|
||||
- `getMeta` use the `meta` getter, i.e. `console.log(pair.meta.name)`
|
||||
@@ -150,133 +523,176 @@
|
||||
- `publicKey` use the `publicKey` getter, i.e. `console.log(pair.publicKey)`
|
||||
- `Move decodeAddress`, `encodeAddress` & `setAddressPrefix` functions into `@polkadot/util-crypto` from `@polkadot/keyring`. External interfaces should not be affected at this point since it is also (still) exported and exposed on keyring
|
||||
|
||||
### 0.92.1 Jun 04, 2019
|
||||
|
||||
## 0.92.1 Jun 04, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Only allow integer input values into `formatBalance`
|
||||
- Allow `formatBalance`, `formatDecimal` & `formatNumber` to cater for negative numbers
|
||||
- Add 'Bob//stash' to testing keyring, joining the existing 'Alice//stash'
|
||||
|
||||
### 0.91.1 May 22, 2019
|
||||
|
||||
## 0.91.1 May 22, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- ed25519/sr25519 sign & verify functions can now take the message input as Uint8Array/string/hex and verify allows for the signature/publicKey to be specified as Uint8Array/hex
|
||||
- Update `@polkadot/wasm` to include a maintenance bump for the `w3f/schnorrkel` libraries
|
||||
|
||||
### 0.90.1 May 08, 2019
|
||||
|
||||
## 0.90.1 May 08, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Moving towards 1.0
|
||||
- Added bnMin & bnMax functions
|
||||
|
||||
### 0.76.1 Apr 03, 2019
|
||||
|
||||
## 0.76.1 Apr 03, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Fix `addFromMnemonic` to generate using new-style derivation.
|
||||
- Pull in `formatBalance`, `formatDecimal`, `formatElapsed`, `formatNumber`, `calcSi`, `findSi` & `isTestChain` utility functions from the originals in `@polkadot/ui-util`
|
||||
- Swap out `wasm-schnorrkel` & `wasm-ed25519` for combined version with `wasm-crypto`
|
||||
- Swap DB interfaces to optional LRU, removing `transactionAsync` (client-only changes)
|
||||
|
||||
### 0.75.1 Mar 29, 2019
|
||||
|
||||
## 0.75.1 Mar 29, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Start journey to 1.0
|
||||
|
||||
### 0.42.1 Mar 28, 2019
|
||||
|
||||
## 0.42.1 Mar 28, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `assertSingletonPackage` to util
|
||||
- Ensure that only a single keyring instance is loaded (uses above)
|
||||
|
||||
### 0.41.1 Mar 25, 2019
|
||||
|
||||
## 0.41.1 Mar 25, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Extensions to the client-specific database interfaces (non-breaking for API and util users)
|
||||
|
||||
### 0.40.1 Mar 23, 2019
|
||||
|
||||
## 0.40.1 Mar 23, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Add additional derivation path extraction mechanisms to util-crypto
|
||||
- Add createFromUri function to keypair (creates keypair, does not add it)
|
||||
- Allow all crypto hashing & ed25519 to use WASM (as available, JS fallbacks)
|
||||
|
||||
### 0.39.1 Mar 20, 2019
|
||||
|
||||
## 0.39.1 Mar 20, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Pull in bip39 generation functions from `@poladkot/wasm-crypto` with a fallback to the pure JS versions
|
||||
|
||||
### 0.38.1 Mar 18, 2019
|
||||
|
||||
## 0.38.1 Mar 18, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Align with current substrate master for sr25519 keys and hard/soft derivation
|
||||
- Swap default dev keys to derived (sr25519)
|
||||
|
||||
### 0.37.1 Mar 14, 2019
|
||||
|
||||
## 0.37.1 Mar 14, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Swap to publishing -beta.x on merge (non-breaking testing)
|
||||
|
||||
### 0.36.1 Mar 13, 2019
|
||||
|
||||
## 0.36.1 Mar 13, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Add `fromUri` to keyring along with hard & soft key derivation.
|
||||
|
||||
### 0.35.1 Mar 04, 2019
|
||||
|
||||
## 0.35.1 Mar 04, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Remove NodeJs-only `syncify` function, not exported by the package (with binary dependency for Node)
|
||||
|
||||
### 0.34.1 Feb 13, 2019
|
||||
|
||||
## 0.34.1 Feb 13, 2019
|
||||
|
||||
Changes:
|
||||
|
||||
- Keyring now allows for ed25519 and sr25519 instances. Upon creation, you need to pass the `ed25519`or `sr25519` string to denote the type, i.e. `new Keyring({ type: 'sr25519' })`
|
||||
|
||||
### 0.33.1 Nov 22, 2018
|
||||
|
||||
### 0.32.1 Oct 18, 2018
|
||||
## 0.33.1 Nov 22, 2018
|
||||
|
||||
### 0.31.1 Oct 12, 2018
|
||||
## 0.32.1 Oct 18, 2018
|
||||
|
||||
### 0.30.1 Sep 11, 2018
|
||||
## 0.31.1 Oct 12, 2018
|
||||
|
||||
### 0.29.1 Sep 01, 2018
|
||||
## 0.30.1 Sep 11, 2018
|
||||
|
||||
### 0.28.1 Aug 11, 2018
|
||||
## 0.29.1 Sep 01, 2018
|
||||
|
||||
### 0.27.1 Aug 06, 2018
|
||||
## 0.28.1 Aug 11, 2018
|
||||
|
||||
### 0.26.1 Jun 27, 2018
|
||||
## 0.27.1 Aug 06, 2018
|
||||
|
||||
### 0.25.1 Jun 26, 2018
|
||||
## 0.26.1 Jun 27, 2018
|
||||
|
||||
### 0.24.1 Jun 22, 2018
|
||||
## 0.25.1 Jun 26, 2018
|
||||
|
||||
### 0.23.1 Jun 21, 2018
|
||||
## 0.24.1 Jun 22, 2018
|
||||
|
||||
### 0.22.1 May 24, 2018
|
||||
## 0.23.1 Jun 21, 2018
|
||||
|
||||
### 0.21.1 May 17, 2018
|
||||
## 0.22.1 May 24, 2018
|
||||
|
||||
### 0.20.1 May 16, 2018
|
||||
## 0.21.1 May 17, 2018
|
||||
|
||||
### 0.19.1 Apr 19, 2018
|
||||
## 0.20.1 May 16, 2018
|
||||
|
||||
### 0.18.1 Mar 20, 2018
|
||||
## 0.19.1 Apr 19, 2018
|
||||
|
||||
### 0.17.1 Mar0 8, 2018
|
||||
## 0.18.1 Mar 20, 2018
|
||||
|
||||
### 0.16.1 Feb 23, 2018
|
||||
## 0.17.1 Mar0 8, 2018
|
||||
|
||||
### 0.15.1 Feb 15, 2018
|
||||
## 0.16.1 Feb 23, 2018
|
||||
|
||||
### 0.14.1 Feb 07, 2018
|
||||
## 0.15.1 Feb 15, 2018
|
||||
|
||||
### 0.13.1 Jan 25, 2018
|
||||
## 0.14.1 Feb 07, 2018
|
||||
|
||||
### 0.12.1 Jan 11, 2018
|
||||
## 0.13.1 Jan 25, 2018
|
||||
|
||||
### 0.11.1 Dec 30, 2017
|
||||
## 0.12.1 Jan 11, 2018
|
||||
|
||||
### 0.10.1 Dec 17, 2017
|
||||
## 0.11.1 Dec 30, 2017
|
||||
|
||||
### 0.9.1 Dec 14, 2017
|
||||
## 0.10.1 Dec 17, 2017
|
||||
|
||||
### 0.8.1 Dec 12, 2017
|
||||
## 0.9.1 Dec 14, 2017
|
||||
|
||||
### 0.7.1 Dec 11, 2017
|
||||
## 0.8.1 Dec 12, 2017
|
||||
|
||||
### 0.6.1 Nov 30, 2017
|
||||
## 0.7.1 Dec 11, 2017
|
||||
|
||||
### 0.5.1 Nov 20, 2017
|
||||
## 0.6.1 Nov 30, 2017
|
||||
|
||||
### 0.4.1 Nov 19, 2017
|
||||
## 0.5.1 Nov 20, 2017
|
||||
|
||||
### 0.3.1 Nov 19, 2017
|
||||
## 0.4.1 Nov 19, 2017
|
||||
|
||||
### 0.2.1 Nov 18, 2017
|
||||
## 0.3.1 Nov 19, 2017
|
||||
|
||||
## 0.2.1 Nov 18, 2017
|
||||
|
||||
+3
-4
@@ -1,5 +1,4 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @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,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
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 @@
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
module.exports = {
|
||||
base: '/common/',
|
||||
title: 'polkadot-js/common',
|
||||
description: 'Common utilities and libraries that are in use accross all @polkadot projects',
|
||||
markdown: {
|
||||
lineNumbers: true
|
||||
},
|
||||
themeConfig: {
|
||||
displayAllHeaders: true,
|
||||
nav: [
|
||||
{ text: 'Polkadot/Substrate Apps', link: 'https://polkadot.js.org/apps/' },
|
||||
{ text: 'Project family', link: 'https://polkadot.js.org/' },
|
||||
{
|
||||
text: 'Documentation',
|
||||
items: [
|
||||
{ text: 'API Reference', link: 'https://polkadot.js.org/api/' },
|
||||
{ text: 'Utility Reference (this)', link: 'https://polkadot.js.org/common/' },
|
||||
{ text: 'UI Libs Reference', link: 'https://polkadot.js.org/ui/' },
|
||||
]
|
||||
},
|
||||
{ text: 'GitHub', link: 'https://github.com/polkadot-js/common' }
|
||||
],
|
||||
search: false,
|
||||
sidebar: [
|
||||
{
|
||||
title: 'Examples (keyring)',
|
||||
path: '/examples/keyring/',
|
||||
collapsable: false,
|
||||
sidebarDepth: 1,
|
||||
children: [
|
||||
['/examples/keyring/01_create_account/', 'Create account'],
|
||||
['/examples/keyring/02_load_accounts/', 'Load Accounts']
|
||||
]
|
||||
},
|
||||
['/util/', '@polkadot/util'],
|
||||
['/util-crypto/', '@polkadot/util-crypto'],
|
||||
['/keyring/', '@polkadot/keyring'],
|
||||
'/CONTRIBUTING.md'
|
||||
]
|
||||
}
|
||||
};
|
||||
@@ -1,9 +0,0 @@
|
||||
$accentColor = #fd8824
|
||||
$textColor = #2c3e50
|
||||
|
||||
.home .hero .description,
|
||||
.home .feature h2,
|
||||
.home .feature p {
|
||||
color: $textColor
|
||||
opacity: 0.75
|
||||
}
|
||||
@@ -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>
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
home: true
|
||||
heroText:
|
||||
tagline:
|
||||
# Bringing JavaScript to the Polkadot world.
|
||||
# actionText: Repository Overview
|
||||
# actionLink: /REPOS.md
|
||||
features:
|
||||
- title: Keyring
|
||||
details: Manage user keys allowing for signing, encryption and decryption.
|
||||
- title: Utilities
|
||||
details: Various user utilities to work with data and perform check on it.
|
||||
- title: Crypto
|
||||
details: A thin and easy-to-use wrapper around cryptographic and hashing libraries.
|
||||
|
||||
footer: Apache-2 Licensed | Copyright © 2017-2019 polkadot-js authors and contributors
|
||||
---
|
||||
|
||||
## Welcome
|
||||
|
||||
Various useful utility functions that are used across all projects in the [@polkadot](https://polkadot.js.org) namespace. It provides utility functions with additional safety checks, allowing not only for consistent coding, but also reducing the general boilerplate.
|
||||
|
||||
::: tip Examples
|
||||
In a rush and just want examples? [Jump right in](/examples/keyring/) and get a handle on using the various components in your projects.
|
||||
:::
|
||||
|
||||
## Available packages
|
||||
|
||||
It is split up into a number of internal packages, namely utilities -
|
||||
|
||||
- [keyring](keyring/README.md) Keyring management
|
||||
- [util](util/README.md) General utilities
|
||||
- [util-crypto](util-crypto/README.md) Crypto and hashing utilities
|
||||
|
||||
## The Polkadot Project
|
||||
|
||||
You can read more about the Polkadot Network at [https://polkadot.network/](https://polkadot.network/)
|
||||
|
||||
## Github repositories
|
||||
|
||||
You can find the Polkadot repositories at:
|
||||
|
||||
- [https://github.com/polkadot-js](https://github.com/polkadot-js)
|
||||
- [https://github.com/paritytech/polkadot](https://github.com/paritytech/polkadot)
|
||||
- [https://github.com/paritytech/substrate](https://github.com/paritytech/substrate)
|
||||
|
||||
This documentation is generated from [https://github.com/polkadot-js/common](https://github.com/polkadot-js/common)
|
||||
|
||||
## Contributing
|
||||
|
||||
Contribution to Polkadot JS Common are more than welcome. You can [report issues](https://github.com/polkadot-js/common/issues/new) and [log feature requests](https://github.com/polkadot-js/common/issues/new).
|
||||
@@ -1 +0,0 @@
|
||||
yarn.lock
|
||||
@@ -1,5 +0,0 @@
|
||||
# Create Account
|
||||
|
||||
The following example shows how to create and account with keyring.
|
||||
|
||||
<<< @/docs/examples/keyring/01_create_account/index.js
|
||||
@@ -1,22 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
|
||||
// Import Keyring class and utility function
|
||||
const Keyring = require('@polkadot/keyring').default;
|
||||
const stringToU8a = require('@polkadot/util/string/toU8a').default;
|
||||
|
||||
async function main () {
|
||||
// Create account seed for Alice
|
||||
const ALICE_SEED = 'Alice'.padEnd(32, ' ');
|
||||
|
||||
// Create an instance of the Keyring
|
||||
const keyring = new Keyring();
|
||||
|
||||
// Create pair and add Alice to keyring pair dictionary (with account seed)
|
||||
const pairAlice = keyring.addFromSeed(stringToU8a(ALICE_SEED));
|
||||
|
||||
console.log(`Created keyring pair for Alice with address: ${keyring.getPair(pairAlice.address).address}`);
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => process.exit());
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "01_create_account",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to create an account",
|
||||
"main": "index.js",
|
||||
"author": "ltfschoen",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util": "^0.32.10",
|
||||
"@polkadot/keyring": "^0.32.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Load Accounts
|
||||
|
||||
The following example shows how to load all accounts from the keyring as pairs and convert them into JSON format.
|
||||
|
||||
<<< @/docs/examples/keyring/02_load_accounts/index.js
|
||||
@@ -1,34 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
|
||||
// Import Keyring class and utility function
|
||||
const Keyring = require('@polkadot/keyring').default;
|
||||
const stringToU8a = require('@polkadot/util/string/toU8a').default;
|
||||
|
||||
async function main () {
|
||||
// Create account seed for Alice and Bob
|
||||
const ALICE_SEED = 'Alice'.padEnd(32, ' ');
|
||||
const BOB_SEED = 'Bob'.padEnd(32, ' ');
|
||||
|
||||
// Create an instance of the Keyring
|
||||
const keyring = new Keyring();
|
||||
|
||||
// Create their pairs with account seeds. Add to keyring pair dictionary
|
||||
keyring.addFromSeed(stringToU8a(ALICE_SEED));
|
||||
keyring.addFromSeed(stringToU8a(BOB_SEED));
|
||||
|
||||
// Note that we did not use `addFromAddress` since it does not add the
|
||||
// secret key to memory so we cannot later retrieve it with `getPairs`
|
||||
|
||||
// Retrieve all keyring pairs from the keyring pair dictionary
|
||||
keyring
|
||||
.getPairs()
|
||||
.forEach((pair, index) => {
|
||||
const { address } = pair;
|
||||
|
||||
console.log(`\nAccount with index #${index} has json: `, JSON.stringify(keyring.toJson(address), null, 2));
|
||||
});
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => process.exit());
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "02_load_accounts",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to load accounts",
|
||||
"main": "index.js",
|
||||
"author": "ltfschoen",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util": "^0.32.10",
|
||||
"@polkadot/keyring": "^0.32.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Validate Adress
|
||||
|
||||
- This function will return true if the address is a legitamate Polkadot address and false if it is not
|
||||
|
||||
- Works both with Ed25519 and Sr25519 key types
|
||||
@@ -1,24 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
|
||||
const { decodeAddress, encodeAddress } = require('@polkadot/keyring');
|
||||
const { hexToU8a, isHex } = require('@polkadot/util');
|
||||
|
||||
const address = '5GrpknVvGGrGH3EFuURXeMrWHvbpj3VfER1oX5jFtuGbfzCE';
|
||||
|
||||
const isValidAddressPolkadotAddress = () => {
|
||||
try {
|
||||
encodeAddress(
|
||||
isHex(address)
|
||||
? hexToU8a(address)
|
||||
: decodeAddress(address)
|
||||
);
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const isValid = isValidAddressPolkadotAddress();
|
||||
|
||||
console.log(isValid);
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "03_validate_address",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to validate a polkadot address",
|
||||
"main": "index.js",
|
||||
"author": "Jesse",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/keyring": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
# Keyring Examples
|
||||
|
||||
Here you will find a list of examples that takes you through the basics of connecting to a local node, retrieving data from the Node and chain and execute transactions on the chain.
|
||||
|
||||
## Running the examples
|
||||
|
||||
From within each folder run the following to install required dependencies and to execute the example:
|
||||
```shell
|
||||
yarn;
|
||||
yarn start
|
||||
```
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# Encrypt & Decrypt Message using NaCl
|
||||
|
||||
The following example shows how to encrypt and decrypt a message with NaCl (pronouced "salt"), which is a Networking and Cryptography library used in util-crypto.
|
||||
|
||||
[include](index.js)
|
||||
@@ -1,27 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
|
||||
const { naclDecrypt, naclEncrypt } = require('@polkadot/util-crypto');
|
||||
|
||||
async function main () {
|
||||
const secret = new Uint8Array(32);
|
||||
const messagePreEncryption = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
|
||||
const noncePreEncryption = new Uint8Array(24);
|
||||
|
||||
// Encrypt the message
|
||||
const { encrypted, nonce } = naclEncrypt(messagePreEncryption, secret, noncePreEncryption);
|
||||
|
||||
// Show contents of the encrypted message
|
||||
console.log(`Encrypted message: ${JSON.stringify(encrypted, null, 2)}`);
|
||||
|
||||
// Decrypt the message
|
||||
const messageDecrypted = naclDecrypt(encrypted, nonce, secret);
|
||||
// Convert each Uint8Array to a string for comparison
|
||||
const isMatch = messagePreEncryption.toString === messageDecrypted.toString;
|
||||
|
||||
// Verify that the decrypted message matches the original message
|
||||
console.log(`Does the decrypted message match the original message? ${isMatch}`);
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => process.exit());
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "01_encrypt_decrypt_message_nacl",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to encrypt and decrypt a message using NaCl",
|
||||
"main": "index.js",
|
||||
"author": "ltfschoen",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util-crypto": "^0.32.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Sign & Verify Message using NaCl
|
||||
|
||||
The following example shows how to sign and verify a message with NaCl (pronouced "salt"), which is a Networking and Cryptography library used in util-crypto.
|
||||
|
||||
[include](index.js)
|
||||
@@ -1,33 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
|
||||
const { stringToU8a, u8aToHex } = require('@polkadot/util');
|
||||
const { naclEncrypt, naclKeypairFromSeed, naclSign, naclVerify, randomAsU8a } = require('@polkadot/util-crypto');
|
||||
|
||||
async function main () {
|
||||
// Create account seed for Alice as fallback if generated mnemonic not valid
|
||||
const seedAlice = 'Alice'.padEnd(32, ' ');
|
||||
|
||||
// Generate new public/secret keypair for Alice from the supplied seed
|
||||
const { publicKey, secretKey } = naclKeypairFromSeed(stringToU8a(seedAlice));
|
||||
|
||||
// Encrypt message. Create Uint8Array's filled with random bytes of specified length
|
||||
const secret = randomAsU8a(32);
|
||||
const messagePreEncryption = stringToU8a('please send me DOTs');
|
||||
const noncePreEncryption = randomAsU8a(24);
|
||||
|
||||
const { encrypted } = naclEncrypt(messagePreEncryption, secret, noncePreEncryption);
|
||||
|
||||
// Sign the message with a valid signature
|
||||
const messageSignature = naclSign(encrypted, secretKey);
|
||||
|
||||
console.log(`Message signature: ${u8aToHex(messageSignature)}`);
|
||||
|
||||
// Validate that the message was correctly signed
|
||||
const isValidSignature = naclVerify(encrypted, messageSignature, publicKey);
|
||||
|
||||
console.log(`Was the message correctly signed? ${isValidSignature}`);
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => process.exit());
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "02_sign_verify_message_nacl",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to sign and verify a message using NaCl",
|
||||
"main": "index.js",
|
||||
"author": "ltfschoen",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util-crypto": "^0.32.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Create & Generate Mnemonic using BIP39
|
||||
|
||||
The following example shows how to create and generate mnemonics using BIP39.
|
||||
|
||||
[include](index.js)
|
||||
@@ -1,29 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
const { mnemonicGenerate, mnemonicToSeed, mnemonicValidate, naclKeypairFromSeed } = require('@polkadot/util-crypto');
|
||||
|
||||
async function main () {
|
||||
// Create mnemonic string for Alice using BIP39
|
||||
const mnemonicAlice = mnemonicGenerate();
|
||||
|
||||
console.log(`Generated mnemonic: ${mnemonicAlice}`);
|
||||
|
||||
// Validate the mnemic string that was generated
|
||||
const isValidMnemonic = mnemonicValidate(mnemonicAlice);
|
||||
|
||||
console.log(`isValidMnemonic: ${isValidMnemonic}`);
|
||||
|
||||
// Create valid seed from mnemonic as u8a and convert it to a string
|
||||
// FIXME - Replace with mnemonicToSeed once exposed
|
||||
const seedAlice = mnemonicToSeed(mnemonicAlice);
|
||||
|
||||
// Generate new public/secret keypair for Alice from the supplied seed
|
||||
const { publicKey, secretKey } = naclKeypairFromSeed(seedAlice);
|
||||
|
||||
// Encrypt, Sign and Validate the message. See Example 'Sign & Verify Message'
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => process.exit());
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "03_mnemonic_generate_validate_bip39",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to sign and verify a message using NaCl",
|
||||
"main": "index.js",
|
||||
"author": "ltfschoen",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util-crypto": "^0.32.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rimraf": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Generate a Multisig Account
|
||||
|
||||
Substrate provides a multisig dispatch function in its
|
||||
[Utility pallet](https://crates.parity.io/pallet_utility/index.html). This example generates the
|
||||
address that would correspond to a set of addresses and threshold.
|
||||
@@ -1,40 +0,0 @@
|
||||
/* eslint-disable header/header */
|
||||
import { createKeyMulti, encodeAddress, sortAddresses } from '@polkadot/util-crypto';
|
||||
|
||||
const SS58Prefix = 0;
|
||||
|
||||
// Input the addresses that will make up the multisig account.
|
||||
const addresses = [
|
||||
'1nUC7afqmo7zwRFWxDjrUQu9skk6fk99pafb4SiyGSRc8z3',
|
||||
'1ZX2XntfLEHrBPy73DpfQp9rG7pbLyvrFjEpi7mNKQgyga5',
|
||||
'14b1kB7CrqzRUeMsKc26FJ73f8FCpxAX6sNieu9gfYSfJuoL'
|
||||
];
|
||||
|
||||
// The number of accounts that must approve. Must be greater than 0 and less than
|
||||
// or equal to the total number of addresses.
|
||||
const threshold = 2;
|
||||
|
||||
// The address (as index in `addresses`) that will submit a transaction.
|
||||
const index = 0;
|
||||
|
||||
function main () {
|
||||
// Address as a byte array.
|
||||
const multiAddress = createKeyMulti(addresses, threshold);
|
||||
|
||||
// Convert byte array to SS58 encoding.
|
||||
const Ss58Address = encodeAddress(multiAddress, SS58Prefix);
|
||||
|
||||
console.log(`\nMultisig Address: ${Ss58Address}`);
|
||||
|
||||
// Take addresses and remove the sender.
|
||||
const otherSignatories = addresses.filter((who) => who !== addresses[index]);
|
||||
|
||||
// Sort them by public key.
|
||||
const otherSignatoriesSorted = sortAddresses(otherSignatories, SS58Prefix);
|
||||
|
||||
console.log(`\nOther Signatories: ${otherSignatoriesSorted}\n`);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"name": "04_generate_multisig_address",
|
||||
"version": "0.1.0",
|
||||
"description": "Example showing how to generate a multisig address for Substrate's Utility pallet",
|
||||
"main": "index.js",
|
||||
"author": "joepetrowski",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"start": "node index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@polkadot/util-crypto": "^2.9.0-beta.1"
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
# Util-Crypto Examples
|
||||
|
||||
Here you will find a list of examples that takes you through the basics of encrypting and decrypting messages using NaCl, signing a message with a seed and verifying it using NaCl, and generating and validating mnemonics for account seeds.
|
||||
|
||||
## Running the examples
|
||||
|
||||
From within each folder run the following to install required dependencies and to execute the example:
|
||||
```shell
|
||||
yarn;
|
||||
yarn start
|
||||
```
|
||||
|
||||
|
||||
@@ -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>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.3 KiB |
+23
-7
@@ -1,20 +1,36 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @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: {
|
||||
'@polkadot/hw-ledger-transports(.*)$': '<rootDir>/packages/hw-ledger-transports/src/node',
|
||||
// eslint-disable-next-line sort-keys
|
||||
'@polkadot/hw-ledger(.*)$': '<rootDir>/packages/hw-ledger/src/$1',
|
||||
'@polkadot/keyring(.*)$': '<rootDir>/packages/keyring/src/$1',
|
||||
'@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',
|
||||
'@polkadot/x-global(.*)$': '<rootDir>/packages/x-global/src/$1',
|
||||
'@polkadot/x-rxjs(.*)$': '<rootDir>/packages/x-rxjs/src/$1'
|
||||
},
|
||||
modulePathIgnorePatterns: [
|
||||
'<rootDir>/packages/hw-ledger/build',
|
||||
'<rootDir>/packages/hw-ledger-transports/build',
|
||||
'<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-global/build',
|
||||
'<rootDir>/packages/x-randomvalues/build',
|
||||
'<rootDir>/packages/x-rxjs/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,11 +0,0 @@
|
||||
// Copyright 2017-2020 @polkadot/util authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
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);
|
||||
};
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"npmClient": "yarn",
|
||||
"useWorkspaces": true,
|
||||
"command": {
|
||||
"publish": {
|
||||
"allowBranch": "master"
|
||||
}
|
||||
},
|
||||
"packages": [
|
||||
"packages/*"
|
||||
],
|
||||
"version": "2.12.2"
|
||||
}
|
||||
+8
-9
@@ -7,24 +7,23 @@
|
||||
"packages/*"
|
||||
],
|
||||
"resolutions": {
|
||||
"babel-core": "^7.0.0-bridge.0"
|
||||
"typescript": "^4.1.3"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "polkadot-dev-build-ts",
|
||||
"build:release": "polkadot-ci-ghact-build",
|
||||
"docs": "polkadot-dev-build-docs",
|
||||
"docs:release": "polkadot-ci-ghact-docs",
|
||||
"lint": "polkadot-dev-run-lint",
|
||||
"clean": "polkadot-dev-clean-build",
|
||||
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
|
||||
"postinstall": "polkadot-dev-yarn-only",
|
||||
"test": "polkadot-dev-run-test --coverage --runInBand",
|
||||
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck",
|
||||
"test:one": "polkadot-dev-run-test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.9.6",
|
||||
"@polkadot/dev": "^0.55.6",
|
||||
"@polkadot/ts": "^0.3.25",
|
||||
"@types/jest": "^25.2.3"
|
||||
"@babel/core": "^7.12.13",
|
||||
"@polkadot/dev": "^0.61.25",
|
||||
"@polkadot/ts": "^0.3.59",
|
||||
"@types/jest": "^26.0.20"
|
||||
},
|
||||
"version": "2.12.2"
|
||||
"version": "5.6.2"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,2 @@
|
||||
# @polkadot/hw-ledger-transports
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "@polkadot/hw-ledger-transports",
|
||||
"version": "5.6.2",
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"main": "node.js",
|
||||
"browser": "browser.js",
|
||||
"react-native": "react-native.js",
|
||||
"sideEffects": false,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.12.13",
|
||||
"@ledgerhq/hw-transport-webusb": "^5.41.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/ledgerhq__hw-transport-node-hid": "^4.22.2",
|
||||
"@types/ledgerhq__hw-transport-webusb": "^4.70.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid-singleton": "^5.41.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { TransportDef } from './types';
|
||||
|
||||
import LedgerWebUSB from '@ledgerhq/hw-transport-webusb';
|
||||
|
||||
const transports: TransportDef[] = [
|
||||
// deprecated
|
||||
// import LedgerU2F from '@ledgerhq/hw-transport-u2f';
|
||||
// {
|
||||
// create: (): Promise<Transport> =>
|
||||
// LedgerU2F.create(),
|
||||
// type: 'u2f'
|
||||
// },
|
||||
{
|
||||
create: (): Promise<Transport> =>
|
||||
LedgerWebUSB.create(),
|
||||
type: 'webusb'
|
||||
}
|
||||
];
|
||||
|
||||
export { transports };
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
declare module '@ledgerhq/hw-transport-node-hid-noevents' {
|
||||
import Transport from '@ledgerhq/hw-transport';
|
||||
|
||||
export default class TransportNodeHidNoEvents extends Transport<string> {}
|
||||
export function getDevices(): Array<unknown>
|
||||
}
|
||||
|
||||
declare module '@ledgerhq/hw-transport-node-hid-singleton' {
|
||||
import TransportNodeHidNoEvents from '@ledgerhq/hw-transport-node-hid-noevents';
|
||||
|
||||
export default class TransportNodeHid extends TransportNodeHidNoEvents { }
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { TransportDef } from './types';
|
||||
|
||||
import LedgerHid from '@ledgerhq/hw-transport-node-hid-singleton';
|
||||
|
||||
const transports: TransportDef[] = [
|
||||
{
|
||||
create: (): Promise<Transport> =>
|
||||
LedgerHid.create(),
|
||||
type: 'hid'
|
||||
}
|
||||
];
|
||||
|
||||
export { transports };
|
||||
@@ -0,0 +1,8 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { TransportDef } from './types';
|
||||
|
||||
const transports: TransportDef[] = [];
|
||||
|
||||
export { transports };
|
||||
@@ -0,0 +1,11 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import Transport from '@ledgerhq/hw-transport';
|
||||
|
||||
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
|
||||
|
||||
export interface TransportDef {
|
||||
create (): Promise<Transport>;
|
||||
type: LedgerTypes;
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,2 @@
|
||||
# @polkadot/hw-ledger
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "@polkadot/hw-ledger",
|
||||
"version": "5.6.2",
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.12.13",
|
||||
"@polkadot/hw-ledger-transports": "5.6.2",
|
||||
"@polkadot/util": "^5.6.2",
|
||||
"@zondax/ledger-polkadot": "^0.13.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type Transport from '@ledgerhq/hw-transport';
|
||||
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
|
||||
|
||||
import { newDockApp, newKusamaApp, newPolkadotApp, newPolymeshApp, ResponseBase, SubstrateApp } from '@zondax/ledger-polkadot';
|
||||
|
||||
import { transports } from '@polkadot/hw-ledger-transports';
|
||||
import { assert, bufferToU8a, u8aToBuffer, u8aToHex } from '@polkadot/util';
|
||||
|
||||
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
|
||||
|
||||
export const LEDGER_DEFAULT_CHANGE = 0x80000000;
|
||||
|
||||
export const LEDGER_DEFAULT_INDEX = 0x80000000;
|
||||
|
||||
const SUCCESS_CODE = 0x9000;
|
||||
|
||||
// These match up with the network keys in the @polkadot/networks package
|
||||
// (which is turn aligns with the substrate/ss58-registry.json as the single
|
||||
// source of truth)
|
||||
const APPS: Record<string, (transport: Transport) => SubstrateApp> = {
|
||||
dock: newDockApp,
|
||||
kusama: newKusamaApp,
|
||||
polkadot: newPolkadotApp,
|
||||
polymesh: newPolymeshApp
|
||||
};
|
||||
|
||||
type Chain = keyof typeof APPS;
|
||||
|
||||
// A very basic wrapper for a ledger app -
|
||||
// - it connects automatically, creating an app as required
|
||||
// - Promises return errors (instead of wrapper errors)
|
||||
export class Ledger {
|
||||
#app: SubstrateApp | null = null;
|
||||
|
||||
#chain: Chain;
|
||||
|
||||
#transport: LedgerTypes;
|
||||
|
||||
constructor (transport: LedgerTypes, chain: Chain) {
|
||||
// u2f is deprecated
|
||||
assert(['hid', 'webusb'].includes(transport), `Unsupported transport ${transport}`);
|
||||
assert(Object.keys(APPS).includes(chain), `Unsupported chain ${chain}`);
|
||||
|
||||
this.#chain = chain;
|
||||
this.#transport = transport;
|
||||
}
|
||||
|
||||
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
|
||||
const { address, pubKey } = await this.#wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
||||
|
||||
return {
|
||||
address,
|
||||
publicKey: `0x${pubKey}`
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
public async getVersion (): Promise<LedgerVersion> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
|
||||
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await this.#wrapError(app.getVersion());
|
||||
|
||||
return {
|
||||
isLocked,
|
||||
isTestMode,
|
||||
version: [major, minor, patch]
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
|
||||
return this.#withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
|
||||
const buffer = u8aToBuffer(message);
|
||||
const { signature } = await this.#wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
|
||||
|
||||
return {
|
||||
signature: u8aToHex(bufferToU8a(signature))
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
#getApp = async (): Promise<SubstrateApp> => {
|
||||
if (!this.#app) {
|
||||
const def = transports.find(({ type }) => type === this.#transport);
|
||||
|
||||
assert(def, `Unable to find a transport for ${this.#transport}`);
|
||||
|
||||
const transport = await def.create();
|
||||
|
||||
this.#app = APPS[this.#chain](transport);
|
||||
}
|
||||
|
||||
return this.#app;
|
||||
};
|
||||
|
||||
#withApp = async <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> => {
|
||||
try {
|
||||
const app = await this.#getApp();
|
||||
|
||||
return await fn(app);
|
||||
} catch (error) {
|
||||
this.#app = null;
|
||||
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
|
||||
const result = await promise;
|
||||
|
||||
assert(result.return_code === SUCCESS_CODE, result.error_message);
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
|
||||
|
||||
export interface AccountOptions {
|
||||
account: number;
|
||||
addressIndex: number;
|
||||
change: number;
|
||||
}
|
||||
|
||||
export interface LedgerAddress {
|
||||
address: string;
|
||||
publicKey: string;
|
||||
}
|
||||
|
||||
export interface LedgerSignature {
|
||||
signature: string;
|
||||
}
|
||||
|
||||
export interface LedgerVersion {
|
||||
isLocked: boolean;
|
||||
isTestMode: boolean;
|
||||
version: [number, number, number];
|
||||
}
|
||||
@@ -15,7 +15,3 @@ Classes and Functions can be imported as follows:
|
||||
```js
|
||||
import Keyring from '@polkadot/keyring';
|
||||
```
|
||||
|
||||
## Utilities
|
||||
|
||||
[Utilities](SUMMARY.md)
|
||||
|
||||
@@ -1,34 +1,26 @@
|
||||
{
|
||||
"name": "@polkadot/keyring",
|
||||
"version": "2.12.2",
|
||||
"version": "5.6.2",
|
||||
"description": "Keyring management",
|
||||
"main": "index.js",
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"registry": "https://registry.npmjs.org"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/polkadot-js/common.git"
|
||||
},
|
||||
"keywords": [
|
||||
"Polkadot",
|
||||
"Keyring",
|
||||
"ed25519"
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"main": "index.js",
|
||||
"sideEffects": [
|
||||
"./detectPackage.js",
|
||||
"./detectPackage.mjs"
|
||||
],
|
||||
"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.9.6",
|
||||
"@polkadot/util": "2.12.2",
|
||||
"@polkadot/util-crypto": "2.12.2"
|
||||
"@babel/runtime": "^7.12.13",
|
||||
"@polkadot/util": "5.6.2",
|
||||
"@polkadot/util-crypto": "5.6.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@polkadot/util": "5.6.2",
|
||||
"@polkadot/util-crypto": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// default substrate dev phrase
|
||||
const DEV_PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// For esm, this should be import.meta.url or to get the same behavior as __dirname, we can use
|
||||
//
|
||||
// new URL(import.meta.url).pathname)
|
||||
//
|
||||
// The issue is the WP4 has "some" issues with import.meta.url. So because of bundlers, we can't have
|
||||
// nice things... In this case it is even worse since import.meta.url won't even make it compile, so
|
||||
// there is a complete dead end with usage thereof
|
||||
//
|
||||
// When that is fixed, a solution is to have both .js & .mjs files, with the following content -
|
||||
//
|
||||
// cjs: util.detectPackage(packageInfo, () => __dirname);
|
||||
// esm: detectPackage(packageInfo, () => import.meta.url);
|
||||
//
|
||||
// With the above we additionally need a .d.ts to just export the packageInfo
|
||||
|
||||
import { detectPackage } from '@polkadot/util';
|
||||
|
||||
import packageInfo from './package-info.json';
|
||||
|
||||
detectPackage(packageInfo, typeof __dirname !== 'undefined' && __dirname);
|
||||
|
||||
export { packageInfo };
|
||||
@@ -1,9 +1,8 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { hexToU8a, stringToU8a } from '@polkadot/util';
|
||||
import { cryptoWaitReady, setSS58Format, encodeAddress } from '@polkadot/util-crypto';
|
||||
import { cryptoWaitReady, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
|
||||
|
||||
import Keyring from '.';
|
||||
|
||||
@@ -31,6 +30,12 @@ describe('keypair', (): void => {
|
||||
).toEqual(publicKeyTwo);
|
||||
});
|
||||
|
||||
it('creates via a dev seed', (): void => {
|
||||
expect(
|
||||
keyring.addFromUri('//Alice').address
|
||||
).toEqual('5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu');
|
||||
});
|
||||
|
||||
it('creates a ed25519 pair via mnemonicToSeed', (): void => {
|
||||
expect(
|
||||
keyring.addFromUri(
|
||||
@@ -41,11 +46,11 @@ describe('keypair', (): void => {
|
||||
|
||||
it('adds from a mnemonic, with correct ss58', (): void => {
|
||||
setSS58Format(20); // this would not be used
|
||||
keyring.setSS58Format(68); // this would be used
|
||||
keyring.setSS58Format(2); // this would be used
|
||||
|
||||
const pair = keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {});
|
||||
|
||||
expect(pair.address).toEqual('7sPsxWPE5DzAyPT3VuoJYw5NTGscx9QYN9oddQx4kALKC3hH');
|
||||
expect(pair.address).toEqual('HSLu2eci2GCfWkRimjjdTXKoFSDL3rBv5Ey2JWCBj68cVZj');
|
||||
expect(encodeAddress(pair.publicKey)).toEqual('35cDYtPsdG1HUa2n2MaARgJyRz1WKMBZK1DL6c5cX7nugQh1');
|
||||
});
|
||||
|
||||
@@ -79,6 +84,16 @@ describe('keypair', (): void => {
|
||||
const signature = pair.sign(MESSAGE);
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
|
||||
it('signs and verifies (withType)', (): void => {
|
||||
const MESSAGE = stringToU8a('this is a message');
|
||||
const pair = keyring.getPair(publicKeyOne);
|
||||
const signature = pair.sign(MESSAGE, { withType: true });
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -108,11 +123,11 @@ describe('keypair', (): void => {
|
||||
});
|
||||
|
||||
it('adds from a mnemonic', (): void => {
|
||||
keyring.setSS58Format(68);
|
||||
keyring.setSS58Format(2);
|
||||
|
||||
expect(
|
||||
keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {}).address
|
||||
).toEqual('7qQGarA4PWjPPVHG4USn1yuuVZvEHN7XZz8o7EbAp48jayZQ');
|
||||
).toEqual('FSjXNRT2K1R5caeHLPD6WMrqYUpfGZB7ua8W89JFctZ1YqV');
|
||||
});
|
||||
|
||||
it('allows publicKeys retrieval', (): void => {
|
||||
@@ -145,6 +160,16 @@ describe('keypair', (): void => {
|
||||
const signature = pair.sign(MESSAGE);
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
|
||||
it('signs and verifies (withType)', (): void => {
|
||||
const MESSAGE = stringToU8a('this is a message');
|
||||
const pair = keyring.getPair(publicKeyOne);
|
||||
const signature = pair.sign(MESSAGE, { withType: true });
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -175,11 +200,11 @@ describe('keypair', (): void => {
|
||||
});
|
||||
|
||||
it('adds from a mnemonic', (): void => {
|
||||
keyring.setSS58Format(68);
|
||||
keyring.setSS58Format(2);
|
||||
|
||||
expect(
|
||||
keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card').address
|
||||
).toEqual('7ooxHV3mz4nnWbK8v7Mxcb71QMpof268eL1A2VrYWUNWJk8P');
|
||||
).toEqual('DrRE1KAcs4pCicX8yJPh7YxkLPQ2vXnCFSVRPQfx38KjEFe');
|
||||
});
|
||||
|
||||
it('allows publicKeys retrieval', (): void => {
|
||||
@@ -204,12 +229,210 @@ describe('keypair', (): void => {
|
||||
).toEqual('5DzMsaYFhmpRdErWrP6K6PD7UXzYoeETToSBUrZSvxasqWRz');
|
||||
});
|
||||
|
||||
it('allows creation from JSON', (): void => {
|
||||
keyring.setSS58Format(2);
|
||||
const pair = keyring.createFromJson(
|
||||
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}')
|
||||
);
|
||||
|
||||
expect(pair.address).toEqual('DHL8HKFuTTR55JzzLmkJRCAfPBbuevKaT9cXikxbEV97Ko8');
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad'));
|
||||
});
|
||||
|
||||
it('fails toJson() when password is incorrect', (): void => {
|
||||
const pair = keyring.createFromJson(
|
||||
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}')
|
||||
);
|
||||
|
||||
expect(
|
||||
() => pair.toJson('invalid')
|
||||
).toThrow(/Unable to decode using the supplied passphrase/);
|
||||
});
|
||||
|
||||
it('pass toJson() when password is correct', (): void => {
|
||||
const pair = keyring.createFromJson(
|
||||
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}')
|
||||
);
|
||||
|
||||
expect(
|
||||
() => pair.toJson('testing')
|
||||
).not.toThrow();
|
||||
});
|
||||
|
||||
it('signs and verifies', (): void => {
|
||||
const MESSAGE = stringToU8a('this is a message');
|
||||
const pair = keyring.getPair(addressKeyOne);
|
||||
const signature = pair.sign(MESSAGE);
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
|
||||
it('signs and verifies (withType)', (): void => {
|
||||
const MESSAGE = stringToU8a('this is a message');
|
||||
const pair = keyring.getPair(addressKeyOne);
|
||||
const signature = pair.sign(MESSAGE, { withType: true });
|
||||
|
||||
expect(pair.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(pair.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('ethereum', (): void => {
|
||||
const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy';
|
||||
let keyring: Keyring;
|
||||
|
||||
beforeEach((): void => {
|
||||
keyring = new Keyring({ type: 'ethereum' });
|
||||
});
|
||||
|
||||
it('adds a pair with the correct address', (): void => {
|
||||
const pair = keyring.createFromUri(PHRASE);
|
||||
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
|
||||
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
});
|
||||
|
||||
it('encodes a pair toJSON', (): void => {
|
||||
const pair = keyring.createFromUri(PHRASE);
|
||||
const json = pair.toJson('password');
|
||||
|
||||
expect(json.address).toEqual('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077');
|
||||
expect(json.encoding).toEqual({
|
||||
content: ['pkcs8', 'ethereum'],
|
||||
type: ['scrypt', 'xsalsa20-poly1305'],
|
||||
version: '3'
|
||||
});
|
||||
});
|
||||
|
||||
it('allows adding from JSON', (): void => {
|
||||
const pair = keyring.addFromJson(
|
||||
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}')
|
||||
);
|
||||
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
|
||||
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
|
||||
pair.decodePkcs8('password');
|
||||
|
||||
expect(pair.isLocked).toBe(false);
|
||||
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
|
||||
expect(pair.address).toBe('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
});
|
||||
|
||||
it('allows for signing/verification', (): void => {
|
||||
const MESSAGE = stringToU8a('just some test message');
|
||||
const signer = keyring.createFromUri(PHRASE);
|
||||
const verifier = keyring.addFromJson(
|
||||
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}')
|
||||
);
|
||||
|
||||
const signature = signer.sign(MESSAGE);
|
||||
|
||||
expect(verifier.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(verifier.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
|
||||
it('allows for signing/verification (withType)', (): void => {
|
||||
const MESSAGE = stringToU8a('just some test message');
|
||||
const signer = keyring.createFromUri(PHRASE);
|
||||
const verifier = keyring.addFromJson(
|
||||
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}')
|
||||
);
|
||||
|
||||
const signature = signer.sign(MESSAGE, { withType: true });
|
||||
|
||||
expect(verifier.verify(MESSAGE, signature)).toBe(true);
|
||||
expect(verifier.verify(new Uint8Array(), signature)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('util', (): void => {
|
||||
let keyring: Keyring;
|
||||
|
||||
beforeEach((): void => {
|
||||
keyring = new Keyring({ ss58Format: 42 });
|
||||
});
|
||||
|
||||
it('can re-encode an address to Polkadot live', (): void => {
|
||||
expect(
|
||||
keyring.encodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 0)
|
||||
).toEqual('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5');
|
||||
});
|
||||
|
||||
it('can re-encode an address to keyring default', (): void => {
|
||||
expect(
|
||||
keyring.encodeAddress('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5')
|
||||
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
|
||||
});
|
||||
});
|
||||
|
||||
describe('version 2 JSON', (): void => {
|
||||
const PAIR = '{"address":"5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu","encoded":"0xee8f236e2ac3217ce689692a4afc612220dc77fddaed0482f8f95136a7c3e034cccfbc495410a6e9b2439904974ed1d207abeca536ff6985ceb78edeeb3dc343e561c184c488101af8811d1331430b4ccf0e96ef507132e5132964e8564232e7100d973c5bee7b231dd0c8ad5273f3501515a422c8d7ed9d20a73c0ed17c98ee4588e54844bb73052dcad81f7a1094613d63c162fec7446c88b1fae70e","encoding":{"content":["pkcs8","sr25519"],"type":"xsalsa20-poly1305","version":"2"},"meta":{"genesisHash":"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e","name":"json v2","tags":[],"whenCreated":1595243159596}}';
|
||||
const PASS2 = 'versionTwo';
|
||||
const PASS3 = 'versionThree';
|
||||
let keyring: Keyring;
|
||||
|
||||
beforeEach((): void => {
|
||||
keyring = new Keyring({ ss58Format: 42 });
|
||||
});
|
||||
|
||||
it('can decode from a version 2 JSON file', (): void => {
|
||||
const pair = keyring.addFromJson(JSON.parse(PAIR));
|
||||
|
||||
pair.decodePkcs8(PASS2);
|
||||
|
||||
const json = pair.toJson(PASS3);
|
||||
|
||||
expect(pair.isLocked).toBe(false);
|
||||
expect(pair.address).toBe('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
|
||||
expect(json.encoding).toEqual({
|
||||
content: ['pkcs8', 'sr25519'],
|
||||
type: ['scrypt', 'xsalsa20-poly1305'],
|
||||
version: '3'
|
||||
});
|
||||
|
||||
pair.decodePkcs8(PASS3);
|
||||
|
||||
expect(pair.address).toEqual('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
|
||||
});
|
||||
});
|
||||
|
||||
describe('version 3 JSON (hex)', (): void => {
|
||||
const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"0xcd238963070cc4d6806053ee1ac500c7add9c28732bb5d434a332f84a91d9be0008000000100000008000000cf630a1113941b350ddd06697e50399183162e5e9a0e893eafc7f5f4893a223dca5055706b9925b56fdb4304192143843da718e11717daf89cf4f4781f94fb443f61432f782d54280af9eec90bd3069c3cc2d957a42b7c18dc2e9497f623735518e0e49b58f8e4db2c09da3a45dbb935659d015fc94b946cba75b606a6ff7f4e823f6b049e2e6892026b49de02d6dbbd64646fe0933f537d9ea53a70be","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639}}';
|
||||
const PASS3 = 'version3';
|
||||
let keyring: Keyring;
|
||||
|
||||
beforeEach((): void => {
|
||||
keyring = new Keyring({ ss58Format: 2 });
|
||||
});
|
||||
|
||||
it('can decode from a version 3 JSON file', (): void => {
|
||||
const pair = keyring.addFromJson(JSON.parse(PAIR));
|
||||
|
||||
pair.decodePkcs8(PASS3);
|
||||
|
||||
expect(pair.isLocked).toBe(false);
|
||||
expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
|
||||
});
|
||||
});
|
||||
|
||||
describe('version 3 JSON (base64)', (): void => {
|
||||
const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"ILjSgYaGvq1zaCz/kx+aqfLaHBjLXz0Qsmr6RnkOVU4AgAAAAQAAAAgAAAB5R2hm5kgXyc0NQYFxvMU4zCdjB+ugs/ibEooqCvuudbaeKn3Ee47NkCqU1ecOJV+eeaVn4W4dRvIpj5kGmQOGsewR+MiQ/B0G9NFh7JXV0qcPlk2QMNW1/mbJrTO4miqL448BSkP7ZOhUV6HFUpMt3B9HwjiRLN8RORcFp0ID/Azs4Jl/xOpXNzbgQGIffWgCIKTxN9N1ku6tdlG4","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639,"whenEdited":1595278378596}}';
|
||||
const PASS3 = 'version3';
|
||||
let keyring: Keyring;
|
||||
|
||||
beforeEach((): void => {
|
||||
keyring = new Keyring({ ss58Format: 2 });
|
||||
});
|
||||
|
||||
it('can decode from a version 3 JSON file', (): void => {
|
||||
const pair = keyring.addFromJson(JSON.parse(PAIR));
|
||||
|
||||
pair.decodePkcs8(PASS3);
|
||||
|
||||
expect(pair.isLocked).toBe(false);
|
||||
expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,20 +1,12 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @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 };
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeypairType, Keypair } from '@polkadot/util-crypto/types';
|
||||
import { KeyringInstance, KeyringPair, KeyringPair$Json, KeyringPair$Meta, KeyringOptions } from './types';
|
||||
import type { Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$JsonEncodingTypes, KeyringPair$Meta } from './types';
|
||||
|
||||
import { assert, hexToU8a, isHex, stringToU8a } from '@polkadot/util';
|
||||
import { decodeAddress, encodeAddress, keyExtractSuri, keyFromPath, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed, mnemonicToMiniSecret } from '@polkadot/util-crypto';
|
||||
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
|
||||
import { base64Decode, decodeAddress, encodeAddress, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed } 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),
|
||||
ed25519: (seed: Uint8Array): Keypair => naclFromSeed(seed),
|
||||
ethereum: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
|
||||
sr25519: (seed: Uint8Array): Keypair => schnorrkelFromSeed(seed)
|
||||
};
|
||||
|
||||
/**
|
||||
* # @polkadot/keyring
|
||||
@@ -28,7 +34,7 @@ import Pairs from './pairs';
|
||||
* 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;
|
||||
@@ -40,7 +46,7 @@ export default class Keyring implements KeyringInstance {
|
||||
constructor (options: KeyringOptions = {}) {
|
||||
options.type = options.type || 'ed25519';
|
||||
|
||||
assert(options && ['ecdsa', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), `Expected a keyring type of either 'ed25519', 'sr25519' or 'ecdsa', found '${options.type}`);
|
||||
assert(options && ['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), `Expected a keyring type of either 'ed25519', 'sr25519' or 'ecdsa', found '${options.type}`);
|
||||
|
||||
this.#pairs = new Pairs();
|
||||
this.#ss58 = options.ss58Format;
|
||||
@@ -84,10 +90,10 @@ export default class Keyring implements KeyringInstance {
|
||||
* of an account backup), and then generates a keyring pair from them that it passes to
|
||||
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
|
||||
*/
|
||||
public addFromAddress (address: string | Uint8Array, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, type: KeypairType = this.type, ignoreChecksum?: boolean): KeyringPair {
|
||||
public addFromAddress (address: string | Uint8Array, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, type: KeypairType = this.type, ignoreChecksum?: boolean, encType?: KeyringPair$JsonEncodingTypes[]): KeyringPair {
|
||||
const publicKey = this.decodeAddress(address, ignoreChecksum);
|
||||
|
||||
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { publicKey, secretKey: new Uint8Array() }, meta, encoded));
|
||||
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { publicKey, secretKey: new Uint8Array() }, meta, encoded, encType));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,12 +103,8 @@ export default class Keyring implements KeyringInstance {
|
||||
* of an account backup), and then generates a keyring pair from it that it passes to
|
||||
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
|
||||
*/
|
||||
public addFromJson ({ address, encoded, encoding: { content, version }, meta }: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair {
|
||||
const type = version === '0' || !Array.isArray(content)
|
||||
? this.type
|
||||
: content[1];
|
||||
|
||||
return this.addFromAddress(address, meta, hexToU8a(encoded), type, ignoreChecksum);
|
||||
public addFromJson (json: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair {
|
||||
return this.addPair(this.createFromJson(json, ignoreChecksum));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,13 +127,7 @@ export default class Keyring implements KeyringInstance {
|
||||
* `addPair` to store in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
|
||||
*/
|
||||
public addFromSeed (seed: Uint8Array, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
|
||||
const keypair = {
|
||||
ecdsa: (): Keypair => secp256k1FromSeed(seed),
|
||||
ed25519: (): Keypair => naclFromSeed(seed),
|
||||
sr25519: (): Keypair => schnorrkelFromSeed(seed)
|
||||
}[type]();
|
||||
|
||||
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, keypair, meta, null));
|
||||
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, keypairFromSeed[type](seed), meta, null));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,6 +141,27 @@ export default class Keyring implements KeyringInstance {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name createFromJson
|
||||
* @description Creates a pair from a JSON keyfile
|
||||
*/
|
||||
public createFromJson ({ address, encoded, encoding: { content, type, version }, meta }: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair {
|
||||
const cryptoType = version === '0' || !Array.isArray(content)
|
||||
? this.type
|
||||
: content[1];
|
||||
const encType = !Array.isArray(type)
|
||||
? [type]
|
||||
: type;
|
||||
const publicKey = isHex(address)
|
||||
? hexToU8a(address)
|
||||
: this.decodeAddress(address, ignoreChecksum);
|
||||
const decoded = isHex(encoded)
|
||||
? hexToU8a(encoded)
|
||||
: base64Decode(encoded);
|
||||
|
||||
return createPair({ toSS58: this.encodeAddress, type: cryptoType }, { publicKey, secretKey: new Uint8Array() }, meta, decoded, encType);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name createFromUri
|
||||
* @summary Creates a Keypair from an suri
|
||||
@@ -165,11 +182,9 @@ export default class Keyring implements KeyringInstance {
|
||||
const parts = str.split(' ');
|
||||
|
||||
if ([12, 15, 18, 21, 24].includes(parts.length)) {
|
||||
// FIXME This keeps compat with older versions, but breaks compat with subkey
|
||||
// seed = type === 'sr25519'
|
||||
// ? mnemonicToMiniSecret(phrase, password)
|
||||
// : mnemonicToSeed(phrase, password);
|
||||
seed = mnemonicToMiniSecret(phrase, password);
|
||||
seed = type === 'ethereum'
|
||||
? mnemonicToLegacySeed(phrase)
|
||||
: mnemonicToMiniSecret(phrase, password);
|
||||
} else {
|
||||
assert(str.length <= 32, 'specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');
|
||||
|
||||
@@ -177,12 +192,8 @@ export default class Keyring implements KeyringInstance {
|
||||
}
|
||||
}
|
||||
|
||||
const keypair = {
|
||||
ecdsa: (): Keypair => secp256k1FromSeed(seed),
|
||||
ed25519: (): Keypair => naclFromSeed(seed),
|
||||
sr25519: (): Keypair => schnorrkelFromSeed(seed)
|
||||
};
|
||||
const derived = keyFromPath(keypair[type](), path, type);
|
||||
// FIXME Need to support Ethereum-type derivation paths
|
||||
const derived = keyFromPath(keypairFromSeed[type](seed), path, type);
|
||||
|
||||
return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);
|
||||
}
|
||||
@@ -192,7 +203,7 @@ export default class Keyring implements KeyringInstance {
|
||||
* @description Encodes the input into an ss58 representation
|
||||
*/
|
||||
public encodeAddress = (address: Uint8Array | string, ss58Format?: number): string => {
|
||||
return encodeAddress(address, ss58Format || this.#ss58);
|
||||
return encodeAddress(address, isUndefined(ss58Format) ? this.#ss58 : ss58Format);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @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,12 +1,13 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringPair$JsonEncodingTypes } from '../types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, stringToU8a, u8aFixLength } from '@polkadot/util';
|
||||
import { naclDecrypt } from '@polkadot/util-crypto';
|
||||
import { PairInfo } from './types';
|
||||
import { naclDecrypt, scryptEncode, scryptFromU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { NONCE_LENGTH, PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
|
||||
import { ENCODING, NONCE_LENGTH, PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SCRYPT_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
|
||||
|
||||
const SEED_OFFSET = PKCS8_HEADER.length;
|
||||
|
||||
@@ -41,18 +42,32 @@ function decodePkcs8 (encoded: Uint8Array): DecodeResult {
|
||||
};
|
||||
}
|
||||
|
||||
export default function decode (passphrase?: string, encrypted?: Uint8Array | null): 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');
|
||||
|
||||
const encoded = passphrase
|
||||
? naclDecrypt(
|
||||
let encoded: Uint8Array | null = encrypted;
|
||||
|
||||
if (passphrase) {
|
||||
let password: Uint8Array;
|
||||
|
||||
if (encType.includes('scrypt')) {
|
||||
const { params, salt } = scryptFromU8a(encrypted);
|
||||
|
||||
password = scryptEncode(passphrase, salt, params).password;
|
||||
encrypted = encrypted.subarray(SCRYPT_LENGTH);
|
||||
} else {
|
||||
password = stringToU8a(passphrase);
|
||||
}
|
||||
|
||||
encoded = naclDecrypt(
|
||||
encrypted.subarray(NONCE_LENGTH),
|
||||
encrypted.subarray(0, NONCE_LENGTH),
|
||||
u8aFixLength(stringToU8a(passphrase), 256, true)
|
||||
)
|
||||
: encrypted;
|
||||
u8aFixLength(password, 256, true)
|
||||
);
|
||||
}
|
||||
|
||||
assert(encoded, 'Unable to unencrypt using the supplied passphrase');
|
||||
assert(encoded, 'Unable to decode using the supplied passphrase');
|
||||
|
||||
return decodePkcs8(encoded);
|
||||
}
|
||||
|
||||
@@ -1,19 +1,26 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringPair$JsonEncodingTypes } from '../types';
|
||||
|
||||
const ENCODING: KeyringPair$JsonEncodingTypes[] = ['scrypt', 'xsalsa20-poly1305'];
|
||||
const NONCE_LENGTH = 24;
|
||||
const PKCS8_DIVIDER = new Uint8Array([161, 35, 3, 33, 0]);
|
||||
const PKCS8_HEADER = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);
|
||||
const PUB_LENGTH = 32;
|
||||
const SALT_LENGTH = 32;
|
||||
const SEC_LENGTH = 64;
|
||||
const SEED_LENGTH = 32;
|
||||
const SCRYPT_LENGTH = SALT_LENGTH + (3 * 4);
|
||||
|
||||
export {
|
||||
ENCODING,
|
||||
NONCE_LENGTH,
|
||||
PKCS8_DIVIDER,
|
||||
PKCS8_HEADER,
|
||||
PUB_LENGTH,
|
||||
SALT_LENGTH,
|
||||
SEC_LENGTH,
|
||||
SEED_LENGTH
|
||||
SEED_LENGTH,
|
||||
SCRYPT_LENGTH
|
||||
};
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import testingPairs from '../testingPairs';
|
||||
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH } from './defaults';
|
||||
import { createTestPairs } from '../testingPairs';
|
||||
import { NONCE_LENGTH, PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SCRYPT_LENGTH, SEC_LENGTH } from './defaults';
|
||||
|
||||
const PKCS8_LENGTH = PKCS8_DIVIDER.length + PKCS8_HEADER.length + PUB_LENGTH + SEC_LENGTH;
|
||||
const ENCODED_LENGTH = 157;
|
||||
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,15 +1,14 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { PairInfo } from './types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { stringToU8a, u8aConcat, u8aFixLength, assert } from '@polkadot/util';
|
||||
import { naclEncrypt } from '@polkadot/util-crypto';
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
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(
|
||||
@@ -23,7 +22,8 @@ export default function encode ({ publicKey, secretKey }: PairInfo, passphrase?:
|
||||
return encoded;
|
||||
}
|
||||
|
||||
const { encrypted, nonce } = naclEncrypt(encoded, u8aFixLength(stringToU8a(passphrase), 256, true));
|
||||
const { params, password, salt } = scryptEncode(passphrase);
|
||||
const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));
|
||||
|
||||
return u8aConcat(nonce, encrypted);
|
||||
return u8aConcat(scryptToU8a(salt, params), nonce, encrypted);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
import { cryptoWaitReady, encodeAddress as toSS58, setSS58Format } from '@polkadot/util-crypto';
|
||||
|
||||
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> => {
|
||||
@@ -23,6 +23,11 @@ describe('pair', (): void => {
|
||||
).toEqual(
|
||||
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
|
||||
);
|
||||
expect(
|
||||
keyring.alice.addressRaw
|
||||
).toEqual(
|
||||
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
|
||||
);
|
||||
});
|
||||
|
||||
it('allows signing', (): void => {
|
||||
@@ -51,6 +56,17 @@ describe('pair', (): void => {
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('allows vrf sign and verify', (): void => {
|
||||
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
|
||||
|
||||
expect(
|
||||
keyring.alice.vrfVerify(
|
||||
message,
|
||||
keyring.alice.vrfSign(message)
|
||||
)
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
it('allows setting/getting of meta', (): void => {
|
||||
keyring.bob.setMeta({ foo: 'bar', something: 'else' });
|
||||
|
||||
@@ -62,15 +78,11 @@ describe('pair', (): void => {
|
||||
});
|
||||
|
||||
it('allows encoding of address with different prefixes', (): void => {
|
||||
expect(keyring.alice.address).toEqual(
|
||||
'5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua'
|
||||
);
|
||||
expect(keyring.alice.address).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
|
||||
|
||||
setSS58Format(68);
|
||||
setSS58Format(255);
|
||||
|
||||
expect(keyring.alice.address).toEqual(
|
||||
'7sGUeMak588SPY2YMmmuKUuLz7u2WQpf74F9dCFtSLB2td9d'
|
||||
);
|
||||
expect(keyring.alice.address).toEqual('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k');
|
||||
|
||||
setSS58Format(42);
|
||||
});
|
||||
@@ -103,4 +115,13 @@ describe('pair', (): void => {
|
||||
pair.sign(new Uint8Array([0]))
|
||||
).toThrow('Cannot sign with a locked key pair');
|
||||
});
|
||||
|
||||
describe('ethereum', (): void => {
|
||||
it('has a valid address from a known public', (): void => {
|
||||
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') });
|
||||
|
||||
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
|
||||
expect(pair.addressRaw).toEqual(hexToU8a('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887'));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
import { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
|
||||
import { PairInfo } from './types';
|
||||
import type { Keypair, KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$JsonEncodingTypes, KeyringPair$Meta, SignOptions } from '../types';
|
||||
import type { PairInfo } from './types';
|
||||
|
||||
import { assert, u8aConcat } from '@polkadot/util';
|
||||
import { keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclSign, naclVerify, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVerify, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, secp256k1Verify, blake2AsU8a } from '@polkadot/util-crypto';
|
||||
import { assert, u8aConcat, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
import { blake2AsU8a, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVrfSign, schnorrkelVrfVerify, secp256k1Compress, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, 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;
|
||||
@@ -19,70 +18,46 @@ interface Setup {
|
||||
}
|
||||
|
||||
const SIG_TYPE_NONE = new Uint8Array();
|
||||
const SIG_TYPE_ED25519 = new Uint8Array([0]);
|
||||
const SIG_TYPE_SR25519 = new Uint8Array([1]);
|
||||
const SIG_TYPE_ECDSA = new Uint8Array([2]);
|
||||
|
||||
function isEmpty (u8a: Uint8Array): boolean {
|
||||
return u8a.reduce((count, u8): number => count + u8, 0) === 0;
|
||||
}
|
||||
const TYPE_FROM_SEED = {
|
||||
ecdsa: secp256k1FromSeed,
|
||||
ed25519: naclFromSeed,
|
||||
ethereum: secp256k1FromSeed,
|
||||
sr25519: schnorrkelFromSeed
|
||||
};
|
||||
|
||||
function fromSeed (type: KeypairType, seed: Uint8Array): Keypair {
|
||||
return {
|
||||
ecdsa: (): Keypair => secp256k1FromSeed(seed),
|
||||
ed25519: (): Keypair => naclFromSeed(seed),
|
||||
sr25519: (): Keypair => schnorrkelFromSeed(seed)
|
||||
}[type]();
|
||||
}
|
||||
const TYPE_PREFIX = {
|
||||
ecdsa: new Uint8Array([2]),
|
||||
ed25519: new Uint8Array([0]),
|
||||
ethereum: new Uint8Array([2]),
|
||||
sr25519: new Uint8Array([1])
|
||||
};
|
||||
|
||||
function multiSignaturePrefix (type: KeypairType): Uint8Array {
|
||||
return {
|
||||
ecdsa: SIG_TYPE_ECDSA,
|
||||
ed25519: SIG_TYPE_ED25519,
|
||||
sr25519: SIG_TYPE_SR25519
|
||||
}[type];
|
||||
}
|
||||
const TYPE_SIGNATURE = {
|
||||
ecdsa: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'blake2'),
|
||||
ed25519: naclSign,
|
||||
ethereum: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'keccak'),
|
||||
sr25519: schnorrkelSign
|
||||
};
|
||||
|
||||
function sign (type: KeypairType, message: Uint8Array, pair: Partial<Keypair>, { withType = false }: SignOptions = {}): Uint8Array {
|
||||
const signature = {
|
||||
ecdsa: (): Uint8Array => secp256k1Sign(message, pair),
|
||||
ed25519: (): Uint8Array => naclSign(message, pair),
|
||||
sr25519: (): Uint8Array => schnorrkelSign(message, pair)
|
||||
}[type]();
|
||||
|
||||
return u8aConcat(
|
||||
// for multi-signatures, i.e. with indicator, append the signature type as per
|
||||
// the MultiSignature enum
|
||||
withType
|
||||
? multiSignaturePrefix(type)
|
||||
: SIG_TYPE_NONE,
|
||||
signature
|
||||
);
|
||||
}
|
||||
|
||||
function verify (type: KeypairType, message: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean {
|
||||
return {
|
||||
ecdsa: (): boolean => secp256k1Verify(message, signature, blake2AsU8a(publicKey, 256)),
|
||||
ed25519: (): boolean => naclVerify(message, signature, publicKey),
|
||||
sr25519: (): boolean => schnorrkelVerify(message, signature, publicKey)
|
||||
}[type]();
|
||||
}
|
||||
|
||||
function getAddress (type: KeypairType, publicKey: Uint8Array): Uint8Array {
|
||||
if (type === 'ecdsa' && publicKey.length > 32) {
|
||||
return blake2AsU8a(publicKey, 256);
|
||||
} else {
|
||||
return publicKey;
|
||||
}
|
||||
}
|
||||
const TYPE_ADDRESS = {
|
||||
ecdsa: (p: Uint8Array) => p.length > 32 ? blake2AsU8a(p) : p,
|
||||
ed25519: (p: Uint8Array) => p,
|
||||
ethereum: (p: Uint8Array) => keccakAsU8a(secp256k1Expand(p)),
|
||||
sr25519: (p: Uint8Array) => p
|
||||
};
|
||||
|
||||
// Not 100% correct, since it can be a Uint8Array, but an invalid one - just say "undefined" is anything non-valid
|
||||
function isLocked (secretKey?: Uint8Array): secretKey is undefined {
|
||||
return !secretKey || secretKey.length === 0 || isEmpty(secretKey);
|
||||
return !secretKey || secretKey.length === 0 || secretKey.every((b) => b === 0);
|
||||
}
|
||||
|
||||
function vrfHash (proof: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array {
|
||||
return blake2AsU8a(u8aConcat(context || '', extra || '', proof));
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
@@ -112,10 +87,48 @@ 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): 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 = decodePair(passphrase, userEncoded || encoded, encTypes);
|
||||
|
||||
if (decoded.secretKey.length === 64) {
|
||||
publicKey = decoded.publicKey;
|
||||
secretKey = decoded.secretKey;
|
||||
} else {
|
||||
const pair = TYPE_FROM_SEED[type](decoded.secretKey);
|
||||
|
||||
publicKey = pair.publicKey;
|
||||
secretKey = pair.secretKey;
|
||||
}
|
||||
};
|
||||
|
||||
const recode = (passphrase?: string): Uint8Array => {
|
||||
isLocked(secretKey) && encoded && decodePkcs8(passphrase, encoded);
|
||||
|
||||
encoded = encodePair({ publicKey, secretKey }, passphrase); // re-encode, latest version
|
||||
encTypes = undefined; // swap to defaults, latest version follows
|
||||
|
||||
return encoded;
|
||||
};
|
||||
|
||||
const encodeAddress = (): string => {
|
||||
const raw = TYPE_ADDRESS[type](publicKey);
|
||||
|
||||
return type === 'ethereum'
|
||||
? ethereumEncode(raw)
|
||||
: toSS58(raw);
|
||||
};
|
||||
|
||||
return {
|
||||
get address (): string {
|
||||
return toSS58(getAddress(type, publicKey));
|
||||
return encodeAddress();
|
||||
},
|
||||
get addressRaw (): Uint8Array {
|
||||
const raw = TYPE_ADDRESS[type](publicKey);
|
||||
|
||||
return type === 'ethereum'
|
||||
? raw.slice(-20)
|
||||
: raw;
|
||||
},
|
||||
get isLocked (): boolean {
|
||||
return isLocked(secretKey);
|
||||
@@ -130,19 +143,7 @@ export default function createPair ({ toSS58, type }: Setup, { publicKey, secret
|
||||
return type;
|
||||
},
|
||||
// eslint-disable-next-line sort-keys
|
||||
decodePkcs8: (passphrase?: string, _encoded?: Uint8Array | null): void => {
|
||||
const decoded = decode(passphrase, _encoded || encoded);
|
||||
|
||||
if (decoded.secretKey.length === 64) {
|
||||
publicKey = decoded.publicKey;
|
||||
secretKey = decoded.secretKey;
|
||||
} else {
|
||||
const pair = fromSeed(type, decoded.secretKey);
|
||||
|
||||
publicKey = pair.publicKey;
|
||||
secretKey = pair.secretKey;
|
||||
}
|
||||
},
|
||||
decodePkcs8,
|
||||
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair => {
|
||||
assert(!isLocked(secretKey), 'Cannot derive on a locked keypair');
|
||||
|
||||
@@ -151,22 +152,53 @@ export default function createPair ({ toSS58, type }: Setup, { publicKey, secret
|
||||
|
||||
return createPair({ toSS58, type }, derived, meta, null);
|
||||
},
|
||||
encodePkcs8: (passphrase?: string): Uint8Array =>
|
||||
encode({ publicKey, secretKey }, passphrase),
|
||||
encodePkcs8: (passphrase?: string): Uint8Array => {
|
||||
return recode(passphrase);
|
||||
},
|
||||
lock: (): void => {
|
||||
secretKey = new Uint8Array(0);
|
||||
secretKey = new Uint8Array();
|
||||
},
|
||||
setMeta: (additional: KeyringPair$Meta): void => {
|
||||
meta = { ...meta, ...additional };
|
||||
},
|
||||
sign: (message: Uint8Array, options?: SignOptions): Uint8Array => {
|
||||
sign: (message: string | Uint8Array, options: SignOptions = {}): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
|
||||
return sign(type, message, { publicKey, secretKey }, options);
|
||||
return u8aConcat(
|
||||
options.withType
|
||||
? TYPE_PREFIX[type]
|
||||
: SIG_TYPE_NONE,
|
||||
TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey })
|
||||
);
|
||||
},
|
||||
toJson: (passphrase?: string): KeyringPair$Json =>
|
||||
toJson(type, { address: toSS58(getAddress(type, publicKey)), meta }, encode({ publicKey, secretKey }, passphrase), !!passphrase),
|
||||
verify: (message: Uint8Array, signature: Uint8Array): boolean =>
|
||||
verify(type, message, signature, publicKey)
|
||||
toJson: (passphrase?: string): KeyringPair$Json => {
|
||||
const address = ['ecdsa', 'ethereum'].includes(type)
|
||||
? u8aToHex(secp256k1Compress(publicKey))
|
||||
: encodeAddress();
|
||||
|
||||
return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);
|
||||
},
|
||||
verify: (message: string | Uint8Array, signature: Uint8Array): boolean => {
|
||||
return signatureVerify(message, signature, TYPE_ADDRESS[type](publicKey)).isValid;
|
||||
},
|
||||
vrfSign: (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
|
||||
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
|
||||
|
||||
if (type === 'sr25519') {
|
||||
return schnorrkelVrfSign(message, { secretKey }, context, extra);
|
||||
}
|
||||
|
||||
const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });
|
||||
|
||||
return u8aConcat(vrfHash(proof, context, extra), proof);
|
||||
},
|
||||
vrfVerify: (message: string | Uint8Array, vrfResult: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean => {
|
||||
return type === 'sr25519'
|
||||
? schnorrkelVrfVerify(message, vrfResult, publicKey, context, extra)
|
||||
: (
|
||||
signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](publicKey)).isValid &&
|
||||
u8aEq(vrfResult.subarray(0, 32), vrfHash(vrfResult.subarray(32), context, extra))
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
|
||||
import { encodeAddress } from '@polkadot/util-crypto';
|
||||
|
||||
@@ -23,9 +22,10 @@ const json: KeyringPair$Json = {
|
||||
meta
|
||||
};
|
||||
|
||||
export default function everybody (): KeyringPair {
|
||||
export function nobody (): KeyringPair {
|
||||
const pair: KeyringPair = {
|
||||
address,
|
||||
addressRaw: publicKey,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
decodePkcs8: (passphrase?: string, encoded?: Uint8Array): void =>
|
||||
undefined,
|
||||
@@ -53,6 +53,12 @@ export default function everybody (): KeyringPair {
|
||||
type: 'ed25519',
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
verify: (message: Uint8Array, signature: Uint8Array): boolean =>
|
||||
false,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
vrfSign: (message: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array =>
|
||||
new Uint8Array(96),
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
vrfVerify: (message: Uint8Array, vrfResult: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean =>
|
||||
false
|
||||
};
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @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 => {
|
||||
@@ -12,11 +11,11 @@ describe('toJson', (): void => {
|
||||
keyring.alice.toJson()
|
||||
).toMatchObject({
|
||||
address: '5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua',
|
||||
encoded: '0x3053020101300506032b657004220420416c696365202020202020202020202020202020202020202020202020202020d172a74cda4c865912c32ba0a80a57ae69abae410e5ccb59dee84e2f4432db4fa123032100d172a74cda4c865912c32ba0a80a57ae69abae410e5ccb59dee84e2f4432db4f',
|
||||
encoded: 'MFMCAQEwBQYDK2VwBCIEIEFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAg0XKnTNpMhlkSwyugqApXrmmrrkEOXMtZ3uhOL0Qy20+hIwMhANFyp0zaTIZZEsMroKgKV65pq65BDlzLWd7oTi9EMttP',
|
||||
encoding: {
|
||||
content: ['pkcs8', 'ed25519'],
|
||||
type: 'none',
|
||||
version: '2'
|
||||
type: ['none'],
|
||||
version: '3'
|
||||
},
|
||||
meta: {
|
||||
isTesting: true,
|
||||
@@ -28,13 +27,13 @@ describe('toJson', (): void => {
|
||||
it('creates an encoded output with passphrase', (): void => {
|
||||
const json = keyring.alice.toJson('testing');
|
||||
|
||||
expect(json.encoded).toHaveLength(316);
|
||||
expect(json.encoded).toHaveLength(268);
|
||||
expect(json).toMatchObject({
|
||||
address: '5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua',
|
||||
encoding: {
|
||||
content: ['pkcs8', 'ed25519'],
|
||||
type: 'xsalsa20-poly1305',
|
||||
version: '2'
|
||||
type: ['scrypt', 'xsalsa20-poly1305'],
|
||||
version: '3'
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,27 +1,34 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import { KeyringPair$Json, KeyringPair$Meta } from '../types';
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { KeyringPair$Json, KeyringPair$JsonEncodingTypes, KeyringPair$Meta } from '../types';
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
import { base64Encode } from '@polkadot/util-crypto';
|
||||
|
||||
import { ENCODING } from './defaults';
|
||||
|
||||
interface PairStateJson {
|
||||
address: string;
|
||||
meta: KeyringPair$Meta;
|
||||
}
|
||||
|
||||
export default function toJson (type: KeypairType, { address, meta }: PairStateJson, encoded: Uint8Array, isEncrypted: boolean): KeyringPair$Json {
|
||||
// version 2 - nonce, encoded (previous)
|
||||
// version 3 - salt, nonce, encoded
|
||||
const VERSION = '3';
|
||||
|
||||
const ENC_NONE: KeyringPair$JsonEncodingTypes[] = ['none'];
|
||||
|
||||
export function pairToJson (type: KeypairType, { address, meta }: PairStateJson, encoded: Uint8Array, isEncrypted: boolean): KeyringPair$Json {
|
||||
return {
|
||||
address,
|
||||
encoded: u8aToHex(encoded),
|
||||
encoded: base64Encode(encoded),
|
||||
encoding: {
|
||||
content: ['pkcs8', type],
|
||||
type: isEncrypted
|
||||
? 'xsalsa20-poly1305'
|
||||
: 'none',
|
||||
version: '2'
|
||||
? ENCODING
|
||||
: ENC_NONE,
|
||||
version: VERSION
|
||||
},
|
||||
meta
|
||||
};
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export interface PairInfo {
|
||||
publicKey: Uint8Array;
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { KeyringPair } from '../types';
|
||||
|
||||
import { u8aToHex } from '@polkadot/util';
|
||||
import { cryptoWaitReady, encodeAddress as toSS58, naclKeypairFromSeed, randomAsU8a, schnorrkelKeypairFromSeed, secp256k1KeypairFromSeed } from '@polkadot/util-crypto';
|
||||
|
||||
import { createPair } from '.';
|
||||
|
||||
const MESSAGE = 'this is a test message';
|
||||
const CONTEXT = 'some context';
|
||||
|
||||
describe('vrf', (): void => {
|
||||
let ecdsa: KeyringPair;
|
||||
let ed25519: KeyringPair;
|
||||
let sr25519: KeyringPair;
|
||||
|
||||
beforeAll(async (): Promise<void> => {
|
||||
await cryptoWaitReady();
|
||||
|
||||
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1KeypairFromSeed(randomAsU8a()));
|
||||
ed25519 = createPair({ toSS58, type: 'ed25519' }, naclKeypairFromSeed(randomAsU8a()));
|
||||
sr25519 = createPair({ toSS58, type: 'sr25519' }, schnorrkelKeypairFromSeed(randomAsU8a()));
|
||||
});
|
||||
|
||||
it('has deterministic signature values for ecdsa', (): void => {
|
||||
const sig1 = ecdsa.vrfSign(MESSAGE, CONTEXT);
|
||||
const sig2 = ecdsa.vrfSign(MESSAGE, CONTEXT);
|
||||
|
||||
expect(u8aToHex(sig1)).toEqual(u8aToHex(sig2));
|
||||
expect(ecdsa.vrfVerify(MESSAGE, sig1, CONTEXT)).toEqual(true);
|
||||
expect(ecdsa.vrfVerify(MESSAGE, sig2, CONTEXT)).toEqual(true);
|
||||
});
|
||||
|
||||
it('has deterministic signature values for ed25519', (): void => {
|
||||
const sig1 = ed25519.vrfSign(MESSAGE, CONTEXT);
|
||||
const sig2 = ed25519.vrfSign(MESSAGE, CONTEXT);
|
||||
|
||||
expect(u8aToHex(sig1)).toEqual(u8aToHex(sig2));
|
||||
expect(ed25519.vrfVerify(MESSAGE, sig1, CONTEXT)).toEqual(true);
|
||||
expect(ed25519.vrfVerify(MESSAGE, sig2, CONTEXT)).toEqual(true);
|
||||
});
|
||||
|
||||
it('has deterministic signature values for sr25519', (): void => {
|
||||
const sig1 = sr25519.vrfSign(MESSAGE, CONTEXT);
|
||||
const sig2 = sr25519.vrfSign(MESSAGE, CONTEXT);
|
||||
|
||||
expect(u8aToHex(sig1.slice(0, 32))).toEqual(u8aToHex(sig2.slice(0, 32)));
|
||||
expect(sr25519.vrfVerify(MESSAGE, sig1, CONTEXT)).toEqual(true);
|
||||
expect(sr25519.vrfVerify(MESSAGE, sig2, CONTEXT)).toEqual(true);
|
||||
});
|
||||
});
|
||||
@@ -1,15 +1,14 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeyringPairs, KeyringPair } from './types';
|
||||
import type { KeyringPair, KeyringPairs } from './types';
|
||||
|
||||
import { assert, isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
|
||||
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 {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// From https://github.com/paritytech/substrate/wiki/Secret-URI-Test-Vectors
|
||||
|
||||
@@ -11,53 +10,62 @@ import Keyring from '.';
|
||||
|
||||
const PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';
|
||||
|
||||
const TESTS = [
|
||||
{
|
||||
pk: '0x46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a',
|
||||
ss: '5DfhGyQdFobKM8NsWvEeAKk5EQQgYe9AydgJ7rMB6E1EqRzV',
|
||||
uri: PHRASE
|
||||
},
|
||||
{
|
||||
pk: '0xb69355deefa7a8f33e9297f5af22e680f03597a99d4f4b1c44be47e7a2275802',
|
||||
ss: '5GC6LfpV352HtJPySfAecb5JdePtf4R9Vq49NUU8RhzgBqgq',
|
||||
uri: `${PHRASE}///password`
|
||||
},
|
||||
{
|
||||
pk: '0x40b9675df90efa6069ff623b0fdfcf706cd47ca7452a5056c7ad58194d23440a',
|
||||
ss: '5DXZzrDxHbkQov4QBAY4TjpwnHCMrKXkomTnKSw8UArBEY5v',
|
||||
uri: `${PHRASE}/foo`
|
||||
},
|
||||
{
|
||||
pk: '0x547d4a55642ec7ebadc0bd29b6e570b8c926059b3c0655d4948075e9a7e6f31e',
|
||||
ss: '5DyV6fZuvPemWrUqBgWwTSgoV86w6xms3KhkFU6cQcWxU8eP',
|
||||
uri: `${PHRASE}//foo`
|
||||
},
|
||||
{
|
||||
pk: '0x3841947ffcde6f5fef26fb68b59bb8665637e30e32ec2051f99cf6b9c674fe09',
|
||||
ss: '5DLU27is5iViNopQb2KxsTyPx6j4vCu8X3sk3j3NNLkPCqKM',
|
||||
uri: `${PHRASE}//foo/bar`
|
||||
},
|
||||
{
|
||||
pk: '0xdc142f7476a7b0aa262aeccf207f1d18daa90762db393006741e8a31f39dbc53',
|
||||
ss: '5H3GPTqDSpjkfDwbHy12PD6BWm8jvGSX4xYC8UMprHpTPcRg',
|
||||
uri: `${PHRASE}/foo//bar`
|
||||
},
|
||||
{
|
||||
pk: '0xa2e56b06407a6d1e819d2fc33fa0ec604b29c2e868b70b3696bb049b8725934b',
|
||||
ss: '5FkHmNgbg64MwStgCyDi2Uw3ufFu11mqQgmWT9uwK4Lghvpv',
|
||||
uri: `${PHRASE}//foo/bar//42/69`
|
||||
},
|
||||
{
|
||||
pk: '0x0e0d24e3e1ff2c07f269c99e2e0df8681fda1851ac42fc846ca2daaa90cd8f14',
|
||||
ss: '5CP8S23JBNXYNpJsL7ESPJBNnUZE6itcfM4EnDxEhaVEU6dT',
|
||||
uri: `${PHRASE}//foo/bar//42/69///password`
|
||||
},
|
||||
{
|
||||
pk: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
|
||||
ss: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
|
||||
uri: `${PHRASE}//Alice`
|
||||
}
|
||||
];
|
||||
const TESTS = {
|
||||
ecdsa: [
|
||||
{
|
||||
pk: '0x020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1',
|
||||
ss: '5C7C2Z5sWbytvHpuLTvzKunnnRwQxft1jiqrLD5rhucQ5S9X',
|
||||
uri: `${PHRASE}//Alice`
|
||||
}
|
||||
],
|
||||
sr25519: [
|
||||
{
|
||||
pk: '0x46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a',
|
||||
ss: '5DfhGyQdFobKM8NsWvEeAKk5EQQgYe9AydgJ7rMB6E1EqRzV',
|
||||
uri: PHRASE
|
||||
},
|
||||
{
|
||||
pk: '0xb69355deefa7a8f33e9297f5af22e680f03597a99d4f4b1c44be47e7a2275802',
|
||||
ss: '5GC6LfpV352HtJPySfAecb5JdePtf4R9Vq49NUU8RhzgBqgq',
|
||||
uri: `${PHRASE}///password`
|
||||
},
|
||||
{
|
||||
pk: '0x40b9675df90efa6069ff623b0fdfcf706cd47ca7452a5056c7ad58194d23440a',
|
||||
ss: '5DXZzrDxHbkQov4QBAY4TjpwnHCMrKXkomTnKSw8UArBEY5v',
|
||||
uri: `${PHRASE}/foo`
|
||||
},
|
||||
{
|
||||
pk: '0x547d4a55642ec7ebadc0bd29b6e570b8c926059b3c0655d4948075e9a7e6f31e',
|
||||
ss: '5DyV6fZuvPemWrUqBgWwTSgoV86w6xms3KhkFU6cQcWxU8eP',
|
||||
uri: `${PHRASE}//foo`
|
||||
},
|
||||
{
|
||||
pk: '0x3841947ffcde6f5fef26fb68b59bb8665637e30e32ec2051f99cf6b9c674fe09',
|
||||
ss: '5DLU27is5iViNopQb2KxsTyPx6j4vCu8X3sk3j3NNLkPCqKM',
|
||||
uri: `${PHRASE}//foo/bar`
|
||||
},
|
||||
{
|
||||
pk: '0xdc142f7476a7b0aa262aeccf207f1d18daa90762db393006741e8a31f39dbc53',
|
||||
ss: '5H3GPTqDSpjkfDwbHy12PD6BWm8jvGSX4xYC8UMprHpTPcRg',
|
||||
uri: `${PHRASE}/foo//bar`
|
||||
},
|
||||
{
|
||||
pk: '0xa2e56b06407a6d1e819d2fc33fa0ec604b29c2e868b70b3696bb049b8725934b',
|
||||
ss: '5FkHmNgbg64MwStgCyDi2Uw3ufFu11mqQgmWT9uwK4Lghvpv',
|
||||
uri: `${PHRASE}//foo/bar//42/69`
|
||||
},
|
||||
{
|
||||
pk: '0x0e0d24e3e1ff2c07f269c99e2e0df8681fda1851ac42fc846ca2daaa90cd8f14',
|
||||
ss: '5CP8S23JBNXYNpJsL7ESPJBNnUZE6itcfM4EnDxEhaVEU6dT',
|
||||
uri: `${PHRASE}//foo/bar//42/69///password`
|
||||
},
|
||||
{
|
||||
pk: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
|
||||
ss: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
|
||||
uri: `${PHRASE}//Alice`
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
describe('keyring.addFromUri', (): void => {
|
||||
const keyring = new Keyring({ type: 'sr25519' });
|
||||
@@ -66,12 +74,16 @@ describe('keyring.addFromUri', (): void => {
|
||||
await cryptoWaitReady();
|
||||
});
|
||||
|
||||
TESTS.forEach(({ pk, ss, uri }): void => {
|
||||
it(`creates ${uri}`, (): void => {
|
||||
const pair = keyring.addFromUri(uri);
|
||||
Object.entries(TESTS).forEach(([type, tests]): void => {
|
||||
describe(type, (): void => {
|
||||
tests.forEach(({ pk, ss, uri }): void => {
|
||||
it(`creates ${uri}`, (): void => {
|
||||
const pair = keyring.addFromUri(uri, {}, type as 'sr25519');
|
||||
|
||||
expect(u8aToHex(pair.publicKey)).toEqual(pk);
|
||||
expect(pair.address).toEqual(ss);
|
||||
expect(u8aToHex(pair.publicKey)).toEqual(pk);
|
||||
expect(pair.address).toEqual(ss);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeyringInstance, KeyringOptions } from './types';
|
||||
import type { KeyringInstance, KeyringOptions } from './types';
|
||||
|
||||
import { hexToU8a } from '@polkadot/util';
|
||||
|
||||
import createPair from './pair';
|
||||
import { createPair } from './pair';
|
||||
import Keyring from '.';
|
||||
|
||||
interface PairDef {
|
||||
@@ -68,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 => {
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { cryptoWaitReady } from '@polkadot/util-crypto';
|
||||
|
||||
import testingPairs from './testingPairs';
|
||||
import { createTestPairs } from './testingPairs';
|
||||
|
||||
describe('testingPairs', (): void => {
|
||||
beforeEach(async (): Promise<void> => {
|
||||
@@ -13,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');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { KeyringPair, KeyringOptions } from './types';
|
||||
import type { KeyringOptions, KeyringPair } from './types';
|
||||
|
||||
import createKeyring from './testing';
|
||||
import nobody from './pair/nobody';
|
||||
import { nobody } from './pair/nobody';
|
||||
import { createTestKeyring } from './testing';
|
||||
|
||||
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,9 +1,8 @@
|
||||
// Copyright 2017-2020 @polkadot/keyring authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
import { KeypairType } from '@polkadot/util-crypto/types';
|
||||
import type { Prefix } from '@polkadot/util-crypto/address/types';
|
||||
import type { KeypairType } from '@polkadot/util-crypto/types';
|
||||
|
||||
export interface KeyringOptions {
|
||||
ss58Format?: Prefix;
|
||||
@@ -12,11 +11,13 @@ export interface KeyringOptions {
|
||||
|
||||
export type KeyringPair$Meta = Record<string, unknown>;
|
||||
|
||||
export type KeyringPair$JsonVersion = '0' | '1' | '2';
|
||||
export type KeyringPair$JsonVersion = '0' | '1' | '2' | '3';
|
||||
|
||||
export type KeyringPair$JsonEncodingTypes = 'none' | 'scrypt' | 'xsalsa20-poly1305';
|
||||
|
||||
export interface KeyringPair$JsonEncoding {
|
||||
content: ['pkcs8', KeypairType];
|
||||
type: 'xsalsa20-poly1305' | 'none';
|
||||
type: KeyringPair$JsonEncodingTypes | KeyringPair$JsonEncodingTypes[];
|
||||
version: KeyringPair$JsonVersion;
|
||||
}
|
||||
|
||||
@@ -33,6 +34,7 @@ export interface SignOptions {
|
||||
|
||||
export interface KeyringPair {
|
||||
readonly address: string;
|
||||
readonly addressRaw: Uint8Array;
|
||||
readonly meta: KeyringPair$Meta;
|
||||
readonly isLocked: boolean;
|
||||
readonly publicKey: Uint8Array;
|
||||
@@ -43,9 +45,11 @@ export interface KeyringPair {
|
||||
encodePkcs8: (passphrase?: string) => Uint8Array;
|
||||
lock: () => void;
|
||||
setMeta: (meta: KeyringPair$Meta) => void;
|
||||
sign (message: Uint8Array, options?: SignOptions): Uint8Array;
|
||||
sign (message: string | Uint8Array, options?: SignOptions): Uint8Array;
|
||||
toJson (passphrase?: string): KeyringPair$Json;
|
||||
verify (message: Uint8Array, signature: Uint8Array): boolean;
|
||||
verify (message: string | Uint8Array, signature: Uint8Array): boolean;
|
||||
vrfSign (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array;
|
||||
vrfVerify (message: string | Uint8Array, vrfResult: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean;
|
||||
}
|
||||
|
||||
export interface KeyringPairs {
|
||||
@@ -70,6 +74,7 @@ export interface KeyringInstance {
|
||||
addFromMnemonic (mnemonic: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
|
||||
addFromSeed (seed: Uint8Array, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
|
||||
addFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
|
||||
createFromJson (json: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair;
|
||||
createFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
|
||||
getPair (address: string | Uint8Array): KeyringPair;
|
||||
getPairs (): KeyringPair[];
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,5 @@
|
||||
# @polkadot/networks
|
||||
|
||||
A list of all available Substrate networks and their applicable prefixes.
|
||||
|
||||
This list is periodically checked against the master list available at https://github.com/paritytech/substrate/blob/master/ss58-registry.json
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "@polkadot/networks",
|
||||
"version": "5.6.2",
|
||||
"description": "A list of all available Substrate networks and their applicable prefixes",
|
||||
"main": "index.js",
|
||||
"sideEffects": false,
|
||||
"repository": "github:polkadot-js/common",
|
||||
"author": "Jaco Greeff <jacogr@gmail.com>",
|
||||
"maintainers": [],
|
||||
"contributors": [],
|
||||
"license": "Apache-2.0",
|
||||
"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.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/util": "5.6.2",
|
||||
"@polkadot/x-fetch": "5.6.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Ss58Registry } from './types';
|
||||
|
||||
import fs from 'fs';
|
||||
|
||||
import { fetch } from '@polkadot/x-fetch';
|
||||
|
||||
import { all } from './';
|
||||
|
||||
const ORIGINAL = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
|
||||
const OUTPUT = './.github/ss58-check.md';
|
||||
|
||||
function assertAndLog (check: boolean, error: string): void {
|
||||
if (!check) {
|
||||
process.env.CI_LOG && fs.appendFileSync(OUTPUT, `
|
||||
|
||||
${error}
|
||||
`);
|
||||
|
||||
throw new Error(error);
|
||||
}
|
||||
}
|
||||
|
||||
describe('check latest Substrate ss58 registry', (): void => {
|
||||
let original: Ss58Registry;
|
||||
|
||||
beforeAll(async (): Promise<void> => {
|
||||
original = (await (await fetch(ORIGINAL)).json()) as Ss58Registry;
|
||||
});
|
||||
|
||||
it('has the same number as the original', (): void => {
|
||||
assertAndLog(all.length === original.registry.length, `Number of entries mismatched:: Expected ${original.registry.length} found ${all.length}`);
|
||||
});
|
||||
|
||||
it('has no missing any entries', (): void => {
|
||||
const missing = original.registry
|
||||
.filter(({ prefix }) => !all.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Missing entries found: ${JSON.stringify(missing, null, 2)}`);
|
||||
});
|
||||
|
||||
it('has no extra entries', (): void => {
|
||||
const missing = all
|
||||
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
|
||||
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
|
||||
|
||||
assertAndLog(!missing.length, `Extra entries found: ${JSON.stringify(missing, null, 2)}`);
|
||||
});
|
||||
|
||||
it('has the same values as the original', (): void => {
|
||||
const fields = Object.keys(original.schema);
|
||||
const errors = original.registry
|
||||
.map((n): [string, string[]] => {
|
||||
const other = all.find(({ prefix }) => prefix === n.prefix);
|
||||
|
||||
return [
|
||||
`${n.displayName} (${n.prefix})`,
|
||||
other
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
? fields.filter((f) => JSON.stringify(n[f]) !== JSON.stringify(other[f]))
|
||||
: []
|
||||
];
|
||||
})
|
||||
.filter(([, fields]) => fields.length);
|
||||
|
||||
assertAndLog(!errors.length, `Mismatches found: ${JSON.stringify(errors.map(([name, m]) => `${name}:: ${m.join(', ')}`), null, 2)}`);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import filtered, { available } from '.';
|
||||
|
||||
describe('filtered', (): void => {
|
||||
it('has the correct starting order', (): void => {
|
||||
expect(filtered.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
|
||||
});
|
||||
|
||||
it('has no ignored networks', (): void => {
|
||||
expect(available.some(({ isIgnored }) => isIgnored)).toEqual(false);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,466 @@
|
||||
// Copyright 2017-2021 @polkadot/networks authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// This contains exactly the same information as available in (with some extensions)
|
||||
// https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json
|
||||
//
|
||||
// Once the above is published as a package, the duplication here can be removed
|
||||
|
||||
import type { Network, NetworkFromSubstrate, NetworkFromSubstrateNamed } from './types';
|
||||
|
||||
// These are known prefixes that are not sorted
|
||||
const UNSORTED = [0, 2, 42];
|
||||
|
||||
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
|
||||
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
|
||||
// last. This make lookups for the current a simple genesisHash[0]
|
||||
// (See Kusama as an example)
|
||||
|
||||
const createReserved = (prefix: number, displayName: string, network: string | null = null): NetworkFromSubstrate => ({
|
||||
decimals: null,
|
||||
displayName,
|
||||
isIgnored: true,
|
||||
network,
|
||||
prefix,
|
||||
standardAccount: null,
|
||||
symbols: null,
|
||||
website: null
|
||||
});
|
||||
|
||||
const all: NetworkFromSubstrate[] = [
|
||||
{
|
||||
decimals: [10],
|
||||
displayName: 'Polkadot Relay Chain',
|
||||
genesisHash: ['0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'],
|
||||
hasLedgerSupport: true,
|
||||
icon: 'polkadot',
|
||||
network: 'polkadot',
|
||||
prefix: 0,
|
||||
slip44: 0x00000162,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['DOT'],
|
||||
website: 'https://polkadot.network'
|
||||
},
|
||||
createReserved(1, 'Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.'),
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Kusama Relay Chain',
|
||||
genesisHash: [
|
||||
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
|
||||
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
|
||||
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
|
||||
],
|
||||
hasLedgerSupport: true,
|
||||
icon: 'polkadot',
|
||||
network: 'kusama',
|
||||
prefix: 2,
|
||||
slip44: 0x000001b2,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KSM'],
|
||||
website: 'https://kusama.network'
|
||||
},
|
||||
createReserved(3, 'Bare 32-bit Ed25519 public key.'),
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Katal Chain',
|
||||
network: 'katalchain',
|
||||
prefix: 4,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Plasm Network',
|
||||
genesisHash: ['0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'],
|
||||
network: 'plasm',
|
||||
prefix: 5,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PLM'],
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Bifrost',
|
||||
network: 'bifrost',
|
||||
prefix: 6,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['BNC'],
|
||||
website: 'https://bifrost.finance/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Edgeware',
|
||||
genesisHash: ['0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'],
|
||||
network: 'edgeware',
|
||||
prefix: 7,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['EDG'],
|
||||
website: 'https://edgewa.re'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Acala Karura Canary',
|
||||
network: 'karura',
|
||||
prefix: 8,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KAR'],
|
||||
website: 'https://acala.network/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Laminar Reynolds Canary',
|
||||
network: 'reynolds',
|
||||
prefix: 9,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['REY'],
|
||||
website: 'http://laminar.network/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Acala',
|
||||
network: 'acala',
|
||||
prefix: 10,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['ACA'],
|
||||
website: 'https://acala.network/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Laminar',
|
||||
network: 'laminar',
|
||||
prefix: 11,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['LAMI'],
|
||||
website: 'http://laminar.network/'
|
||||
},
|
||||
{
|
||||
decimals: [6],
|
||||
displayName: 'Polymesh',
|
||||
genesisHash: ['0x12fddc9e2128b3fe571e4e5427addcb87fcaf08493867a68dd6ae44b406b39c7'],
|
||||
hasLedgerSupport: true,
|
||||
network: 'polymesh',
|
||||
prefix: 12,
|
||||
slip44: 0x00000253,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['POLYX'],
|
||||
website: 'https://polymath.network/'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'SubstraTEE',
|
||||
network: 'substratee',
|
||||
prefix: 13,
|
||||
standardAccount: '*25519',
|
||||
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',
|
||||
genesisHash: ['0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'],
|
||||
network: 'kulupu',
|
||||
prefix: 16,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KLP'],
|
||||
website: 'https://kulupu.network/'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Dark Mainnet',
|
||||
network: 'dark',
|
||||
prefix: 17,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [9, 9],
|
||||
displayName: 'Darwinia Network',
|
||||
network: 'darwinia',
|
||||
prefix: 18,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['RING', 'KTON'],
|
||||
website: 'https://darwinia.network/'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'GeekCash',
|
||||
network: 'geek',
|
||||
prefix: 19,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['GEEK'],
|
||||
website: 'https://geekcash.org'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Stafi',
|
||||
genesisHash: ['0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'],
|
||||
network: 'stafi',
|
||||
prefix: 20,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['FIS'],
|
||||
website: 'https://stafi.io'
|
||||
},
|
||||
{
|
||||
decimals: [6],
|
||||
displayName: 'Dock Testnet',
|
||||
isIgnored: true, // testnet
|
||||
network: 'dock-testnet',
|
||||
prefix: 21,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['DCK'],
|
||||
website: 'https://dock.io'
|
||||
},
|
||||
{
|
||||
decimals: [6],
|
||||
displayName: 'Dock Mainnet',
|
||||
genesisHash: ['0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'],
|
||||
hasLedgerSupport: true,
|
||||
network: 'dock-mainnet',
|
||||
prefix: 22,
|
||||
slip44: 0x00000252,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['DCK'],
|
||||
website: 'https://dock.io'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'ShiftNrg',
|
||||
network: 'shift',
|
||||
prefix: 23,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'ZERO',
|
||||
network: 'zero',
|
||||
prefix: 24,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PLAY'],
|
||||
website: 'https://zero.io'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'ZERO Alphaville',
|
||||
isIgnored: true, // testnet
|
||||
network: 'zero-alphaville',
|
||||
prefix: 25,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PLAY'],
|
||||
website: 'https://zero.io'
|
||||
},
|
||||
{
|
||||
decimals: [10],
|
||||
displayName: 'Jupiter',
|
||||
isIgnored: true, // testnet
|
||||
network: 'jupiter',
|
||||
prefix: 26,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['jDOT'],
|
||||
website: 'https://jupiter.patract.io'
|
||||
},
|
||||
{
|
||||
decimals: [10, 12],
|
||||
displayName: 'Patract',
|
||||
network: 'patract',
|
||||
prefix: 27,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['pDOT', 'pKSM'],
|
||||
website: 'https://patract.network'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Subsocial',
|
||||
genesisHash: ['0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'],
|
||||
network: 'subsocial',
|
||||
prefix: 28,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Dhiway CORD Network',
|
||||
network: 'cord',
|
||||
prefix: 29,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['DCU'],
|
||||
website: 'https://dhiway.com/'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Phala Network',
|
||||
network: 'phala',
|
||||
prefix: 30,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PHA'],
|
||||
website: 'https://phala.network'
|
||||
},
|
||||
{
|
||||
decimals: [12],
|
||||
displayName: 'Litentry Network',
|
||||
network: 'litentry',
|
||||
prefix: 31,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['LIT'],
|
||||
website: 'https://litentry.com/'
|
||||
},
|
||||
{
|
||||
decimals: [9],
|
||||
displayName: 'Robonomics',
|
||||
network: 'robonomics',
|
||||
prefix: 32,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['XRT'],
|
||||
website: 'https://robonomics.network'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'DataHighway',
|
||||
network: 'datahighway',
|
||||
prefix: 33,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: null
|
||||
},
|
||||
{
|
||||
decimals: [15],
|
||||
displayName: 'Valiu Liquidity Network',
|
||||
network: 'vln',
|
||||
prefix: 35,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['USDv'],
|
||||
website: 'https://valiu.com/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Centrifuge Chain',
|
||||
network: 'centrifuge',
|
||||
prefix: 36,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['RAD'],
|
||||
website: 'https://centrifuge.io/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'Nodle Chain',
|
||||
network: 'nodle',
|
||||
prefix: 37,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['NODL'],
|
||||
website: 'https://nodle.io/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'KILT Chain',
|
||||
network: 'kilt',
|
||||
prefix: 38,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['KILT'],
|
||||
website: 'https://kilt.io/'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'MathChain mainnet',
|
||||
network: 'mathchain',
|
||||
prefix: 39,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['MATH'],
|
||||
website: 'https://mathwallet.org'
|
||||
},
|
||||
{
|
||||
decimals: [18],
|
||||
displayName: 'MathChain testnet',
|
||||
isIgnored: true, // testnet
|
||||
network: 'mathchain-testnet',
|
||||
prefix: 40,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['MATH'],
|
||||
website: 'https://mathwallet.org'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Polimec Chain',
|
||||
network: 'poli',
|
||||
prefix: 41,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: 'https://polimec.io/'
|
||||
},
|
||||
{
|
||||
decimals: null,
|
||||
displayName: 'Substrate',
|
||||
network: 'substrate',
|
||||
prefix: 42,
|
||||
standardAccount: '*25519',
|
||||
symbols: null,
|
||||
website: 'https://substrate.dev/'
|
||||
},
|
||||
createReserved(43, 'Bare 32-bit ECDSA SECP-256k1 public key.'),
|
||||
{
|
||||
decimals: [8],
|
||||
displayName: 'ChainX',
|
||||
network: 'chainx',
|
||||
prefix: 44,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['PCX'],
|
||||
website: 'https://chainx.org/'
|
||||
},
|
||||
{
|
||||
decimals: [12, 12],
|
||||
displayName: 'UniArts Network',
|
||||
network: 'uniarts',
|
||||
prefix: 45,
|
||||
standardAccount: '*25519',
|
||||
symbols: ['UART', 'UINK'],
|
||||
website: 'https://uniarts.me'
|
||||
},
|
||||
createReserved(46, 'This prefix is reserved.', 'reserved46'),
|
||||
createReserved(47, 'This prefix is reserved.', 'reserved47')
|
||||
];
|
||||
|
||||
// The list of available/claimed prefixes
|
||||
// - no testnets
|
||||
// - we only include those where we have a standardAccount
|
||||
// - when no icon has been specified, default to substrate
|
||||
// - sort by name, however we keep 0, 2, 42 first in the list
|
||||
const available: Network[] = all
|
||||
.filter((n): n is NetworkFromSubstrateNamed => !n.isIgnored && !!n.network)
|
||||
.map((n) => ({ ...n, genesisHash: n.genesisHash || [], icon: n.icon || 'substrate' }))
|
||||
.sort((a, b) =>
|
||||
UNSORTED.includes(a.prefix) && UNSORTED.includes(b.prefix)
|
||||
? 0
|
||||
: UNSORTED.includes(a.prefix)
|
||||
? -1
|
||||
: UNSORTED.includes(b.prefix)
|
||||
? 1
|
||||
: a.displayName.localeCompare(b.displayName)
|
||||
);
|
||||
|
||||
// A filtered list of those chains we have details about (genesisHashes)
|
||||
const filtered: Network[] = available.filter((n) => n.genesisHash.length || n.prefix === 42);
|
||||
|
||||
export { all, available };
|
||||
|
||||
export default filtered;
|
||||
@@ -0,0 +1,34 @@
|
||||
// Copyright 2017-2021 @polkadot/keyring authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export type Icon = 'beachball' | 'empty' | 'jdenticon' | 'polkadot' | 'substrate';
|
||||
|
||||
export interface NetworkFromSubstrate {
|
||||
decimals: number[] | null,
|
||||
displayName: string;
|
||||
network: string | null;
|
||||
prefix: number;
|
||||
genesisHash?: string[] | null;
|
||||
hasLedgerSupport?: boolean;
|
||||
icon?: Icon | null;
|
||||
isIgnored?: boolean;
|
||||
slip44?: number;
|
||||
standardAccount: '*25519' | null;
|
||||
symbols: string[] | null;
|
||||
website: string | null;
|
||||
}
|
||||
|
||||
export interface NetworkFromSubstrateNamed extends NetworkFromSubstrate {
|
||||
network: string;
|
||||
}
|
||||
|
||||
export interface Network extends NetworkFromSubstrateNamed {
|
||||
genesisHash: string[];
|
||||
icon: Icon;
|
||||
}
|
||||
|
||||
export interface Ss58Registry {
|
||||
registry: NetworkFromSubstrate[];
|
||||
specification: string;
|
||||
schema: Record<string, string>;
|
||||
}
|
||||
@@ -15,7 +15,3 @@ Functions can be imported as follows:
|
||||
```js
|
||||
import { mnemonicGenerate } from '@polkadot/util-crypto';
|
||||
```
|
||||
|
||||
## Utilities
|
||||
|
||||
[Utilities](SUMMARY.md)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user