Compare commits

..
191 Commits
Author SHA1 Message Date
Github Actions 8f24a2758e [CI Skip] release/stable 3.7.1
skip-checks: true
2020-11-01 13:49:36 +00:00
Jaco Greeff 3230663ae1 3.7 (#738)
* 3.7

* Update new rules

* RegExp

* formatBalance cleanups

* Revert

* Formatting

* fill

* format test fix

* cleanups

* Cleanups

* Expand bip39 tests

* Cleanups

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

* Adjust copyrights

* Fix jest aliassing

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

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

* Cleanups
2020-10-26 22:57:11 +01:00
Github Actions badbbd76cb [CI Skip] release/beta 3.6.2-5
skip-checks: true
2020-10-26 20:43:23 +00:00
Jaco Greeff 253776a510 Cleanup elliptic imports (#729) 2020-10-26 21:37:51 +01:00
Github Actions e1ef295bfa [CI Skip] release/beta 3.6.2-4
skip-checks: true
2020-10-26 19:36:31 +00:00
Jaco Greeff 73c89f4e3c Remove chalk dependency (#728) 2020-10-26 20:30:36 +01:00
Github Actions a52e0dfb16 [CI Skip] release/beta 3.6.2-3
skip-checks: true
2020-10-26 14:51:26 +00:00
Jaco Greeff 9f8ed7bb50 Remove copy-to-apps script 2020-10-26 15:46:29 +01:00
Github Actions a932f9408a [CI Skip] release/beta 3.6.2-2
skip-checks: true
2020-10-26 10:37:31 +00:00
Jaco Greeff 7907ce6dbf Bump actions, cleanups (#727) 2020-10-26 11:31:49 +01:00
Github Actions 230d510491 [CI Skip] release/beta 3.6.2-1
skip-checks: true
2020-10-23 11:10:06 +00:00
Jaco Greeff 415fd1b2d1 Bump deps (#726) 2020-10-23 13:05:45 +02:00
Github Actions 89c954216d [CI Skip] release/beta 3.6.2-0
skip-checks: true
2020-10-23 08:08:22 +00:00
Jaco Greeff b689796b25 Create .nojekyll 2020-10-23 10:03:23 +02:00
Jaco Greeff c4c18d324b Create 404.html 2020-10-23 10:02:53 +02:00
Jaco Greeff b7bf500343 Create index.html 2020-10-23 10:02:36 +02:00
Github Actions e5c6baf425 [CI Skip] release/stable 3.6.1
skip-checks: true
2020-10-18 11:56:50 +00:00
Jaco Greeff 0127899c5e 3.6 (#724) 2020-10-18 13:50:52 +02:00
Github Actions f23611cad6 [CI Skip] release/beta 3.6.0-beta.17
skip-checks: true
2020-10-18 10:58:39 +00:00
Jaco Greeff a74df109b0 Use githubusercontent (#723)
* Use githubusercontent

* crosscheck
2020-10-18 12:52:39 +02:00
Github Actions 9582013bfa [CI Skip] release/beta 3.6.0-beta.16
skip-checks: true
2020-10-17 15:01:16 +00:00
Jaco Greeff 6c148dcb3b Add ss58 output to issue (#721) 2020-10-17 16:55:43 +02:00
Jaco Greeff 65488bbff8 Bump deps (#722)
* Bump deps

* Rewrite
2020-10-17 16:53:04 +02:00
Github Actions 40cbb81d1e [CI Skip] release/beta 3.6.0-beta.15
skip-checks: true
2020-10-17 08:19:20 +00:00
Jaco Greeff 77b896054f Remove (unused) typedoc (#720)
* Remove (unused) typedoc

* rm typedoc package
2020-10-17 10:13:30 +02:00
Github Actions 89c717bd11 [CI Skip] release/beta 3.6.0-beta.14
skip-checks: true
2020-10-16 10:22:22 +00:00
Jaco Greeff b22f5643a9 Update chainx details (#718) 2020-10-16 12:16:25 +02:00
Github Actions 8d68ed3117 [CI Skip] release/beta 3.6.0-beta.13
skip-checks: true
2020-10-16 10:15:32 +00:00
Jaco Greeff 65b1c81c21 Expose all claimed/available networks (#719)
* Expose all claimed/available networks

* Expansion
2020-10-16 12:09:37 +02:00
Github Actions 28cd140cfb [CI Skip] release/beta 3.6.0-beta.12
skip-checks: true
2020-10-16 09:09:31 +00:00
Jaco Greeff 73b553fbd2 Update ss58-check.yml 2020-10-16 11:03:08 +02:00
Jaco Greeff f12075798d Update ss58-check.yml 2020-10-16 10:54:42 +02:00
Jaco Greeff 323db21306 Rename ss58-template.md to ss58-check.md 2020-10-16 10:54:12 +02:00
Jaco Greeff d54302eacc Rename ISSUE_TEMPLATE.md to ss58-template.md 2020-10-16 10:53:12 +02:00
Jaco Greeff 9a98d5b6e4 Swap to nightly runs (networkCheck) (#714)
* Swap to nightly runs (newtorkCheck)

* Update template

* Rename

* Update
2020-10-16 10:50:10 +02:00
Jaco Greeff 5ec613adf9 Delete ss58-registry.yml 2020-10-16 10:43:46 +02:00
Github Actions 567ce7955a [CI Skip] release/beta 3.6.0-beta.11
skip-checks: true
2020-10-16 08:33:42 +00:00
Jaco Greeff b185dcb072 Update with different issue creator (#713) 2020-10-16 10:28:04 +02:00
Github Actions 79010f83dc [CI Skip] release/beta 3.6.0-beta.10
skip-checks: true
2020-10-16 08:22:42 +00:00
Jaco Greeff 5354f93946 Ignore checkNetworks on normal runs (#712)
* Ignore checkNetworks on normal runs

* Every 15 min (for now)
2020-10-16 10:16:16 +02:00
Jaco Greeff e787e66ef9 Add label to nightly run 2020-10-16 09:34:09 +02:00
Jaco Greeff 440e826fed Update file path 2020-10-16 09:26:37 +02:00
Jaco Greeff d2e5e1d441 Create issue on failure of ss58 nightly run (#711) 2020-10-15 19:16:04 +02:00
Github Actions 32fc32f414 [CI Skip] release/beta 3.6.0-beta.9
skip-checks: true
2020-10-15 00:39:19 +00:00
Jaco Greeff 0a7b2a7a9f Support multipe genesisHashes (#710) 2020-10-15 02:33:18 +02:00
Github Actions c315e6fdaa [CI Skip] release/beta 3.6.0-beta.8
skip-checks: true
2020-10-14 23:52:33 +00:00
Jaco Greeff b5d9ed36e1 Add Dock genesis to networks (was avail on apps UI) (#708) 2020-10-15 01:46:22 +02:00
Github Actions f24c7983c8 [CI Skip] release/beta 3.6.0-beta.7
skip-checks: true
2020-10-14 12:58:32 +00:00
Jaco Greeff 3447cd40bf Add @polkadot/networks (#707)
* Add @polkadot/networks

* Update .github/workflows/ss58-registry.yml

* Use prefixes from @polkadot/network

* Update packages/networks/src/checkLatest.spec.ts

* Cleanups

* Auto-check fields based on schema

* typo

* language
2020-10-14 14:52:29 +02:00
Github Actions 95f4702e26 [CI Skip] release/beta 3.6.0-beta.6
skip-checks: true
2020-10-12 16:17:25 +00:00
Jake Naviasky 506142da8a Add evmToAddress and addressToEvm crypto utils. (#705) 2020-10-12 18:11:20 +02:00
Github Actions 34f6eac538 [CI Skip] release/beta 3.6.0-beta.5
skip-checks: true
2020-10-07 11:30:17 +00:00
Jaco Greeff ae1a37cdf7 Verify with MultiSignature (#703)
* Verify with MultiSignature

* Bump dev
2020-10-07 13:24:24 +02:00
Github Actions fab087bbe5 [CI Skip] release/beta 3.6.0-beta.4
skip-checks: true
2020-10-06 13:36:00 +00:00
Jaco Greeff 8608098996 Remove docs (replaced by docs repo) (#702) 2020-10-06 15:30:49 +02:00
Github Actions 220f4029b1 [CI Skip] release/beta 3.6.0-beta.3
skip-checks: true
2020-10-04 13:41:57 +00:00
Jaco Greeff d21daf1434 Bump dev (without lerna) (#701)
* Bump dev (without lerna)

* Add yarn plugins
2020-10-04 15:35:59 +02:00
Github Actions 1a4c16f797 [CI Skip] release/beta 3.6.0-beta.2
skip-checks: true
2020-10-02 12:44:29 +00:00
Jaco Greeff 975103fd3c Remove SUMMARY.md is prep for rework (#700) 2020-10-02 14:38:11 +02:00
Github Actions fb84ac7c25 [CI Skip] release/beta 3.6.0-beta.1
skip-checks: true
2020-10-01 06:47:08 +00:00
Rocco Musolino 13ae8665d5 remove doc broken link (#697) 2020-10-01 08:40:50 +02:00
Github Actions 4e8b2beb0b [CI Skip] release/beta 3.6.0-beta.0
skip-checks: true
2020-10-01 06:09:37 +00:00
Jaco Greeff dd1220ac97 s/mnemonicToBip39/mnemonicToLegacySeed/ (#699)
* s/mnemonicToBip39/mnemonicToLegacySeed/

* Update CHANGELOG.md
2020-10-01 08:03:18 +02:00
Github Actions b46308fa8f [CI Skip] release/stable 3.5.1
skip-checks: true
2020-09-27 08:05:00 +00:00
Jaco Greeff c366e637e9 3.5 (#694)
* 3.5

* Update CHANGELOG.md
2020-09-27 09:58:54 +02:00
Jaco Greeff 81acc81ef7 Change decimals, move unit (#695)
* Change decimals, move unit

* CHANGELOG
2020-09-27 09:49:47 +02:00
Github Actions eb7270ff3f [CI Skip] release/beta 3.5.0-beta.15
skip-checks: true
2020-09-25 15:12:38 +00:00
Jaco Greeff 30198d1a6d Don't decode on unlocked 2020-09-25 17:06:04 +02:00
Github Actions 2fc078d994 [CI Skip] release/beta 3.5.0-beta.14
skip-checks: true
2020-09-25 11:17:25 +00:00
Jaco Greeff bd1735cafb Keypair recoding should decode, then encode (#693)
* Keypair recoding should decode, then encode

* Add tests, align createFromJson naming
2020-09-25 13:11:34 +02:00
Github Actions ca73e5bc4d [CI Skip] release/beta 3.5.0-beta.13
skip-checks: true
2020-09-24 13:29:20 +00:00
Jaco Greeff aff78c2e30 Adjust KeyringInstance 2020-09-24 15:23:14 +02:00
Github Actions fbd454eb5a [CI Skip] release/beta 3.5.0-beta.12
skip-checks: true
2020-09-24 10:59:49 +00:00
Jaco Greeff ce964d2f12 Bump deps (#692)
* Bump deps

* Linting
2020-09-24 12:53:57 +02:00
Github Actions 2c26bc61da [CI Skip] release/beta 3.5.0-beta.11
skip-checks: true
2020-09-24 06:30:00 +00:00
Jaco Greeff 4111122cba JSON pair creation without addition (#691)
* JSON pair creation without addition

* Linting

* create test
2020-09-24 08:23:41 +02:00
Github Actions e1e95dc6b3 [CI Skip] release/beta 3.5.0-beta.10
skip-checks: true
2020-09-20 08:11:31 +00:00
Jaco Greeff e7c665e5da Add isBase{32, 58, 64} utils (#689)
* Add isBase{32, 58, 64} utils

* Allow empty inputs

* Add base64{Trim, Pad}

* isBase64

* Update assert messages

* Cleaup ifsCompat checks
2020-09-20 10:05:38 +02:00
Github Actions 301eb587cb [CI Skip] release/beta 3.5.0-beta.9
skip-checks: true
2020-09-18 13:15:50 +00:00
Jaco Greeff 5c886b0f81 TextEncoder/TextDecoder from polkadot-js (#686) 2020-09-18 15:09:25 +02:00
Jaco Greeff 56a79924a0 SPDX (#687) 2020-09-17 16:13:39 +02:00
Github Actions beef1b38ed [CI Skip] release/beta 3.5.0-beta.8
skip-checks: true
2020-09-16 07:02:28 +00:00
Jaco Greeff ce46a68187 Bump deps (#684) 2020-09-16 08:56:19 +02:00
Github Actions 94dc2d76b3 [CI Skip] release/beta 3.5.0-beta.7
skip-checks: true
2020-09-13 11:22:21 +00:00
Jaco Greeff dcdde1cf4b Bump deps (#682) 2020-09-13 13:13:09 +02:00
Github Actions e3a9099b58 [CI Skip] release/beta 3.5.0-beta.6
skip-checks: true
2020-09-09 16:52:47 +00:00
Jaco Greeff fb03ff3994 Bump deps (#681) 2020-09-09 18:46:23 +02:00
Github Actions 1d42fbf2bf [CI Skip] release/beta 3.5.0-beta.5
skip-checks: true
2020-09-09 07:53:48 +00:00
Lovesh Harchandani c0e4b1b93e Add Dock network id for address generation (#640)
Taking 21 and 22 for testnet and mainnet

Signed-off-by: lovesh <lovesh.bond@gmail.com>
2020-09-09 09:47:33 +02:00
Github Actions 139f3f90b0 [CI Skip] release/beta 3.5.0-beta.4
skip-checks: true
2020-09-08 14:45:23 +00:00
Jaco Greeff cf6fae8e1d ed25519 from dev mnemonic test (#680) 2020-09-08 16:39:01 +02:00
Github Actions f8d69736c1 [CI Skip] release/beta 3.5.0-beta.3
skip-checks: true
2020-09-08 08:41:43 +00:00
Jaco Greeff a4322cb99a Rewrite yarn.lock (#679) 2020-09-08 10:35:33 +02:00
Github Actions 9445006127 [CI Skip] release/beta 3.5.0-beta.2
skip-checks: true
2020-09-06 16:15:20 +00:00
Jaco Greeff aeeaa91752 Bump deps (#677) 2020-09-06 18:09:35 +02:00
Github Actions 52fb4ac863 [CI Skip] release/beta 3.5.0-beta.1
skip-checks: true
2020-09-05 06:06:51 +00:00
Jaco Greeff 2a000a2a14 Bump deps (#676) 2020-09-05 08:00:53 +02:00
Github Actions 97fe3b2ea3 [CI Skip] release/beta 3.5.0-beta.0
skip-checks: true
2020-09-03 12:50:58 +00:00
Jaco Greeff 9b8a782d58 Bump dev (#675) 2020-09-03 14:44:24 +02:00
Github Actions b56e40ea5b [CI Skip] release/stable 3.4.1
skip-checks: true
2020-08-31 07:08:33 +00:00
Jaco Greeff 37d1bcb6eb 3.4 (#674) 2020-08-31 09:00:57 +02:00
Github Actions f2b8c1fb4e [CI Skip] release/beta 3.4.0-beta.3
skip-checks: true
2020-08-28 12:19:52 +00:00
Jaco Greeff 92cc8fc4e3 Add isWasm util (#673) 2020-08-28 14:12:22 +02:00
Github Actions 701bd9335d [CI Skip] release/beta 3.4.0-beta.2
skip-checks: true
2020-08-27 11:26:48 +00:00
Jaco Greeff d176c74715 Bump wasm to 1.4.1 (#672) 2020-08-27 13:19:36 +02:00
Github Actions 0bf7c799f3 [CI Skip] release/beta 3.4.0-beta.1
skip-checks: true
2020-08-26 08:52:16 +00:00
Jaco Greeff 2f7d5cd4e1 Bump deps (#670)
* Bump deps

* Bump crypto

* Bump berry

* Debump markdown plugin

* Explicit add of typedoc plugins

* Bump dev (typedoc exec)

* Bump md
2020-08-26 10:46:33 +02:00
Github Actions c42b517293 [CI Skip] release/beta 3.4.0-beta.0
skip-checks: true
2020-08-25 19:22:10 +00:00
Jaco Greeff e5dd55e419 Allow for WASM-as-available mnemonicToBip39 call (#669) 2020-08-25 21:16:22 +02:00
Github Actions 83fdd11c59 [CI Skip] release/stable 3.3.1
skip-checks: true
2020-08-24 07:11:21 +00:00
Jaco Greeff 08de8ce25a 3.3 (#668) 2020-08-24 09:05:24 +02:00
Github Actions 800bafc00c [CI Skip] release/beta 3.3.0-beta.2
skip-checks: true
2020-08-22 11:38:10 +00:00
Jaco Greeff 3b383b97ca Add addressRaw to keyring interface (#667)
* addressRaw to keyring interface

* Typos

* nobody

* Slice -20 for Ethereum

* addressRaw tests
2020-08-22 13:32:14 +02:00
Github Actions b381c09ecf [CI Skip] release/beta 3.3.0-beta.1
skip-checks: true
2020-08-18 09:45:16 +00:00
Jaco Greeff a53008fd67 Bump deps (#665) 2020-08-18 11:39:52 +02:00
Github Actions 899056c5a2 [CI Skip] release/beta 3.3.0-beta.0
skip-checks: true
2020-08-17 17:59:41 +00:00
Jaco Greeff 8554d47030 Ethereum keypair signing & verification (#664)
* Ethereum keypair signing & verification

* Verify against hashes expanded

* Adjust via flags

* ss58 encoding for 33-byte publicKey

* ecdsa types stores address as raw publicKey

* Adjust for hash lengths

* Adjust expand/compress specs
2020-08-17 19:52:44 +02:00
Github Actions 9808f58540 [CI Skip] release/stable 3.2.1
skip-checks: true
2020-08-17 10:23:06 +00:00
Jaco Greeff 7228100835 3.2 (#663) 2020-08-17 12:17:44 +02:00
Github Actions 08c1b413d2 [CI Skip] release/beta 3.2.0-beta.4
skip-checks: true
2020-08-17 09:34:41 +00:00
Jaco Greeff 27ae11860d Add Ethereum-compatible seed from mnemonic (#662)
* Add Ethereum-compatible seed from mnemonic

* Change encode signature to allow publicKeys

* Make CC happier
2020-08-17 11:28:59 +02:00
Github Actions 9cc984e8ae [CI Skip] release/beta 3.2.0-beta.3
skip-checks: true
2020-08-14 10:48:37 +00:00
Jaco Greeff d352782927 Ethereum keypair support (#661)
* Ethereum keypair support

* keypair support from seed

* Signature verification

* Cleanups

* Cleanup encode (no extra toLower)

* u8aToU8a

* Simulate random failure with range

* Cleanup BN conversions
2020-08-14 12:41:56 +02:00
Jaco Greeff 6e4a5281ed Bump deps (#660) 2020-08-12 17:02:26 +02:00
Github Actions d11f6d9307 [CI Skip] release/beta 3.2.0-beta.2
skip-checks: true
2020-08-11 14:49:56 +00:00
Jaco Greeff 61b57687af Ethereum address utils (#659)
* Ethereum address utils

* export in base
2020-08-11 16:46:01 +02:00
Github Actions 3ab1623a40 [CI Skip] release/beta 3.2.0-beta.1
skip-checks: true
2020-08-11 14:25:08 +00:00
Jaco Greeff f5acd60253 Actually expose base32* functions (#658) 2020-08-11 16:20:39 +02:00
Github Actions c4d368d2b5 [CI Skip] release/beta 3.2.0-beta.0
skip-checks: true
2020-08-11 06:59:01 +00:00
Jaco Greeff e487d0a454 - Allow for hasher to secp256k1 sign/verify functions (#657) 2020-08-11 08:54:52 +02:00
Github Actions 99ffcc52ec [CI Skip] release/stable 3.1.1
skip-checks: true
2020-08-10 04:51:43 +00:00
Jaco Greeff 64510af8d3 3.1 (#655) 2020-08-10 06:47:53 +02:00
Github Actions 52b14db475 [CI Skip] release/beta 3.1.0-beta.8
skip-checks: true
2020-08-09 12:45:13 +00:00
Jaco Greeff c5fe5cd8d4 Bump @polkadot/wasm (#654) 2020-08-09 14:41:40 +02:00
Github Actions bdfc614ad5 [CI Skip] release/beta 3.1.0-beta.7
skip-checks: true
2020-08-09 12:29:56 +00:00
Jaco Greeff 0d03eac307 Add deriveAddress (#653) 2020-08-09 14:26:37 +02:00
Github Actions 6c84edcb9d [CI Skip] release/beta 3.1.0-beta.6
skip-checks: true
2020-08-09 11:31:44 +00:00
Jaco Greeff 9d145e72b8 Base32 encoding/decoding (#652)
* Base32 encoding/decoding

* Attribution

* LOOKUP

* Share base32/58 alphabet validation

* Apply suggestions from code review
2020-08-09 13:27:47 +02:00
Github Actions 4529bc37b5 [CI Skip] release/beta 3.1.0-beta.5
skip-checks: true
2020-08-08 07:07:37 +00:00
Jaco Greeff 038ef42fe5 Bump deps (#651) 2020-08-08 09:03:58 +02:00
Github Actions 1871d36a97 [CI Skip] release/beta 3.1.0-beta.4
skip-checks: true
2020-08-06 12:19:34 +00:00
Jaco Greeff 45c2afae07 Bump berry (#650)
* Bump berry

* Rewrite
2020-08-06 14:15:37 +02:00
Github Actions 51edae2f67 [CI Skip] release/beta 3.1.0-beta.3
skip-checks: true
2020-08-05 14:32:25 +00:00
Jaco Greeff 437314e5ea Bump wasm-crypto (#649)
* Bump wasm-crypto

* Rewrite yarn.lock
2020-08-05 16:28:22 +02:00
Jaco Greeff ce6f9d8bc8 Scrypt via wasm-crypto (#647)
* Scrypt via wasm-crypto

* Bump wasm-crypto
2020-08-05 16:07:38 +02:00
Github Actions 0cf65e1671 [CI Skip] release/beta 3.1.0-beta.2
skip-checks: true
2020-07-31 13:52:39 +00:00
Brad Larson a0251ff650 [FIX] Adjust error message (#646)
I ran into a case where the secret value provided had trailing
whitespace, and when the code ran, it logged that secret value as part
of the stack trace.

This change will make it harder for users to accidentally leak key
material.
2020-07-31 15:48:31 +02:00
Github Actions 9696badcd1 [CI Skip] release/beta 3.1.0-beta.1
skip-checks: true
2020-07-31 08:07:03 +00:00
Jaco Greeff 08817d199d Bump deps (#645) 2020-07-31 10:02:57 +02:00
Github Actions df69a02e6f [CI Skip] release/beta 3.1.0-beta.0
skip-checks: true
2020-07-30 14:02:55 +00:00
Jaco Greeff e845132d89 Bump deps (#644) 2020-07-30 15:58:17 +02:00
Github Actions 21e9b9a033 [CI Skip] release/stable 3.0.1
skip-checks: true
2020-07-27 06:21:35 +00:00
Jaco Greeff db61ea3077 3.0 release (#643) 2020-07-27 08:17:28 +02:00
Github Actions d4a3d2392e [CI Skip] release/beta 3.0.0-beta.4
skip-checks: true
2020-07-27 06:09:08 +00:00
Jaco Greeff 88ecda706d 3.0 (#642)
* 3.0

* Bump dev
2020-07-27 08:05:04 +02:00
Github Actions 184fb1f12e [CI Skip] release/beta 3.0.0-beta.3
skip-checks: true
2020-07-22 15:45:42 +00:00
Reto Trinkler 91340577df Adding 4 as address type of ss58 for Katal Chain (#639) 2020-07-22 17:41:49 +02:00
Github Actions 36729678e2 [CI Skip] release/beta 3.0.0-beta.2
skip-checks: true
2020-07-21 07:06:23 +00:00
Jaco Greeff 1c6b4bfc34 Dev bump 2020-07-21 09:02:25 +02:00
Github Actions bbfd175579 [CI Skip] release/beta 3.0.0-beta.1
skip-checks: true
2020-07-21 06:21:56 +00:00
Jaco Greeff 0a6bd41444 Keyring JSON with kdf (#637)
* Keyring JSON with pbkdf2

* pbkdf2 from wasm

* Encode/decode defaults adjusted

* v2 decoding test

* Recode refreshes defaults

* Use scrypt for kdf

* test conversions

* Fix params

* Cleanup decoding pass

* Swap encoding to base64

* Update for base64 encoding

* 3.0.0
2020-07-21 08:17:46 +02:00
Github Actions ab21274c36 [CI Skip] release/beta 2.19.0-beta.2
skip-checks: true
2020-07-17 12:30:08 +00:00
Jaco Greeff d4e6ad5553 Bump dev 2020-07-17 14:26:11 +02:00
Github Actions 49dbd757df [CI Skip] release/beta 2.19.0-beta.1
skip-checks: true
2020-07-17 12:07:35 +00:00
Jaco Greeff 20e82cc45b Dev bump 2020-07-17 14:03:36 +02:00
Github Actions 6a7fa80c55 [CI Skip] release/beta 2.19.0-beta.0
skip-checks: true
2020-07-17 06:39:13 +00:00
Jaco Greeff 12e34cd3e8 Bump deps (#635) 2020-07-17 08:35:10 +02:00
Github Actions 0a598fdf92 [CI Skip] release/stable 2.18.1
skip-checks: true
2020-07-13 08:51:33 +00:00
Jaco Greeff 659b896ee7 2.18 (#634) 2020-07-13 10:47:53 +02:00
Github Actions 7cda007a30 [CI Skip] release/beta 2.18.0-beta.3
skip-checks: true
2020-07-09 07:19:51 +00:00
Jaco Greeff 2288c4da8a Base64 utils (#632) 2020-07-09 09:16:24 +02:00
Github Actions fbfc21be1c [CI Skip] release/beta 2.18.0-beta.2
skip-checks: true
2020-07-08 13:39:52 +00:00
Jaco Greeff 787beb2aea Add isUtf8 (#631) 2020-07-08 15:35:43 +02:00
Github Actions 6234e16c37 [CI Skip] release/beta 2.18.0-beta.1
skip-checks: true
2020-07-08 11:58:35 +00:00
Jaco Greeff e9cbc0a0d9 Bump deps (#630) 2020-07-08 13:54:57 +02:00
Github Actions 166eeb8852 [CI Skip] release/beta 2.18.0-beta.0
skip-checks: true
2020-07-08 09:18:38 +00:00
Jaco Greeff b321f92161 Add isAscii (#629) 2020-07-08 11:14:55 +02:00
472 changed files with 7270 additions and 13281 deletions
-1
View File
@@ -1 +0,0 @@
module.exports = require('./babel.config.js');
-4
View File
@@ -1,4 +0,0 @@
.eslintrc.js
**/build/*
**/coverage/*
**/node_modules/*
+17
View File
@@ -1,11 +1,28 @@
// Copyright 2017-2020 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
const base = require('@polkadot/dev/config/eslint');
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'
}
};
+11
View File
@@ -0,0 +1,11 @@
---
assignees: ['jacogr']
title: SS58 registry is outdated
labels: ['ci', '@networks']
---
cc @jacogr
Discrepancies detected between https://github.com/paritytech/substrate/blob/master/ss58-registry.json and https://github.com/polkadot-js/common/blob/master/packages/networks/src/index.ts
Check the nightly cron output or run `yarn networks:crosscheck` locally. The output as found from the test includes:
+2 -2
View File
@@ -5,11 +5,11 @@ jobs:
pr:
strategy:
matrix:
step: ['lint', 'test', 'build', 'docs']
step: ['lint', 'test', 'build']
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 }}
+2 -3
View File
@@ -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 }}
+24
View File
@@ -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 }}
with:
filename: .github/ss58-check.md
+1 -1
View File
@@ -1 +1 @@
10
12
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+55
View File
File diff suppressed because one or more lines are too long
-56
View File
File diff suppressed because one or more lines are too long
+6 -2
View File
@@ -5,7 +5,11 @@ 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"
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools"
yarnPath: .yarn/releases/yarn-rc.js
yarnPath: .yarn/releases/yarn-2.3.3.cjs
+294 -48
View File
@@ -1,165 +1,365 @@
# CHANGELOG
## 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)
@@ -167,7 +367,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)`
@@ -175,133 +378,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
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
module.exports = require('@polkadot/dev/config/babel');
-17
View File
@@ -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"
+1
View File
@@ -0,0 +1 @@
-41
View File
@@ -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'
]
}
};
-9
View File
@@ -1,9 +0,0 @@
$accentColor = #fd8824
$textColor = #2c3e50
.home .hero .description,
.home .feature h2,
.home .feature p {
color: $textColor
opacity: 0.75
}
+12
View File
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=0.5, maximum-scale=1">
<meta http-equiv="refresh" content="0;URL='https://polkadot.js.org/docs/'" />
<title>Redirecting to https://polkadot.js.org/docs/</title>
</head>
<body>
Redirecting to <a href="https://polkadot.js.org/docs/">https://polkadot.js.org/docs/</a>
</body>
</html>
-51
View File
@@ -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
View File
@@ -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"
}
}
-12
View File
@@ -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"
}
}
-13
View File
@@ -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
```
+12
View File
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=0.5, maximum-scale=1">
<meta http-equiv="refresh" content="0;URL='https://polkadot.js.org/docs/'" />
<title>Redirecting to https://polkadot.js.org/docs/</title>
</head>
<body>
Redirecting to <a href="https://polkadot.js.org/docs/">https://polkadot.js.org/docs/</a>
</body>
</html>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

+11 -5
View File
@@ -1,20 +1,26 @@
// 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.
// SPDX-License-Identifier: Apache-2.0
const config = require('@polkadot/dev/config/jest');
module.exports = Object.assign({}, config, {
moduleNameMapper: {
'@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|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node'
},
modulePathIgnorePatterns: [
'<rootDir>/packages/keyring/build',
'<rootDir>/packages/networks/build',
'<rootDir>/packages/util/build',
'<rootDir>/packages/util-crypto/build'
'<rootDir>/packages/util-crypto/build',
'<rootDir>/packages/x-fetch/build',
'<rootDir>/packages/x-textdecoder/build',
'<rootDir>/packages/x-textencoder/build',
'<rootDir>/packages/x-ws/build'
],
resolver: './jest.resolver.js'
resolver: '@polkadot/dev/config/jest-resolver'
});
-11
View File
@@ -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
View File
@@ -1,13 +0,0 @@
{
"npmClient": "yarn",
"useWorkspaces": true,
"command": {
"publish": {
"allowBranch": "master"
}
},
"packages": [
"packages/*"
],
"version": "2.17.1"
}
+9 -9
View File
@@ -7,24 +7,24 @@
"packages/*"
],
"resolutions": {
"babel-core": "^7.0.0-bridge.0"
"babel-core": "^7.0.0-bridge.0",
"typescript": "^4.0.5"
},
"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.10.4",
"@polkadot/dev": "^0.55.19",
"@polkadot/ts": "^0.3.27",
"@types/jest": "^26.0.3"
"@babel/core": "^7.12.3",
"@polkadot/dev": "^0.59.12",
"@polkadot/ts": "^0.3.53",
"@types/jest": "^26.0.15"
},
"version": "2.17.1"
"version": "3.7.1"
}
-4
View File
@@ -15,7 +15,3 @@ Classes and Functions can be imported as follows:
```js
import Keyring from '@polkadot/keyring';
```
## Utilities
[Utilities](SUMMARY.md)
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/keyring",
"version": "2.17.1",
"version": "3.7.1",
"description": "Keyring management",
"main": "index.js",
"publishConfig": {
@@ -27,8 +27,8 @@
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
"dependencies": {
"@babel/runtime": "^7.10.4",
"@polkadot/util": "2.17.1",
"@polkadot/util-crypto": "2.17.1"
"@babel/runtime": "^7.12.1",
"@polkadot/util": "^3.7.1",
"@polkadot/util-crypto": "^3.7.1"
}
}
+1 -2
View File
@@ -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.
// 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';
+205 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { hexToU8a, stringToU8a } from '@polkadot/util';
import { cryptoWaitReady, setSS58Format, encodeAddress } from '@polkadot/util-crypto';
@@ -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(
@@ -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);
});
});
@@ -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);
});
});
@@ -204,12 +229,121 @@ 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);
});
});
@@ -232,4 +366,73 @@ describe('keypair', (): void => {
).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 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { detectPackage } from '@polkadot/util';
import { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
+42 -31
View File
@@ -1,17 +1,23 @@
// 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.
// 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 { KeyringInstance, KeyringPair, KeyringPair$Json, KeyringPair$JsonEncodingTypes, KeyringPair$Meta, KeyringOptions } from './types';
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
import { decodeAddress, encodeAddress, keyExtractSuri, keyFromPath, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed, mnemonicToMiniSecret } from '@polkadot/util-crypto';
import { base64Decode, decodeAddress, encodeAddress, keyExtractSuri, keyFromPath, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed, mnemonicToLegacySeed, mnemonicToMiniSecret } from '@polkadot/util-crypto';
import { DEV_PHRASE } from './defaults';
import createPair from './pair';
import Pairs from './pairs';
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
*
@@ -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);
}
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import testingPairs from '../testingPairs';
+27 -12
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { assert, stringToU8a, u8aFixLength } from '@polkadot/util';
import { naclDecrypt } from '@polkadot/util-crypto';
import { KeyringPair$JsonEncodingTypes } from '../types';
import { PairInfo } from './types';
import { NONCE_LENGTH, PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
import { assert, stringToU8a, u8aFixLength } from '@polkadot/util';
import { naclDecrypt, scryptEncode, scryptFromU8a } from '@polkadot/util-crypto';
import { ENCODING, NONCE_LENGTH, PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH, SCRYPT_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 default function decode (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);
}
+10 -3
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { 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
};
+3 -4
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import testingPairs from '../testingPairs';
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH } from './defaults';
import { PKCS8_DIVIDER, PKCS8_HEADER, NONCE_LENGTH, PUB_LENGTH, SCRYPT_LENGTH, SEC_LENGTH } from './defaults';
const PKCS8_LENGTH = PKCS8_DIVIDER.length + PKCS8_HEADER.length + PUB_LENGTH + SEC_LENGTH;
const ENCODED_LENGTH = 157;
const ENCODED_LENGTH = 16 + PKCS8_LENGTH + NONCE_LENGTH + SCRYPT_LENGTH;
const keyring = testingPairs({ type: 'ed25519' }, false);
+6 -6
View File
@@ -1,11 +1,10 @@
// 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.
// SPDX-License-Identifier: Apache-2.0
import { PairInfo } from './types';
import { stringToU8a, u8aConcat, u8aFixLength, assert } from '@polkadot/util';
import { naclEncrypt } from '@polkadot/util-crypto';
import { u8aConcat, assert } from '@polkadot/util';
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
@@ -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);
}
+17 -2
View File
@@ -1,9 +1,10 @@
// 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.
// SPDX-License-Identifier: Apache-2.0
import { cryptoWaitReady, encodeAddress as toSS58, setSS58Format } from '@polkadot/util-crypto';
import { hexToU8a } from '@polkadot/util';
import { PAIRS } from '../testing';
import testingPairs from '../testingPairs';
import createPair from '.';
@@ -23,6 +24,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 => {
@@ -103,4 +109,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'));
});
});
});
+91 -80
View File
@@ -1,13 +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.
// SPDX-License-Identifier: Apache-2.0
import { Keypair, KeypairType } from '@polkadot/util-crypto/types';
import { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
import { KeyringPair, KeyringPair$Json, KeyringPair$JsonEncodingTypes, KeyringPair$Meta, SignOptions } from '../types';
import { 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, u8aToHex } from '@polkadot/util';
import { blake2AsU8a, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, secp256k1Compress, signatureVerify } from '@polkadot/util-crypto';
import decode from './decode';
import encode from './encode';
@@ -19,61 +18,37 @@ 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]);
const TYPE_FROM_SEED = {
ecdsa: secp256k1FromSeed,
ed25519: naclFromSeed,
ethereum: secp256k1FromSeed,
sr25519: schnorrkelFromSeed
};
const TYPE_PREFIX = {
ecdsa: new Uint8Array([2]),
ed25519: new Uint8Array([0]),
ethereum: new Uint8Array([2]),
sr25519: new Uint8Array([1])
};
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
};
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
};
function isEmpty (u8a: Uint8Array): boolean {
return u8a.reduce((count, u8): number => count + u8, 0) === 0;
}
function fromSeed (type: KeypairType, seed: Uint8Array): Keypair {
return {
ecdsa: (): Keypair => secp256k1FromSeed(seed),
ed25519: (): Keypair => naclFromSeed(seed),
sr25519: (): Keypair => schnorrkelFromSeed(seed)
}[type]();
}
function multiSignaturePrefix (type: KeypairType): Uint8Array {
return {
ecdsa: SIG_TYPE_ECDSA,
ed25519: SIG_TYPE_ED25519,
sr25519: SIG_TYPE_SR25519
}[type];
}
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;
}
return u8a.reduce((count, u8) => count + u8, 0) === 0;
}
// Not 100% correct, since it can be a Uint8Array, but an invalid one - just say "undefined" is anything non-valid
@@ -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 default function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: PairInfo, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, encTypes?: KeyringPair$JsonEncodingTypes[]): KeyringPair {
const decodePkcs8 = (passphrase?: string, userEncoded?: Uint8Array | null): void => {
const decoded = decode(passphrase, userEncoded || encoded, encTypes);
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 = encode({ 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');
@@ -152,21 +153,31 @@ export default function createPair ({ toSS58, type }: Setup, { publicKey, secret
return createPair({ toSS58, type }, derived, meta, null);
},
encodePkcs8: (passphrase?: string): Uint8Array =>
encode({ publicKey, secretKey }, passphrase),
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: 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](message, { publicKey, secretKey })
);
},
toJson: (passphrase?: string): KeyringPair$Json => {
const address = ['ecdsa', 'ethereum'].includes(type)
? u8aToHex(secp256k1Compress(publicKey))
: encodeAddress();
return toJson(type, { address, meta }, recode(passphrase), !!passphrase);
},
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)
signatureVerify(message, signature, TYPE_ADDRESS[type](publicKey), type === 'ethereum').isValid
};
}
+2 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
@@ -26,6 +25,7 @@ const json: KeyringPair$Json = {
export default function everybody (): KeyringPair {
const pair: KeyringPair = {
address,
addressRaw: publicKey,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
decodePkcs8: (passphrase?: string, encoded?: Uint8Array): void =>
undefined,
+7 -8
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import testingPairs from '../testingPairs';
@@ -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'
}
});
});
+15 -8
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { KeypairType } from '@polkadot/util-crypto/types';
import { KeyringPair$Json, KeyringPair$Meta } from '../types';
import { 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;
}
// version 2 - nonce, encoded (previous)
// version 3 - salt, nonce, encoded
const VERSION = '3';
const ENC_NONE: KeyringPair$JsonEncodingTypes[] = ['none'];
export default function toJson (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 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
export interface PairInfo {
publicKey: Uint8Array;
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { KeyringPairs, KeyringPair } from './types';
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
// From https://github.com/paritytech/substrate/wiki/Secret-URI-Test-Vectors
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { KeyringInstance, KeyringOptions } from './types';
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { cryptoWaitReady } from '@polkadot/util-crypto';
+1 -2
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { KeyringPair, KeyringOptions } from './types';
+7 -4
View File
@@ -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.
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from '@polkadot/util-crypto/address/types';
import { KeypairType } from '@polkadot/util-crypto/types';
@@ -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;
@@ -70,6 +72,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[];
+201
View File
@@ -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.
+5
View File
@@ -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
+35
View File
@@ -0,0 +1,35 @@
{
"name": "@polkadot/networks",
"version": "3.7.1",
"description": "A list of all available Substrate networks and their applicable prefixes",
"main": "index.js",
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
},
"repository": {
"type": "git",
"url": "git+https://github.com/polkadot-js/common.git"
},
"keywords": [
"Polkadot",
"ss58"
],
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [
"Jaco Greeff <jacogr@gmail.com>"
],
"contributors": [],
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/polkadot-js/common/issues"
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
"dependencies": {
"@babel/runtime": "^7.12.1"
},
"devDependencies": {
"@polkadot/util": "^3.7.1",
"@polkadot/x-fetch": "^3.7.1"
}
}
+71
View File
@@ -0,0 +1,71 @@
// Copyright 2017-2020 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { 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)}`);
});
});
+10
View File
@@ -0,0 +1,10 @@
// Copyright 2017-2020 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import filtered from './';
describe('filtered', (): void => {
it('has the correct starting order', (): void => {
expect(filtered.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
});
});
+367
View File
@@ -0,0 +1,367 @@
// Copyright 2017-2020 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { Network, NetworkFromSubstrate } 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 = 'This prefix is reserved.'): NetworkFromSubstrate => ({
decimals: null,
displayName,
network: `reserved${prefix}`,
prefix,
standardAccount: null,
symbols: null,
website: null
});
const all: NetworkFromSubstrate[] = [
{
decimals: [10],
displayName: 'Polkadot Relay Chain',
genesisHash: ['0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'],
icon: 'polkadot',
network: 'polkadot',
prefix: 0,
standardAccount: '*25519',
symbols: ['DOT'],
website: 'https://polkadot.network'
},
createReserved(1),
{
decimals: [12],
displayName: 'Kusama Relay Chain',
genesisHash: [
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
icon: 'polkadot',
network: 'kusama',
prefix: 2,
standardAccount: '*25519',
symbols: ['KSM'],
website: 'https://kusama.network'
},
createReserved(3),
{
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: null,
displayName: 'Polymath',
network: 'polymath',
prefix: 12,
standardAccount: '*25519',
symbols: null,
website: null
},
{
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: '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',
genesisHash: ['0x3f0608444cf5d7eec977430483ffef31ff86dfa6bfc6d7114023ee80cc03ea3f'],
network: 'dock-testnet',
prefix: 21,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: [6],
displayName: 'Dock Mainnet',
genesisHash: ['0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'],
network: 'dock-mainnet',
prefix: 22,
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',
network: 'zero-alphaville',
prefix: 25,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: null,
displayName: 'Subsocial',
genesisHash: ['0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'],
network: 'subsocial',
prefix: 28,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Phala Network',
network: 'phala',
prefix: 30,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Robonomics Network',
network: 'robonomics',
prefix: 32,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: null,
displayName: 'DataHighway',
network: 'datahighway',
prefix: 33,
standardAccount: '*25519',
symbols: null,
website: null
},
{
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: 'MathChain mainnet',
network: 'mathchain',
prefix: 39,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: [18],
displayName: 'MathChain testnet',
network: 'mathchain-testnet',
prefix: 40,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: null,
displayName: 'Substrate',
network: 'substrate',
prefix: 42,
standardAccount: '*25519',
symbols: null,
website: 'https://substrate.dev/'
},
createReserved(43),
{
decimals: [8],
displayName: 'ChainX',
network: 'chainx',
prefix: 44,
standardAccount: '*25519',
symbols: ['PCX'],
website: 'https://chainx.org/'
},
createReserved(46),
createReserved(47),
createReserved(48, 'All prefixes 48 and higher are reserved and cannot be allocated.')
];
// The list of available/claimed prefixes
// - 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.standardAccount === '*25519')
.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;
+27
View File
@@ -0,0 +1,27 @@
// Copyright 2017-2020 @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;
prefix: number;
genesisHash?: string[] | null;
icon?: Icon | null;
standardAccount: '*25519' | null;
symbols: string[] | null;
website: string | null;
}
export interface Network extends NetworkFromSubstrate {
genesisHash: string[];
icon: Icon;
}
export interface Ss58Registry {
registry: NetworkFromSubstrate[];
specification: string;
schema: Record<string, string>;
}
-4
View File
@@ -15,7 +15,3 @@ Functions can be imported as follows:
```js
import { mnemonicGenerate } from '@polkadot/util-crypto';
```
## Utilities
[Utilities](SUMMARY.md)
+11 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/util-crypto",
"version": "2.17.1",
"version": "3.7.1",
"description": "A collection of useful crypto utilities for @polkadot",
"main": "index.js",
"keywords": [
@@ -25,23 +25,27 @@
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util-crypto#readme",
"dependencies": {
"@babel/runtime": "^7.10.4",
"@polkadot/util": "2.17.1",
"@polkadot/wasm-crypto": "^1.2.1",
"@babel/runtime": "^7.12.1",
"@polkadot/networks": "^3.7.1",
"@polkadot/util": "^3.7.1",
"@polkadot/wasm-crypto": "^1.4.1",
"base-x": "^3.0.8",
"bip39": "^3.0.2",
"blakejs": "^1.1.0",
"bn.js": "^5.1.2",
"bn.js": "^5.1.3",
"create-hash": "^1.2.0",
"elliptic": "^6.5.3",
"js-sha3": "^0.8.0",
"pbkdf2": "^3.1.1",
"scryptsy": "^2.1.0",
"tweetnacl": "^1.0.3",
"xxhashjs": "^0.2.2"
},
"devDependencies": {
"@types/bn.js": "^4.11.6",
"@types/create-hash": "^1.2.2",
"@types/elliptic": "^6.4.12",
"@types/pbkdf2": "^3.0.0",
"@types/pbkdf2": "^3.1.0",
"@types/scryptsy": "^2.0.0",
"@types/xxhashjs": "^0.2.2"
}
}
@@ -0,0 +1,14 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { hexToU8a } from '@polkadot/util';
import addressToEvm from './addressToEvm';
describe('addressToEvm', (): void => {
it('creates a valid known EVM address', (): void => {
expect(
addressToEvm('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee9'));
});
});
@@ -0,0 +1,14 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import decode from './decode';
/**
* @name addressToEvm
* @summary Converts an SS58 address to its corresponding EVM address.
*/
export default function addressToEvm (address: string | Uint8Array, ignoreChecksum?: boolean): Uint8Array {
const decoded = decode(address, ignoreChecksum);
return decoded.subarray(0, 20);
}
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import checkAddress from './check';
+1 -2
View File
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from './types';
@@ -1,11 +1,10 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import sshash from './sshash';
export default function checkChecksum (decoded: Uint8Array): [boolean, number] {
const isPublicKey = decoded.length === 35;
const isPublicKey = [35, 36].includes(decoded.length);
// non-publicKeys has 1 byte checksums, else default to 2
const length = decoded.length - (isPublicKey ? 2 : 1);
@@ -1,13 +1,12 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { stringToU8a, u8aToHex } from '@polkadot/util';
import { stringToU8a, u8aToHex, hexToU8a } from '@polkadot/util';
import testingPairs, { TestKeyringMap } from '../../../keyring/src/testingPairs';
import decode from './decode';
describe('decode', (): void => {
describe('decodeAddress', (): void => {
let keyring: TestKeyringMap;
beforeAll((): void => {
@@ -74,6 +73,14 @@ describe('decode', (): void => {
).toEqual(new Uint8Array([42, 44, 10, 0, 0, 0, 0, 0]));
});
it('decodes a 33-byte address', (): void => {
expect(
decode('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou')
).toEqual(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
);
});
it.skip('allows invalid prefix (in list)', (): void => {
expect(
(): Uint8Array => decode('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
+1 -2
View File
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from './types';
+5 -6
View File
@@ -1,14 +1,13 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { allowedSS58 } from './ss58';
import { available } from '@polkadot/networks';
const defaults = {
allowedDecodedLengths: [1, 2, 4, 8, 32],
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
allowedEncodedLengths: [3, 4, 6, 10, 35],
allowedPrefix: allowedSS58,
allowedEncodedLengths: [3, 4, 6, 10, 35, 36],
allowedPrefix: available.map(({ prefix }) => prefix),
prefix: 42
};
@@ -0,0 +1,24 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { waitReady } from '@polkadot/wasm-crypto';
import derive from './derive';
describe('deriveAddress', (): void => {
beforeEach(async (): Promise<void> => {
await waitReady();
});
it('derives a known path', (): void => {
expect(
derive('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '/joe/polkadot/0')
).toEqual('5GZ4srnepXvdsuNVoxCGyVZd8ScDm4gkGLTKuaGARy9akjTa');
});
it('fails on hard paths', (): void => {
expect(
() => derive('5CZtJLXtVzrBJq1fMWfywDa6XuRwXekGdShPR4b8i9GWSbzB', '//bob')
).toThrow(/Expected suri to contain a combination of non-hard paths/);
});
});
@@ -0,0 +1,28 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from './types';
import { assert } from '@polkadot/util';
import DeriveJunction from '../key/DeriveJunction';
import { keyExtractPath } from '../key';
import { schnorrkelDerivePublic } from '../schnorrkel';
import decode from './decode';
import encode from './encode';
/**
* @name deriveAddress
* @summary Creates a sr25519 derived address from the supplied and path.
* @description
* Creates a sr25519 derived address based on the input address/publicKey and the uri supplied.
*/
export default function deriveAddress (who: Uint8Array | string, suri: string, ss58Format?: Prefix): string {
const { path } = keyExtractPath(suri);
assert(path.length && !path.some((path) => path.isHard), 'Expected suri to contain a combination of non-hard paths');
return encode(path.reduce((publicKey: Uint8Array, path: DeriveJunction): Uint8Array => {
return schnorrkelDerivePublic(publicKey, path.chainCode);
}, decode(who)), ss58Format);
}
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import testingPairs from '@polkadot/keyring/testingPairs';
@@ -67,11 +66,17 @@ describe('encode', (): void => {
).toEqual('as7QnGMf');
});
it('enodes a 8-byte address', (): void => {
it('encodes a 8-byte address', (): void => {
expect(
encode(
new Uint8Array([42, 44, 10, 0, 0, 0, 0, 0]), 68
)
).toEqual('4q7qY5RBG7Z4wv');
});
it('encodes an 33-byte address', (): void => {
expect(
encode('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
).toEqual('KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou');
});
});
+2 -3
View File
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from './types';
@@ -19,7 +18,7 @@ export default function encode (_key: Uint8Array | string, ss58Format: Prefix =
assert(defaults.allowedDecodedLengths.includes(key.length), `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
const isPublicKey = key.length === 32;
const isPublicKey = [32, 33].includes(key.length);
const input = u8aConcat(new Uint8Array([ss58Format]), key);
const hash = sshash(input);
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import encodeDerivedAddress from './encodeDerived';
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import { Prefix } from './types';
@@ -12,7 +11,7 @@ import keyDerived from './keyDerived';
/**
* @name encodeDerivedAddress
* @summary Creates a derived address.
* @summary Creates a derived address as used in Substrate utility.
* @description
* Creates a Substrate derived address based on the input address/publicKey and the index supplied.
*/
@@ -1,6 +1,5 @@
// Copyright 2017-2020 @polkadot/util-crypto authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// SPDX-License-Identifier: Apache-2.0
import encodeMultiAddress from './encodeMulti';

Some files were not shown because too many files have changed in this diff Show More