Compare commits

...
284 Commits
Author SHA1 Message Date
Github Actions 4a5659a579 [CI Skip] release/stable 7.2.1
skip-checks: true
2021-08-15 08:46:10 +00:00
Jaco c4a8aa2dd7 7.2.1 (#1085)
* 7.2.1

* Update CHANGELOG.md

* u8aEmpty
2021-08-15 10:38:48 +02:00
Github Actions 2ad042e44d [CI Skip] release/beta 7.1.3-4
skip-checks: true
2021-08-13 11:56:50 +00:00
Jaco Greeff 4615fcfbde bump berry 2021-08-13 14:48:47 +03:00
Github Actions f90d84500d [CI Skip] release/beta 7.1.3-3
skip-checks: true
2021-08-13 11:02:19 +00:00
Jaco e919446341 Bump dev (#1084)
* Bump dev

* Cleanup circular dep

* CHANGELOG

* typo
2021-08-13 12:54:03 +02:00
Github Actions 8f942dcabe [CI Skip] release/beta 7.1.3-2
skip-checks: true
2021-08-12 08:09:40 +00:00
Nantian 2e4de2093c fix bigint type (#1079) 2021-08-12 10:00:58 +02:00
Github Actions 0202a1f1d4 [CI Skip] release/beta 7.1.3-1
skip-checks: true
2021-08-12 05:24:15 +00:00
Jaco Greeff 1e256fedaa pre 2021-08-12 08:16:52 +03:00
Github Actions 56a3d19083 [CI Skip] release/stable 7.1.2
skip-checks: true
2021-08-11 15:21:50 +00:00
Jaco caf76a7511 Ensure packageInfo from networks doesn't clobber crypto (#1076)
* Ensure packageInfo from networks doesn't clobber crypto

* 7.1.2

* Update CHANGELOG.md

* Extract network sorting

* ... revert, CC still not happy, maybe another day...
2021-08-11 17:14:28 +02:00
Github Actions 834a1e6a52 [CI Skip] release/beta 7.1.2-0
skip-checks: true
2021-08-10 09:23:32 +00:00
Jaco 7a5b1207b0 Minor x-bundle style cleanups (#1074) 2021-08-10 11:15:10 +02:00
Github Actions 8221576d25 [CI Skip] release/stable 7.1.1
skip-checks: true
2021-08-02 08:41:20 +00:00
Jaco 1f9d36d4db 7.1.1 (#1073) 2021-08-02 10:32:37 +02:00
Github Actions b292f2ae1d [CI Skip] release/beta 7.0.4-0
skip-checks: true
2021-08-02 04:26:52 +00:00
Song ZhouandJaco 7eddfc25c9 Add in ability to encrypt/decrypt msg with keyring (#1070)
* feat: able to encrypt & decrypt message in keyring - ed25519 & sr25519 types

* chore: make eslint happy

* test: add in one more test on cross-usage of ed25519 & sr25519

* make lint happy without eslint-disable

* assert away secp256k1 for encrypt/decrypt

* Update packages/keyring/src/pair/index.ts

* Update packages/keyring/src/pair/index.ts

Co-authored-by: Jaco <jacogr@gmail.com>
2021-08-02 06:18:58 +02:00
Github Actions c6ff77b56f [CI Skip] release/stable 7.0.3
skip-checks: true
2021-07-26 05:42:45 +00:00
Jaco 4a1f5bfbf4 7.0.3 (#1069) 2021-07-26 07:34:06 +02:00
Github Actions e8f0072e44 [CI Skip] release/beta 7.0.3-0
skip-checks: true
2021-07-23 05:26:30 +00:00
Jaco 4620a6a649 ss58 sync (#1066) 2021-07-23 07:19:24 +02:00
Github Actions a5fd5e2c85 [CI Skip] release/stable 7.0.2
skip-checks: true
2021-07-19 12:35:04 +00:00
Jaco b58c77d774 7.0.2 (#1063) 2021-07-19 14:28:14 +02:00
Github Actions 5e8ec185cb [CI Skip] release/beta 7.0.2-0
skip-checks: true
2021-07-17 06:57:49 +00:00
Jaco bbdf5659df Add isCompact (#1061) 2021-07-17 08:49:30 +02:00
Github Actions f8cc8d07e1 [CI Skip] release/stable 7.0.1
skip-checks: true
2021-07-11 10:12:38 +00:00
Jaco e3eb76762c 7.0.1 (#1058) 2021-07-11 12:05:13 +02:00
Github Actions 114e75a4b4 [CI Skip] release/beta 6.11.2-17
skip-checks: true
2021-07-11 05:05:49 +00:00
Miguel Hervas 5ca641c758 Add CFG Ledger Support (#1057) 2021-07-11 06:58:39 +02:00
Github Actions ded2528836 [CI Skip] release/beta 6.11.2-16
skip-checks: true
2021-07-09 16:03:27 +00:00
Jaco Greeff 70fa61916d Bump dev 2021-07-09 18:55:37 +03:00
Github Actions c9a2d3b6d7 [CI Skip] release/beta 6.11.2-15
skip-checks: true
2021-07-09 15:04:13 +00:00
Jaco Greeff 4927120403 Additional keyring exports 2021-07-09 17:04:11 +03:00
Github Actions 36f53f6b82 [CI Skip] release/beta 6.11.2-14
skip-checks: true
2021-07-09 12:11:29 +00:00
Jaco 24548e84e1 Networks bundling adjustments (#1056)
* Add networks to util bundle

* Bundling for @polkadot/networks

* Move to util-crypto

* Comment

* Update lock

* Re-adjust detectPackage

* Only exports

* Adjust

* Adjust tests

* crosscheck adjust
2021-07-09 14:03:21 +02:00
Github Actions 337deab526 [CI Skip] release/beta 6.11.2-13
skip-checks: true
2021-07-09 08:06:52 +00:00
Jaco 4a9f0326e7 Adjust bundle builds (crypto now working) (#1055) 2021-07-09 09:59:16 +02:00
Github Actions 81811510f4 [CI Skip] release/beta 6.11.2-12
skip-checks: true
2021-07-09 05:47:41 +00:00
Jaco f09867d90f Sync ss58 (#1054) 2021-07-09 07:39:15 +02:00
Github Actions 709e1ab3c1 [CI Skip] release/beta 6.11.2-11
skip-checks: true
2021-07-08 11:40:02 +00:00
Jaco ae2d7518b2 Bump deps (#1053) 2021-07-08 13:32:49 +02:00
Github Actions 5337f1dca9 [CI Skip] release/beta 6.11.2-10
skip-checks: true
2021-07-07 16:39:22 +00:00
Jaco cc9b8630ff Single module bundle via rollup (#1041)
* Single module bundle via rollup

* Additional

* Dedupe

* rollup default to browser

* Fix hw-ledger output naming

* Adjust with dev

* Update rollup.config.mjs

* Fix Ledger bundling

* Update rollup.config.mjs

* Apply suggestions from code review

* Use createBundle

* override all

* Update rollup.config.mjs

* Update rollup.config.mjs

* Remove browser index

* Add bundle entrypoint

* Attempt blackholing

* empty blake2

* Bump dev (w/ rollup plugins)

* Bump dev

* x-* as internal

* Updates

* Bump wasm

* Bump wasm
2021-07-07 19:32:17 +03:00
Github Actions e6e266a4c0 [CI Skip] release/beta 6.11.2-9
skip-checks: true
2021-07-07 11:44:51 +00:00
Jaco Greeff 3b96d87f7f Remove x-rxjs from tsconfig 2021-07-07 14:36:51 +03:00
Github Actions c1949a21be [CI Skip] release/beta 6.11.2-8
skip-checks: true
2021-07-07 10:38:27 +00:00
Jaco 7f0a6b0ce9 Split index into bundle & detect (#1051) 2021-07-07 12:30:55 +02:00
Github Actions 6b644025b0 [CI Skip] release/beta 6.11.2-7
skip-checks: true
2021-07-07 07:33:00 +00:00
Jaco 6ea1ee555b Remove the x-rxjs compatibility layer (#1050)
* Remove the x-rxjs compatibility layer

* Update CHANGELOG.md
2021-07-07 09:25:08 +02:00
Github Actions d582b2e180 [CI Skip] release/beta 6.11.2-6
skip-checks: true
2021-07-07 07:01:56 +00:00
Jaco c2d04155f9 Re-add rxjs/operators (#1049) 2021-07-07 08:53:16 +02:00
Github Actions 5a4dc97498 [CI Skip] release/beta 6.11.2-5
skip-checks: true
2021-07-07 06:45:57 +00:00
Jaco f1aeda10ee Adjust rxjs exports (#1048) 2021-07-07 08:37:51 +02:00
Github Actions 70a3aebce3 [CI Skip] release/beta 6.11.2-4
skip-checks: true
2021-07-06 13:09:56 +00:00
Jaco 31dd2ced0e RxJs 7 (#965)
* RxJs 7

* Bump deps

* rxjs 7.0.1

* Bump rxjs

* Bump to rxjs 7.2

* CHANGELOG
2021-07-06 15:01:39 +02:00
Github Actions 98ad1199f3 [CI Skip] release/beta 6.11.2-3
skip-checks: true
2021-07-06 11:19:06 +00:00
Jaco Greeff 30225ceb40 Bump dev 2021-07-06 14:11:08 +03:00
Github Actions 194b8ced5b [CI Skip] release/beta 6.11.2-2
skip-checks: true
2021-07-06 07:16:40 +00:00
Jaco Greeff 81ed8cfc6c Bump deps 2021-07-06 10:08:10 +03:00
Jaco Greeff 51598b00c0 Bump dev 2021-07-06 09:56:14 +03:00
Github Actions 1684bd3161 [CI Skip] release/beta 6.11.2-1
skip-checks: true
2021-07-06 05:55:04 +00:00
Jaco Greeff a53e1b8aa4 Bump dev 2021-07-06 08:46:36 +03:00
Github Actions 89f2925d89 [CI Skip] release/beta 6.11.2-0
skip-checks: true
2021-07-05 15:04:14 +00:00
Jaco c29a226279 Bump dev (#1045) 2021-07-05 16:55:51 +02:00
Github Actions b8d1ab95c6 [CI Skip] release/stable 6.11.1
skip-checks: true
2021-07-05 06:42:16 +00:00
Jaco bcddcab03e 6.11 (#1044) 2021-07-05 08:32:33 +02:00
Github Actions bfe2c5bd38 [CI Skip] release/beta 6.10.2-3
skip-checks: true
2021-07-02 14:00:42 +00:00
Jaco c243c4c59a Bump ZondaX deps (w/ Statemine fix) (#1043)
* Bump ZondaX deps (w/ Statemine fix)

* Statemine app naming
2021-07-02 15:53:42 +02:00
Github Actions c8db1347d0 [CI Skip] release/beta 6.10.2-2
skip-checks: true
2021-07-02 13:04:49 +00:00
Jaco 9952f90261 Remove unneeded x-global deps (#1042) 2021-07-02 14:56:21 +02:00
Github Actions 48fcd8b4ff [CI Skip] release/beta 6.10.2-1
skip-checks: true
2021-07-02 07:17:33 +00:00
Jaco 10a09253f8 Bump TS (#1040) 2021-07-02 09:08:27 +02:00
Github Actions 7b435f7a89 [CI Skip] release/beta 6.10.2-0
skip-checks: true
2021-06-30 11:21:10 +00:00
Jaco 392150e412 Update ss58 registry (#1038) 2021-06-30 13:13:13 +02:00
Github Actions 4ac2366a97 [CI Skip] release/stable 6.10.1
skip-checks: true
2021-06-26 07:51:26 +00:00
Jaco 017fb5e738 6.10 (#1036) 2021-06-26 09:43:02 +02:00
Github Actions 81a5ccc0ca [CI Skip] release/beta 6.9.2-12
skip-checks: true
2021-06-25 12:48:25 +00:00
Jaco fbe688ff4e Ledger info for Statemine (#1026) 2021-06-25 14:40:06 +02:00
Github Actions 9a58dc61eb [CI Skip] release/beta 6.9.2-11
skip-checks: true
2021-06-25 07:26:11 +00:00
Jaco d7bd59a699 ss58 update (#1035)
* ss58 update

* Update standardAccount type
2021-06-25 09:17:21 +02:00
Github Actions 41ef37e92e [CI Skip] release/beta 6.9.2-10
skip-checks: true
2021-06-24 11:22:25 +00:00
Antoine EstienneandJaco 8031a4472e Fix tojson pair for 20 address (#1032)
* added gerald test address

* exception for 20 address

* lint

* remove comment

* Update packages/keyring/src/pair/index.ts

Co-authored-by: Jaco <jacogr@gmail.com>

Co-authored-by: Jaco <jacogr@gmail.com>
2021-06-24 13:13:11 +02:00
Github Actions 31be56226d [CI Skip] release/beta 6.9.2-9
skip-checks: true
2021-06-23 13:55:31 +00:00
Jaco 902ff47337 isHex(value): value is string (#1031)
* isHex stringisHex(value): value is string

* lint
2021-06-23 15:47:42 +02:00
Github Actions dc06b87cdd [CI Skip] release/beta 6.9.2-8
skip-checks: true
2021-06-23 11:18:56 +00:00
Jaco 1e25accdad Sync ss58 with upstream (#1030)
* Sync ss58 with upstream

* CHANGELOG
2021-06-23 13:11:24 +02:00
Github Actions 67dbc4d7f7 [CI Skip] release/beta 6.9.2-7
skip-checks: true
2021-06-23 11:03:42 +00:00
Jaco ab3268407c Use describe.each for onlyJs flag (#1029)
* Use describe.each for onlyJs flag

* base validate checks
2021-06-23 12:55:29 +02:00
Github Actions 470b43578e [CI Skip] release/beta 6.9.2-6
skip-checks: true
2021-06-23 10:23:29 +00:00
Jaco 038b50455e Update deps (blake2js w/ types, @ledger/hw-transport) (#1027)
* Update deps (blake2js w/ types, @ledger/hw-transport)

* Lint fix

* Exapnd blake2 tests
2021-06-23 12:15:21 +02:00
Github Actions 5c3fa682a9 [CI Skip] release/beta 6.9.2-5
skip-checks: true
2021-06-23 06:02:29 +00:00
Jaco e677acd1ed Update toLegacySeed.ts (#1024) 2021-06-23 07:55:24 +02:00
Github Actions 68cd6e2dfb [CI Skip] release/beta 6.9.2-4
skip-checks: true
2021-06-23 05:11:08 +00:00
Nantian 7130ff6f71 add karura genesis hash (#1022) 2021-06-23 07:02:51 +02:00
Github Actions a6d5d0dcdc [CI Skip] release/beta 6.9.2-3
skip-checks: true
2021-06-22 16:00:23 +00:00
Jaco a3b738f91d @zondax/ledger-polkadot -> @zondax/ledger-substrate/ (#1021)
* @zondax/ledger-polkadot -> @zondax/ledger-substrate/

* Update imports
2021-06-22 17:51:52 +02:00
Github Actions b66d2e39f4 [CI Skip] release/beta 6.9.2-2
skip-checks: true
2021-06-22 14:11:43 +00:00
Jaco 0ef761e899 User template string type for isHex (#1020)
* User template string type for isHex

* isHex/isString combo checks
2021-06-22 16:05:14 +02:00
Github Actions 7d09f0892a [CI Skip] release/beta 6.9.2-1
skip-checks: true
2021-06-22 13:52:46 +00:00
Jaco 972f15c774 Bump deps (#1019) 2021-06-22 15:45:39 +02:00
Github Actions fa11195d4a [CI Skip] release/beta 6.9.2-0
skip-checks: true
2021-06-22 13:02:56 +00:00
Jaco f437d3aae1 arrayShuffle (#1018)
* arrayShuffle

* Update packages/util/src/array/shuffle.spec.ts

* Update packages/util/src/array/shuffle.spec.ts

* Update packages/util/src/array/shuffle.ts

* Early return for length 1
2021-06-22 14:54:40 +02:00
Github Actions 04a28967c7 [CI Skip] release/stable 6.9.1
skip-checks: true
2021-06-19 04:27:32 +00:00
Jaco 47c831d672 6.9 (#1017) 2021-06-19 06:18:48 +02:00
Github Actions 3c4c2cf540 [CI Skip] release/beta 6.8.2-1
skip-checks: true
2021-06-18 14:30:59 +00:00
Jaco f383487764 Mnemonic compare test (w/ arrayRange) (#1016)
* Mnemonic compare test (w/ arrayRange)

* Update packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts

* Update packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts

* --testPathIgnorePattern toMiniSecretCmp

* patterns

* Prettify tests with .each

* with and without password
2021-06-18 16:23:50 +02:00
Github Actions d900dec667 [CI Skip] release/beta 6.8.2-0
skip-checks: true
2021-06-17 09:12:38 +00:00
Jaco 49d200fb85 Add u8aCmp (sorting determination) (#1015)
* Add u8aCmp (sorting determination)

* Update packages/util/src/u8a/cmp.ts

* Update packages/util/src/u8a/cmp.ts

* Update packages/util/src/u8a/cmp.ts

* Use u8aCmp in u8aEq
2021-06-17 11:03:02 +02:00
Github Actions 2f9d117cc6 [CI Skip] release/stable 6.8.1
skip-checks: true
2021-06-14 05:18:19 +00:00
Jaco ef44de3ebe 6.8 (#1014) 2021-06-14 07:09:38 +02:00
Github Actions 76d03bb504 [CI Skip] release/beta 6.7.2-8
skip-checks: true
2021-06-13 07:56:44 +00:00
Jaco b58543237f Sync ss58 (#1013) 2021-06-13 09:48:35 +02:00
Github Actions 4859157264 [CI Skip] release/beta 6.7.2-7
skip-checks: true
2021-06-11 10:10:49 +00:00
Jaco a5f3ce20ae Fix internal bn/* imports (#1010) 2021-06-11 12:02:24 +02:00
Github Actions 14fe54d2af [CI Skip] release/beta 6.7.2-6
skip-checks: true
2021-06-11 09:50:49 +00:00
Jaco f2d611e26d BN util export (& imports adjust) (#1009)
* BN util export (& imports adjust)

* Fix hexToBn

* Adjusts test

* Move bn export
2021-06-11 11:42:29 +02:00
Github Actions 700774b207 [CI Skip] release/beta 6.7.2-5
skip-checks: true
2021-06-08 15:12:16 +00:00
Jaco 770446c052 Prettier ignore all (#1007) 2021-06-08 17:04:13 +02:00
Github Actions f576b99c5c [CI Skip] release/beta 6.7.2-4
skip-checks: true
2021-06-08 09:26:36 +00:00
Raymond Zhong 678e888a4a Add Edgeware ledger app (#1006)
* Add Edgeware ledger app

* Add edgeware slip44
2021-06-08 11:17:39 +02:00
Github Actions 3335215866 [CI Skip] release/beta 6.7.2-3
skip-checks: true
2021-06-07 14:08:51 +00:00
Jaco Greeff d4a64e7a5a Adjust cron locks 2021-06-07 17:00:17 +03:00
Github Actions d778157d5a [CI Skip] release/beta 6.7.2-2
skip-checks: true
2021-06-07 13:56:48 +00:00
Jaco Greeff 3d0f6dafa5 lock cron 2021-06-07 16:48:16 +03:00
Github Actions 374a6ba5d6 [CI Skip] release/beta 6.7.2-1
skip-checks: true
2021-06-06 19:33:34 +00:00
Jaco Greeff eee6160060 Adjust semgrep check 2021-06-06 22:25:12 +03:00
Github Actions 5202b3febb [CI Skip] release/beta 6.7.2-0
skip-checks: true
2021-06-06 19:06:59 +00:00
Agustinus TheodorusandAgustinus Theodorus a0d48fdb48 docs: fix typo in naclSeal docs. (#1005)
Co-authored-by: Agustinus Theodorus <agustinus.theodorus@binus.edu>
2021-06-06 20:58:43 +02:00
Github Actions 831fddafd7 [CI Skip] release/stable 6.7.1
skip-checks: true
2021-06-06 16:36:58 +00:00
Jaco 278a30cd7d 6.7 (#1004) 2021-06-06 18:29:53 +02:00
Github Actions 55b65b202e [CI Skip] release/beta 6.6.2-18
skip-checks: true
2021-06-05 11:16:55 +00:00
Jaco Greeff e1b6456a14 No semgrep.yml on forks 2021-06-05 14:07:36 +03:00
Github Actions 4f285c989d [CI Skip] release/beta 6.6.2-17
skip-checks: true
2021-06-05 07:31:52 +00:00
Jaco Greeff 7cc946e19f Don't include ci in stale 2021-06-05 10:23:21 +03:00
Github Actions bc783be346 [CI Skip] release/beta 6.6.2-16
skip-checks: true
2021-06-05 06:46:34 +00:00
Jaco Greeff a156a2da82 push-master.yml adjust skip 2021-06-05 09:38:08 +03:00
Github Actions 0131915253 [CI Skip] release/beta 6.6.2-15
skip-checks: true
2021-06-05 06:28:11 +00:00
Jaco Greeff 97cb8a76f1 semgrep.yml on PR 2021-06-05 09:19:57 +03:00
Github Actions 80129ae1b7 [CI Skip] release/beta 6.6.2-14
skip-checks: true
2021-06-04 15:06:57 +00:00
Jaco Greeff 3f4ac9e8aa semgrep.yml update 2021-06-04 17:58:12 +03:00
Github Actions 8707810690 [CI Skip] release/beta 6.6.2-13
skip-checks: true
2021-06-04 10:14:02 +00:00
Jaco 88edb9103f Bump deps (#1002) 2021-06-04 12:06:53 +02:00
Github Actions 849546e97c [CI Skip] release/beta 6.6.2-12
skip-checks: true
2021-06-04 08:46:31 +00:00
Jaco Greeff d6959738db semgrep on master only 2021-06-04 11:38:37 +03:00
Github Actions f70a125b18 [CI Skip] release/beta 6.6.2-11
skip-checks: true
2021-06-04 05:44:30 +00:00
Jaco Greeff fe7f6baee4 semgrep only for non-forked 2021-06-04 08:35:59 +03:00
Github Actions 2d264b5fba [CI Skip] release/beta 6.6.2-10
skip-checks: true
2021-06-03 16:08:03 +00:00
Jaco 74bbbe02d9 Bump Ledger WebUsb (#1001) 2021-06-03 18:01:01 +02:00
Github Actions a6cd04a441 [CI Skip] release/beta 6.6.2-9
skip-checks: true
2021-06-03 15:23:37 +00:00
Jaco Greeff f7884093ca lock.yml cron 2021-06-03 18:14:49 +03:00
Github Actions e327fd3e51 [CI Skip] release/beta 6.6.2-8
skip-checks: true
2021-06-02 16:14:29 +00:00
Jaco Greeff ade6cf7ac0 fix stale.yml 2021-06-02 19:06:29 +03:00
Jaco 3404015fc3 Add WebHID transport for Ledger (#1000)
* Add WebHID transport for Ledger

* Update packages/hw-ledger-transports/package.json

* Bump yarn

* yarn.lock interval

* types for transport
2021-06-02 18:00:53 +02:00
Github Actions f91911e9f7 [CI Skip] release/beta 6.6.2-7
skip-checks: true
2021-06-02 07:13:38 +00:00
Jaco Greeff a3631278df cron workflows 2021-06-02 10:05:54 +03:00
Github Actions a0eab88134 [CI Skip] release/beta 6.6.2-6
skip-checks: true
2021-06-01 11:00:02 +00:00
Jaco 45795a5d11 Testing keyring adjustments (#997)
* Testing keyring adjustments

* Revert, add  // nosemgrep

* explicit rule ignore

* revert

* Remove Gerald test
2021-06-01 12:51:51 +02:00
Github Actions 4bb3efa25c [CI Skip] release/beta 6.6.2-5
skip-checks: true
2021-06-01 10:06:03 +00:00
Jaco Greeff 783a76932c semgrep.yml 2021-06-01 12:58:30 +03:00
Github Actions 006eb3c76e [CI Skip] release/beta 6.6.2-4
skip-checks: true
2021-06-01 06:11:05 +00:00
Jaco Greeff 2326d26de9 cron daily only 2021-06-01 09:03:55 +03:00
Github Actions 7c9f69ea20 [CI Skip] release/beta 6.6.2-3
skip-checks: true
2021-05-31 20:22:12 +00:00
Jaco Greeff 0107f7af42 cron locks 2021-05-31 23:15:43 +03:00
Github Actions 4e2e133790 [CI Skip] release/beta 6.6.2-2
skip-checks: true
2021-05-31 07:58:51 +00:00
Jaco 0d42250171 Update .123trigger 2021-05-31 09:50:41 +02:00
Github Actions 599c81cf94 [CI Skip] release/beta 6.6.2-1
skip-checks: true
2021-05-31 07:49:56 +00:00
Jaco Greeff d11e393007 Bump dev 2021-05-31 10:42:42 +03:00
Jaco c6879f779b Bump dev (#996) 2021-05-31 09:17:11 +02:00
Jaco Greeff d17b8f0bd6 lock.yml 2021-05-30 22:22:58 +03:00
Github Actions 238ba6a462 [CI Skip] release/beta 6.6.2-1
skip-checks: true
2021-05-30 09:41:12 +00:00
Jaco 566b6730bc Bump berry (#995)
* Bump berry

* Update tests
2021-05-30 11:33:46 +02:00
Github Actions 09aa042606 [CI Skip] release/beta 6.6.2-0
skip-checks: true
2021-05-29 08:27:17 +00:00
Jaco Greeff acd09c3024 Update stale.yml 2021-05-29 11:18:47 +03:00
Github Actions 0cbb06a6da [CI Skip] release/stable 6.6.1
skip-checks: true
2021-05-29 07:25:59 +00:00
Jaco Greeff 9992feaa7b Actual 6.6 bump 2021-05-29 10:18:50 +03:00
Github Actions bb968d51b0 [CI Skip] release/beta 6.5.2-6
skip-checks: true
2021-05-29 07:17:23 +00:00
Jaco b6001796d7 6.6 (#994) 2021-05-29 09:10:19 +02:00
Github Actions 8ab9387076 [CI Skip] release/beta 6.5.2-5
skip-checks: true
2021-05-28 08:48:07 +00:00
Jaco Greeff f9fd0eeda3 Update stale.yml 2021-05-28 11:39:39 +03:00
Github Actions f2cee9c33d [CI Skip] release/beta 6.5.2-4
skip-checks: true
2021-05-28 08:24:13 +00:00
Jaco a860b09638 Add stale.yml (#993) 2021-05-28 10:16:03 +02:00
Github Actions be3e83f4e3 [CI Skip] release/beta 6.5.2-3
skip-checks: true
2021-05-28 07:52:13 +00:00
Jaco 5788df3f57 Adjust HD path validation & replacement (#992) 2021-05-28 09:43:28 +02:00
Github Actions ec286a57d1 [CI Skip] release/beta 6.5.2-2
skip-checks: true
2021-05-27 05:26:39 +00:00
Jaco 655eb9f128 Align ss58 with upstream (+3 entries) (#990) 2021-05-27 07:18:23 +02:00
Github Actions 37d95fe314 [CI Skip] release/beta 6.5.2-1
skip-checks: true
2021-05-26 08:42:07 +00:00
Jaco 830a2c69d8 Bump dev (#988) 2021-05-26 10:33:36 +02:00
Github Actions ead94a4493 [CI Skip] release/beta 6.5.2-0
skip-checks: true
2021-05-25 11:33:16 +00:00
alexdniepandAlex D cff15f9027 added equilibrium slip44; added equilibrium genesis hash (#984)
* added equilibrium slip44; added equilibrium genesis hash

* added equilibrium app in ledger-polkadot package

Co-authored-by: Alex D <pr0fedt@gmail.com>
2021-05-25 13:27:02 +02:00
Github Actions 13d7dcfef5 [CI Skip] release/stable 6.5.1
skip-checks: true
2021-05-22 17:57:26 +00:00
Jaco 259bb1a0ca 6.5 (#987) 2021-05-22 19:50:55 +02:00
Github Actions d0fb629217 [CI Skip] release/beta 6.4.2-1
skip-checks: true
2021-05-22 15:30:50 +00:00
Jaco ab55c37a33 Allow hdLedger derivation with optional 25th word password (#986) 2021-05-22 17:24:37 +02:00
Github Actions 93a0a194bc [CI Skip] release/beta 6.4.2-0
skip-checks: true
2021-05-20 13:13:50 +00:00
Jaco 3df71c9943 Sync with Substrate ss58 registry (#983)
* Sync with Substrate ss58 registry

* Bump deps
2021-05-20 15:07:29 +02:00
Github Actions 4d4e3988ab [CI Skip] release/stable 6.4.1
skip-checks: true
2021-05-15 08:25:20 +00:00
Jaco 1bfabae65b 6.4 (#981) 2021-05-15 10:18:17 +02:00
Github Actions eb08291de2 [CI Skip] release/beta 6.3.2-13
skip-checks: true
2021-05-12 12:31:23 +00:00
Jaco d63d92e488 Explicit deprecation logging (#979)
* Explicit deprecation logging

* Update CHANGELOG.md
2021-05-12 14:25:01 +02:00
Github Actions bd047063ef [CI Skip] release/beta 6.3.2-12
skip-checks: true
2021-05-11 14:39:44 +00:00
Jaco d725bf21ae Bump deps (#978) 2021-05-11 16:33:13 +02:00
Github Actions f7699edaaf [CI Skip] release/beta 6.3.2-11
skip-checks: true
2021-05-11 14:08:41 +00:00
Jakub Pánik 47501aee7a HydraDX Snakenet Gen3-1 (#977) 2021-05-11 16:02:36 +02:00
Github Actions e4f526bdda [CI Skip] release/beta 6.3.2-10
skip-checks: true
2021-05-11 07:08:11 +00:00
Jaco Greeff 29bf23cd18 Bump CHANGELOG 2021-05-11 10:02:23 +03:00
Github Actions 39d6da414d [CI Skip] release/beta 6.3.2-9
skip-checks: true
2021-05-09 10:55:56 +00:00
Jaco e7233de48f Bump deps (#976) 2021-05-09 12:50:29 +02:00
Github Actions 255d6ef66c [CI Skip] release/beta 6.3.2-8
skip-checks: true
2021-05-09 09:47:32 +00:00
Jaco b41e27d7c3 Bump deps (#975) 2021-05-09 11:41:14 +02:00
Github Actions e3c858ac01 [CI Skip] release/beta 6.3.2-7
skip-checks: true
2021-05-09 09:38:48 +00:00
Jakub Pánik 014075c313 Add HydraDX Snakenet Gen3 (#974) 2021-05-09 11:32:32 +02:00
Github Actions eb3e77c572 [CI Skip] release/beta 6.3.2-6
skip-checks: true
2021-05-07 12:07:26 +00:00
Antoine EstienneandJaco 512ae89fea Jlm update for ethereum pair addition (#969)
* added gerald test address

* allow adding 20 address in createPair

* lint

* move logic to eth specific function

* fix typo

* Update packages/keyring/src/pair/index.ts

Co-authored-by: Jaco <jacogr@gmail.com>

* re establish right encoding

* Update packages/keyring/src/pair/index.ts

Co-authored-by: Jaco <jacogr@gmail.com>

* Update packages/keyring/src/pair/index.ts

Co-authored-by: Jaco <jacogr@gmail.com>

Co-authored-by: Jaco <jacogr@gmail.com>
2021-05-07 14:01:39 +02:00
Github Actions 7f57d05281 [CI Skip] release/beta 6.3.2-5
skip-checks: true
2021-05-07 05:34:33 +00:00
Jaco 5892f70c83 Align ss58 (#972) 2021-05-07 07:28:36 +02:00
Github Actions 699f775141 [CI Skip] release/beta 6.3.2-4
skip-checks: true
2021-05-07 05:05:11 +00:00
Jaco a09e06898f Bump deps (#971)
* Bump deps

* Latest dev
2021-05-07 06:58:48 +02:00
Github Actions 565314ff5f [CI Skip] release/beta 6.3.2-3
skip-checks: true
2021-05-06 06:13:15 +00:00
Jaco bd669f333f Remove ss58 27 prefix (#968) 2021-05-06 08:05:52 +02:00
Github Actions 829d8bc985 [CI Skip] release/beta 6.3.2-2
skip-checks: true
2021-04-30 07:02:29 +00:00
Jaco 218dba5623 Verification test for keyring 2-byte ss58 (#966) 2021-04-30 08:56:39 +02:00
Github Actions b8bf2fed0d [CI Skip] release/beta 6.3.2-1
skip-checks: true
2021-04-30 05:59:33 +00:00
Jaco d505dc1072 Bump deps (#964) 2021-04-30 07:53:27 +02:00
Github Actions 20148b05c4 [CI Skip] release/beta 6.3.2-0
skip-checks: true
2021-04-30 05:32:34 +00:00
Jaco 2516309b93 Add additional 2-byte ss58 tests (verification) (#963) 2021-04-30 07:26:58 +02:00
Github Actions 92d3a2e208 [CI Skip] release/stable 6.3.1
skip-checks: true
2021-04-25 04:09:00 +00:00
Jaco 286d7a036e 6.3 (#961) 2021-04-25 06:02:58 +02:00
Github Actions 4556822a8a [CI Skip] release/beta 6.2.2-8
skip-checks: true
2021-04-24 07:39:45 +00:00
Jaco be227926c8 Add explict engines field (#960) 2021-04-24 09:33:15 +02:00
Github Actions 42626a780c [CI Skip] release/beta 6.2.2-7
skip-checks: true
2021-04-22 12:45:01 +00:00
Jaco afd8a9610f Don't modiy original value on encoding (#958) 2021-04-22 14:39:39 +02:00
Github Actions 393334409f [CI Skip] release/beta 6.2.2-6
skip-checks: true
2021-04-22 11:47:35 +00:00
Jaco 0fb52a929d BN manipulation via in-place shifts (as applicable) (#955)
* BN manipulation via in-place shifts (as applicable)

* Adjust tests
2021-04-22 13:42:20 +02:00
Github Actions 50b10e214c [CI Skip] release/beta 6.2.2-5
skip-checks: true
2021-04-22 11:18:57 +00:00
Jaco bbadfbebfa assert cleanups (#957) 2021-04-22 13:13:41 +02:00
Github Actions a52a6253b5 [CI Skip] release/beta 6.2.2-4
skip-checks: true
2021-04-22 10:20:54 +00:00
Jaco 4ca010cc99 Add stringify util (#956)
* Add stringify util

* stringify space param

* Update packages/util/src/stringify.ts
2021-04-22 12:14:31 +02:00
Github Actions a136d938df [CI Skip] release/beta 6.2.2-3
skip-checks: true
2021-04-22 08:30:15 +00:00
Jaco 132ba0128d Type checking on u8aToU8a before invalid return (#954)
* Type checking on u8aToU8a before invalid return

* Remove extra assignment

* CHANGELOG

* Correct expectation
2021-04-22 10:25:22 +02:00
Github Actions 6b705a9838 [CI Skip] release/beta 6.2.2-2
skip-checks: true
2021-04-21 10:57:23 +00:00
Jaco f3381b0aae Use globalThis as available (#953) 2021-04-21 12:52:10 +02:00
Github Actions ba086159ad [CI Skip] release/beta 6.2.2-1
skip-checks: true
2021-04-21 08:36:18 +00:00
Jaco 3a98323e8b Minor readability improvements (#952)
* Minor readability improvements

* trigger

* Additional

* Additional
2021-04-21 10:31:28 +02:00
Github Actions 1de30914c2 [CI Skip] release/beta 6.2.2-0
skip-checks: true
2021-04-21 07:19:42 +00:00
Jaco 984bb7c04f Bump deps (#951) 2021-04-21 09:13:31 +02:00
Github Actions 6140b7f799 [CI Skip] release/stable 6.2.1
skip-checks: true
2021-04-18 05:24:59 +00:00
Jaco 3dc98a3790 6.2.1 (#948) 2021-04-18 07:19:31 +02:00
Github Actions ab7345f017 [CI Skip] release/beta 6.1.2-3
skip-checks: true
2021-04-15 09:33:57 +00:00
Jakub PánikandJaco ef57c7fea4 Update defaults.ts with HydraDX re-genesis hash (#947)
* Update defaults.ts

Re-genesis hash of HydraDX

* Update packages/networks/src/defaults.ts

Co-authored-by: Jaco <jacogr@gmail.com>

Co-authored-by: Jaco <jacogr@gmail.com>
2021-04-15 12:28:40 +03:00
Github Actions efb013db4a [CI Skip] release/beta 6.1.2-2
skip-checks: true
2021-04-14 19:32:03 +00:00
Jaco cd1c0df3cd isAddress/validateAddress functions (#946) 2021-04-14 21:25:58 +02:00
Github Actions 9d08827ccf [CI Skip] release/beta 6.1.2-1
skip-checks: true
2021-04-14 12:02:56 +00:00
Jaco 5083de2941 Sync ss58 with Substrate registry (#945)
* Sync ss58 with Substrate registry

* Update template
2021-04-14 13:56:43 +02:00
Github Actions b266d9f742 [CI Skip] release/beta 6.1.2-0
skip-checks: true
2021-04-13 11:29:44 +00:00
Jaco ea187707c8 Check for networks vs hw-ledger discrepancies (#943)
* Check for networks vs hw-ledger discrepancies

* Rename ledgerApps

* Bump dev

* type imports
2021-04-13 13:23:53 +02:00
Github Actions 1b334d570e [CI Skip] release/stable 6.1.1
skip-checks: true
2021-04-11 12:48:13 +00:00
Jaco Greeff eb0537471e 6.1.1 (#942) 2021-04-11 14:43:33 +02:00
Github Actions fa2c949eda [CI Skip] release/beta 6.0.6-8
skip-checks: true
2021-04-11 12:03:00 +00:00
Lezek123 f5fd07d6e7 logger - wildcard include/exclude with DEBUG env (#932) 2021-04-11 13:57:13 +02:00
Github Actions be1a2ebf8c [CI Skip] release/beta 6.0.6-7
skip-checks: true
2021-04-11 08:54:16 +00:00
Jaco Greeff 31cd173b0d Auto-create network list based on Substrate registry (#939)
* Auto-create network list based on Substrate registry

* Extract all extensions

* build networks from upstream registry

* Build list

* Cleanups

* Extra tests against overrides

* Simplify all expansion

* Cleanups

* Updates

* CC overrides
2021-04-11 10:48:27 +02:00
Github Actions 5408064ff5 [CI Skip] release/beta 6.0.6-6
skip-checks: true
2021-04-11 08:28:44 +00:00
amphineko 482aee3a1a chore: fix typo in versionDetect messages (#941) 2021-04-11 10:22:51 +02:00
Github Actions 95f3ac667c [CI Skip] release/beta 6.0.6-5
skip-checks: true
2021-04-09 04:54:05 +00:00
Adam Dossa 1e0a7ba0d6 Update genesis hash for Polymesh network (#937) 2021-04-09 06:48:12 +02:00
Github Actions 57865e53dd [CI Skip] release/beta 6.0.6-4
skip-checks: true
2021-04-08 08:22:41 +00:00
Jaco Greeff d6617f33dd Check for prefix dupes (#936)
* Check for prefix dupes

* Bump deps
2021-04-08 10:11:18 +02:00
Github Actions 1e778b0cc4 [CI Skip] release/beta 6.0.6-3
skip-checks: true
2021-04-01 07:28:18 +00:00
Jaco Greeff 6ceb58e5d3 Add ss58 252 (#934)
* Add ss58 252

* Bump deps
2021-04-01 09:23:02 +02:00
Github Actions e7e8244323 [CI Skip] release/beta 6.0.6-2
skip-checks: true
2021-03-22 21:11:13 +00:00
Jaco Greeff 03a3cabe41 Bump deps (#930) 2021-03-22 22:05:16 +01:00
Github Actions 480002c5f1 [CI Skip] release/beta 6.0.6-1
skip-checks: true
2021-03-17 08:03:29 +00:00
Jaco Greeff 0126584a7d Update .123trigger 2021-03-17 08:57:05 +01:00
Github Actions 3f76e4a0dd [CI Skip] release/beta 6.0.6-0
skip-checks: true
2021-03-17 07:16:49 +00:00
Jaco Greeff 890cf5cbfd Update ss58 (#928)
Closes https://github.com/polkadot-js/common/issues/927
2021-03-17 08:10:49 +01:00
Github Actions a951e844bf [CI Skip] release/stable 6.0.5
skip-checks: true
2021-03-08 14:03:07 +00:00
Jaco Greeff 568815bf4a 6.0.5 (#926) 2021-03-08 14:57:53 +01:00
Github Actions f18293ffe9 [CI Skip] release/stable 6.0.4
skip-checks: true
2021-03-07 15:08:24 +00:00
Jaco Greeff 003dc8d247 6.0.4 (#924) 2021-03-07 16:02:32 +01:00
Github Actions f259de2679 [CI Skip] release/beta 6.0.4-0
skip-checks: true
2021-03-07 11:12:14 +00:00
Yuri b0f783f54b Extra check for process for browser bundles (#923) 2021-03-07 12:05:54 +01:00
Github Actions 4fbdbcf8c5 [CI Skip] release/stable 6.0.3
skip-checks: true
2021-03-05 22:18:23 +00:00
Jaco Greeff ac5c993b27 6.0.3 (cjs import indirection) (#922)
* 6.0.3 (cjs import indirection)

* Bump deps

* Apply suggestions from code review
2021-03-05 23:11:54 +01:00
223 changed files with 7013 additions and 5150 deletions
+8 -3
View File
@@ -1,5 +1,4 @@
6
8
2.6.2
2.12.2
5.2.2
@@ -11,5 +10,11 @@
5.6.2
5.6.3
5.9.2
6.0.2
6.0.3
6.0.4
6.0.5
6.0.2
7.0.2
7.0.3
7.1.2
+1 -1
View File
@@ -1,5 +1,5 @@
exclude_patterns:
- "**/*.spec.js"
- "**/*.spec.ts"
- "packages/networks/src/index.ts"
- "packages/networks/src/substrate.ts"
- "packages/util/src/is/utf8.ts"
+2 -2
View File
@@ -5,6 +5,6 @@ labels: ['ci', '@networks']
cc @polkadot-js/notifications
Discrepancies detected between https://github.com/paritytech/substrate/blob/master/ss58-registry.json and https://github.com/polkadot-js/common/blob/master/packages/networks/src/index.ts
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/substrate.ts
Check the nightly cron output or run `yarn networks:crosscheck` locally. The output as found from the test includes:
Check the nightly cron output (or via `yarn networks:crosscheck` locally) and run `yarn networks:sync` to update. The output as found from the test includes:
+23
View File
@@ -0,0 +1,23 @@
name: 'Lock Threads'
on:
schedule:
- cron: '30 1/2 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ secrets.GH_PAT_BOT }}
issue-lock-inactive-days: '7'
issue-lock-comment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue
if you think you have a related problem or query.
pr-lock-inactive-days: '2'
pr-lock-comment: >
This pull request has been automatically locked since there
has not been any recent activity after it was closed.
Please open a new issue for related bugs.
+1 -8
View File
@@ -6,11 +6,11 @@ on:
jobs:
master:
if: "! startsWith(github.event.head_commit.message, '[CI Skip]')"
strategy:
matrix:
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@v2
@@ -25,10 +25,3 @@ jobs:
run: |
yarn install --immutable | grep -v 'YN0013'
yarn ${{ matrix.step }}
dummy:
runs-on: ubuntu-latest
steps:
- name: dummy
run: |
echo "Dummy skip step"
+18
View File
@@ -0,0 +1,18 @@
name: Semgrep
on:
pull_request: {}
push:
branches:
- master
jobs:
check:
if: "! startsWith(github.event.head_commit.message, '[CI Skip]') && (!github.event.pull_request || github.event.pull_request.head.repo.full_name == github.repository)"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: returntocorp/semgrep-action@v1
with:
auditOn: push
publishToken: ${{ secrets.SEMGREP_APP_TOKEN }}
publishDeployment: 1395
+17
View File
@@ -0,0 +1,17 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 2/2 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GH_PAT_BOT }}
stale-issue-message: 'This issue has been open for 21 days with no activity and is not labelled as an enhancement. It will be closed in 7 days.'
stale-issue-label: 'stale'
exempt-issue-labels: '-size-l,-size-m,-size-s,-size-xl,-size-xs,[bug],ci'
days-before-stale: 21
days-before-close: 7
+3
View File
@@ -0,0 +1,3 @@
build
coverage
packages
+4
View File
@@ -0,0 +1,4 @@
// Copyright 2017-2021 @polkadot/dev authors & contributors
// SPDX-License-Identifier: Apache-2.0
module.exports = require('@polkadot/dev/config/prettier.cjs');
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
+631
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -10,4 +10,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-version.cjs
spec: "@yarnpkg/plugin-version"
yarnPath: .yarn/releases/yarn-2.4.1.cjs
yarnPath: .yarn/releases/yarn-3.0.1.cjs
+214
View File
@@ -1,5 +1,219 @@
# CHANGELOG
## 7.2.1 Aug 15, 2021
Contributed:
- Always use `bigint` type to indicate instance (Thanks to https://github.com/ntduan)
Changes:
- Added `u8aEmpty` helper check, all 0 or no length
- Cleanup additional circular dependencies detected by rollup
## 7.1.2 Aug 11, 2021
Changes:
- Ensure `@polkadot/util-crypto` doesn't re-export `packageInfo` from `@polkadot/networks`
- Minor TS style cleanups in `@polkadot/x-bundle`
## 7.1.1 Aug 2, 2021
Contributed:
- Add keyring encrypt/decrypt functionality (Thanks to https://github.com/RoyTimes)
Changes:
- Bump Ledger libraries to latest versions
## 7.0.3 Jul 26, 2021
Changes:
- Sync with upstream Substrate ss58 registry
- Bump Ledger libraries to latest versions
## 7.0.2 Jul 19, 2021
Changes:
- Added `isCompact` utility for check on compact-like types
- Sync with upstream Substrate ss58 registry
## 7.0.1 Jul 11, 2021
- **Breaking change** The `@polkadot/x-rxjs` package has been removed. In `rxjs` 7.2.0 the compatibility issues at the base layer has been solved.
- **Breaking change** The named exports in `@polkadot/networks` has been changed
Contributed:
- Add Ledger config for Centrifuge (Thanks to https://github.com/mikiquantum)
Changes:
- Adjust `@polkadot/networks` to fully-descriptive exports
- Remove `@polkadot/x-rxjs`, direct import from `rxjs >= 7.2.0` required
- Allow building as a completely stand-alone browser bundle (experimental)
- Sync with upstream Substrate ss58 registry
## 6.11.1 Jul 5, 2021
Changes:
- Cleanup unneeded dependencies for `@polkadot/x-global`
- Sync with upstream Substrate ss58 registry
- Bump Zondax dependencies (Statemine slip44 fix)
## 6.10.1 Jun 26, 2021
Contributed:
- Add Karura genesisHash (Thanks to https://github.com/ntduan)
Changes:
- `isHex(value)` will now check for only `string` types (No `String` classes)
- Added `arrayShuffle(array)` to shuffle an array into a new output
- Added Statemine Ledger app information
- Simplify tests to use `{describe|it}.each` where applicable
- Sync with upstream Substrate ss58 registry
## 6.9.1 Jun 19, 2021
Changes:
- Added `u8aCmp(a, b)` to do sorting compares
- Added `arrayRange(size, startAt = 0)` to create a range of numbers
- Added extensive mnemonic compare test (optional, skipped)
## 6.8.1 Jun 14, 2021
Contributed:
- Add Ledger support for Edgeware (Thanks to https://github.com/raykyri)
- Fix `naclSeal` doc types (Thanks to https://github.com/agustinustheo)
Changes:
- Export `BN` in `@polkadot/util`
- Sync with upstream Substrate ss58 registry
## 6.7.1 Jun 6, 2021
Changes:
- Add WebHID transport for Ledger
- Update to latest Ledger transport packages
- Remove old `Gerald` key for Moonbeam
- Cleanup testing keyring semgrep recommendations
## 6.6.1 May 29, 2021
Changes:
- Adjust HD path validation & replacement
- Sync with Substrate ss58 registry
## 6.5.1 May 22, 2021
Changes:
- Allow hdLedger derivation with optional 25th word password
- Sync with Substrate ss58 registry
## 6.4.1 May 15, 2021
Contributed:
- Update genesis for HydraDx gen-3 (Thanks to https://github.com/jak-pan)
- Allow Ethereum pair in keyring addAddress (Thanks to https://github.com/joelamouche)
Changes:
- Added additional double-byte ss58 tests
- Aligned ss58 registry with Substrate
- Add explicit log for deprecation of `setSS58Format`
## 6.3.1 Apr 25, 2021
Changes:
- Added `stringify` util to correctly handle `JSON.stringify` with `BigInt` values
- Additional input asserts for non-convertible values in `u8aToU8a`
- Adapt `@polkadot/x-global` to return `globalThis` as available
- Minor readability cleanups
- BN manipulation via in-place shifts (as applicable)
- Add explicit `engines` config to `package.json`
## 6.2.1 Apr 18, 2021
Contributed:
- Added HydraDx genesis (Thanks to https://github.com/jak-pan)
Changes:
- Add `isAddress` and `validateAddress` functions (the latter will throw if invalid)
- Check `@polkadot/hw-ledger` against `@polkadot/networks` for discrepancies (test-only)
- Align ss58 registry with upstream Substrate
## 6.1.1 Apr 11, 2021
Contributed:
- Adjust Polymath genesis in `@polkadot/networks` (Thanks to https://github.com/adamdossa)
- Adjust `@polkadot/util` logger for +/-/* compat (Thanks to https://github.com/Lezek123)
- Fix typo in `@polkadot/util` detect messaging (Thanks to https://github.com/amphineko)
Changes:
- Remove `@polkadot/networks` code duplication, manages data via script from upstream
- Align ss58 registry with upstream Substrate
## 6.0.5 Mar 8, 2021
Changes:
- Fix for `@polkadot/x-rxjs` in Node CJS environments (no Node-specific import)
## 6.0.4 Mar 7, 2021
Contributed:
- Enhance check for global process existence (Thanks to https://github.com/Yuripetusko)
Changes:
- Dedupe & optimize logger process.env checks
## 6.0.3 Mar 5, 2021
Changes:
- Add import indirection for both CJS & ESM (where generated source file is commonjs)
## 6.0.2 Mar 5, 2021
Changes:
+13 -8
View File
@@ -7,23 +7,28 @@
"packages/*"
],
"resolutions": {
"typescript": "^4.2.2"
"typescript": "^4.3.5"
},
"scripts": {
"build": "polkadot-dev-build-ts",
"build:release": "polkadot-ci-ghact-build",
"build:rollup": "polkadot-exec-rollup --config",
"lint": "polkadot-dev-run-lint",
"clean": "polkadot-dev-clean-build",
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
"networks:sync": "node packages/networks/scripts/fromSubstrate.mjs",
"postinstall": "polkadot-dev-yarn-only",
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck",
"test:one": "polkadot-dev-run-test"
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
"test:mnemonicCmp": "polkadot-dev-run-test packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts",
"test:one": "polkadot-dev-run-test --runInBand"
},
"devDependencies": {
"@babel/core": "^7.13.8",
"@polkadot/dev": "^0.62.5",
"@polkadot/ts": "^0.3.61",
"@types/jest": "^26.0.20"
"@babel/core": "^7.15.0",
"@polkadot/dev": "^0.62.59",
"@polkadot/ts": "^0.4.4",
"@types/ed2curve": "^0.2.2",
"@types/jest": "^26.0.24"
},
"version": "6.0.2"
"version": "7.2.1",
"packageManager": "yarn@3.0.1"
}
+9 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/hw-ledger-transports",
"version": "6.0.2",
"version": "7.2.1",
"type": "module",
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -11,15 +11,16 @@
"browser": "browser.js",
"react-native": "react-native.js",
"sideEffects": false,
"dependencies": {
"@babel/runtime": "^7.13.9",
"@ledgerhq/hw-transport-webusb": "^5.45.0"
"engines": {
"node": ">=14.0.0"
},
"devDependencies": {
"@types/ledgerhq__hw-transport-node-hid": "^4.22.2",
"@types/ledgerhq__hw-transport-webusb": "^4.70.1"
"dependencies": {
"@babel/runtime": "^7.15.3",
"@ledgerhq/hw-transport": "^6.3.0",
"@ledgerhq/hw-transport-webhid": "^6.4.1",
"@ledgerhq/hw-transport-webusb": "^6.3.0"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid-singleton": "^5.45.0"
"@ledgerhq/hw-transport-node-hid-singleton": "^6.3.0"
}
}
+8 -2
View File
@@ -4,7 +4,8 @@
import type Transport from '@ledgerhq/hw-transport';
import type { TransportDef } from './types';
import LedgerWebUSB from '@ledgerhq/hw-transport-webusb';
import LedgerWebHid from '@ledgerhq/hw-transport-webhid';
import LedgerWebUsb from '@ledgerhq/hw-transport-webusb';
export { packageInfo } from './packageInfo';
@@ -18,7 +19,12 @@ export const transports: TransportDef[] = [
// },
{
create: (): Promise<Transport> =>
LedgerWebUSB.create(),
LedgerWebUsb.create(),
type: 'webusb'
},
{
create: (): Promise<Transport> =>
LedgerWebHid.create(),
type: 'hid'
}
];
-15
View File
@@ -1,15 +0,0 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
declare module '@ledgerhq/hw-transport-node-hid-noevents' {
import Transport from '@ledgerhq/hw-transport';
export default class TransportNodeHidNoEvents extends Transport<string> {}
export function getDevices(): Array<unknown>
}
declare module '@ledgerhq/hw-transport-node-hid-singleton' {
import TransportNodeHidNoEvents from '@ledgerhq/hw-transport-node-hid-noevents';
export default class TransportNodeHid extends TransportNodeHidNoEvents { }
}
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '7.2.1' };
+8 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/hw-ledger",
"version": "6.0.2",
"version": "7.2.1",
"type": "module",
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -12,10 +12,13 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/hw-ledger-transports": "6.0.2",
"@polkadot/util": "^6.0.2",
"@zondax/ledger-polkadot": "^0.13.4"
"@babel/runtime": "^7.15.3",
"@polkadot/hw-ledger-transports": "7.2.1",
"@polkadot/util": "7.2.1",
"@zondax/ledger-substrate": "^0.17.3"
}
}
+103
View File
@@ -0,0 +1,103 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { ResponseBase, SubstrateApp } from '@zondax/ledger-substrate';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
import { transports } from '@polkadot/hw-ledger-transports';
import { assert, u8aToBuffer } from '@polkadot/util';
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants';
import { ledgerApps } from './defaults';
export { packageInfo } from './packageInfo';
type Chain = keyof typeof ledgerApps;
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
// - Promises return errors (instead of wrapper errors)
export class Ledger {
#app: SubstrateApp | null = null;
#chain: Chain;
#transport: LedgerTypes;
constructor (transport: LedgerTypes, chain: Chain) {
// u2f is deprecated
assert(['hid', 'webusb'].includes(transport), () => `Unsupported transport ${transport}`);
assert(Object.keys(ledgerApps).includes(chain), () => `Unsupported chain ${chain}`);
this.#chain = chain;
this.#transport = transport;
}
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
const { address, pubKey } = await this.#wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
return {
address,
publicKey: `0x${pubKey}`
};
});
}
public async getVersion (): Promise<LedgerVersion> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await this.#wrapError(app.getVersion());
return {
isLocked,
isTestMode,
version: [major, minor, patch]
};
});
}
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
const buffer = u8aToBuffer(message);
const { signature } = await this.#wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
return {
signature: `0x${signature.toString('hex')}`
};
});
}
#getApp = async (): Promise<SubstrateApp> => {
if (!this.#app) {
const def = transports.find(({ type }) => type === this.#transport);
assert(def, () => `Unable to find a transport for ${this.#transport}`);
const transport = await def.create();
this.#app = ledgerApps[this.#chain](transport);
}
return this.#app;
};
#withApp = async <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> => {
try {
const app = await this.#getApp();
return await fn(app);
} catch (error) {
this.#app = null;
throw error;
}
};
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
const result = await promise;
assert(result.return_code === LEDGER_SUCCESS_CODE, () => result.error_message);
return result;
};
}
+10
View File
@@ -0,0 +1,10 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
export const LEDGER_DEFAULT_CHANGE = 0x80000000;
export const LEDGER_DEFAULT_INDEX = 0x80000000;
export const LEDGER_SUCCESS_CODE = 0x9000;
+24
View File
@@ -0,0 +1,24 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { knownLedger } from '@polkadot/networks/defaults';
import { ledgerApps } from './defaults';
describe('defaults', (): void => {
it('has entries for each of the apps (hwledger -> networks)', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!ledgerApps[network]
)
).toEqual([]);
});
it('has entries for each of the apps (networks -> hwledger)', (): void => {
expect(
Object.keys(ledgerApps).filter((network) =>
!knownLedger[network]
)
).toEqual([]);
});
});
+19
View File
@@ -0,0 +1,19 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type Transport from '@ledgerhq/hw-transport';
import type { SubstrateApp } from '@zondax/ledger-substrate';
import { newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newKusamaApp, newPolkadotApp, newPolymeshApp, newStatemineApp } from '@zondax/ledger-substrate';
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults.ts
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
centrifuge: newCentrifugeApp,
'dock-mainnet': newDockApp,
edgeware: newEdgewareApp,
equilibrium: newEquilibriumApp,
kusama: newKusamaApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp,
statemine: newStatemineApp
};
+1 -117
View File
@@ -3,120 +3,4 @@
import './detectPackage';
import type Transport from '@ledgerhq/hw-transport';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
import { newDockApp, newKusamaApp, newPolkadotApp, newPolymeshApp, ResponseBase, SubstrateApp } from '@zondax/ledger-polkadot';
import { transports } from '@polkadot/hw-ledger-transports';
import { assert, u8aToBuffer } from '@polkadot/util';
export { packageInfo } from './packageInfo';
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
export const LEDGER_DEFAULT_CHANGE = 0x80000000;
export const LEDGER_DEFAULT_INDEX = 0x80000000;
const SUCCESS_CODE = 0x9000;
// These match up with the network keys in the @polkadot/networks package
// (which is turn aligns with the substrate/ss58-registry.json as the single
// source of truth)
const APPS: Record<string, (transport: Transport) => SubstrateApp> = {
dock: newDockApp,
kusama: newKusamaApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp
};
type Chain = keyof typeof APPS;
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
// - Promises return errors (instead of wrapper errors)
export class Ledger {
#app: SubstrateApp | null = null;
#chain: Chain;
#transport: LedgerTypes;
constructor (transport: LedgerTypes, chain: Chain) {
// u2f is deprecated
assert(['hid', 'webusb'].includes(transport), `Unsupported transport ${transport}`);
assert(Object.keys(APPS).includes(chain), `Unsupported chain ${chain}`);
this.#chain = chain;
this.#transport = transport;
}
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
const { address, pubKey } = await this.#wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
return {
address,
publicKey: `0x${pubKey}`
};
});
}
public async getVersion (): Promise<LedgerVersion> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await this.#wrapError(app.getVersion());
return {
isLocked,
isTestMode,
version: [major, minor, patch]
};
});
}
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
const buffer = u8aToBuffer(message);
const { signature } = await this.#wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
return {
signature: `0x${signature.toString('hex')}`
};
});
}
#getApp = async (): Promise<SubstrateApp> => {
if (!this.#app) {
const def = transports.find(({ type }) => type === this.#transport);
assert(def, `Unable to find a transport for ${this.#transport}`);
const transport = await def.create();
this.#app = APPS[this.#chain](transport);
}
return this.#app;
};
#withApp = async <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> => {
try {
const app = await this.#getApp();
return await fn(app);
} catch (error) {
this.#app = null;
throw error;
}
};
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
const result = await promise;
assert(result.return_code === SUCCESS_CODE, result.error_message);
return result;
};
}
export * from './bundle';
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger', version: '7.2.1' };
+9 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/keyring",
"version": "6.0.2",
"version": "7.2.1",
"type": "module",
"description": "Keyring management",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -12,16 +12,19 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"repository": "github:polkadot-js/common",
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/util": "6.0.2",
"@polkadot/util-crypto": "6.0.2"
"@babel/runtime": "^7.15.3",
"@polkadot/util": "7.2.1",
"@polkadot/util-crypto": "7.2.1"
},
"peerDependencies": {
"@polkadot/util": "6.0.2",
"@polkadot/util-crypto": "6.0.2"
"@polkadot/util": "7.2.1",
"@polkadot/util-crypto": "7.2.1"
}
}
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { Keyring } from './keyring';
export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
export * from './defaults';
export { createPair } from './pair';
export { packageInfo } from './packageInfo';
export { createTestKeyring } from './testing';
export { createTestPairs } from './testingPairs';
export { Keyring };
+11 -2
View File
@@ -121,6 +121,14 @@ describe('keypair', (): void => {
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
});
it('creates via dev seed (2-byte encoding)', (): void => {
keyring.setSS58Format(252);
expect(
keyring.addFromUri('//Alice').address
).toEqual('xw8P6urbSAronL3zZFB7dg8p7LLSgKCUFDUgjohnf1iP434ic');
});
it('adds the pair', (): void => {
expect(
keyring.addFromSeed(seedTwo, {}).publicKey
@@ -311,6 +319,7 @@ describe('keypair', (): void => {
const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy' + '/m/44\'/60\'/0\'/0/0';
const PRIV_KEY_ONE = '0x070dc3117300011918e26b02176945cc15c3d548cf49fd8418d97f93af699e46';
const ETH_ADDRESS_ONE = '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d';
const ETH_ADDRESS_TWO = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
let keyring: Keyring;
@@ -388,13 +397,13 @@ describe('keypair', (): void => {
);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.address).toEqual(ETH_ADDRESS_TWO);
pair.decodePkcs8('password');
expect(pair.isLocked).toBe(false);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toBe('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.address).toBe(ETH_ADDRESS_TWO);
});
it('allows for signing/verification', (): void => {
+2 -6
View File
@@ -3,12 +3,8 @@
import './detectPackage';
import { Keyring } from './keyring';
import { Keyring } from './bundle';
export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
export { packageInfo } from './packageInfo';
export * from './bundle';
export default Keyring;
export { Keyring };
+3 -3
View File
@@ -47,7 +47,7 @@ export class Keyring implements KeyringInstance {
constructor (options: KeyringOptions = {}) {
options.type = options.type || 'ed25519';
assert(options && ['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type}`);
assert(['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), () => `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
this.#pairs = new Pairs();
this.#ss58 = options.ss58Format;
@@ -86,7 +86,7 @@ export class Keyring implements KeyringInstance {
/**
* @name addFromAddress
* @summary Stores an account, given an account address, as a Key/Value (public key, pair) in Keyring Pair Dictionary
* @description Allows user to explicitely provide separate inputs including account address or public key, and optionally
* @description Allows user to explicitly provide separate inputs including account address or public key, and optionally
* the associated account metadata, and the default encoded value as arguments (that may be obtained from the json file
* of an account backup), and then generates a keyring pair from them that it passes to
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
@@ -168,7 +168,7 @@ export class Keyring implements KeyringInstance {
? [type]
: type;
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), `Unknown crypto type ${cryptoType}`);
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), () => `Unknown crypto type ${cryptoType}`);
// Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs
const publicKey = isHex(address)
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/keyring', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/keyring', version: '7.2.1' };
+117 -6
View File
@@ -10,12 +10,18 @@ import { createPair } from '.';
const keyring = createTestPairs({ type: 'ed25519' }, false);
const TEST_ADDRESS = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
describe('pair', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
});
const SIGNATURE = new Uint8Array([80, 191, 198, 147, 225, 207, 75, 88, 126, 39, 129, 109, 191, 38, 72, 181, 75, 254, 81, 143, 244, 79, 237, 38, 236, 141, 28, 252, 134, 26, 169, 234, 79, 33, 153, 158, 151, 34, 175, 188, 235, 20, 35, 135, 83, 120, 139, 211, 233, 130, 1, 208, 201, 215, 73, 80, 56, 98, 185, 196, 11, 8, 193, 14]);
const ENCRYPTED = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 59, 53, 85, 227, 40, 107, 48, 234, 198, 238, 157, 238, 224, 235, 179, 75, 153, 241, 142, 254]);
// the last byte is changed from 254 -> 253
const ENCRYPTED_CHANGED = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 59, 53, 85, 227, 40, 107, 48, 234, 198, 238, 157, 238, 224, 235, 179, 75, 153, 241, 142, 253]);
it('has a publicKey', (): void => {
expect(
@@ -51,7 +57,7 @@ describe('pair', (): void => {
it('fails a correctly signed message (signer changed)', (): void => {
expect(
keyring.alice.verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]),
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
SIGNATURE,
keyring.bob.publicKey
)
@@ -92,6 +98,93 @@ describe('pair', (): void => {
).toBe(false);
});
it('allows encrypting', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.alice.encryptMessage(
message,
keyring.bob.publicKey,
new Uint8Array(24)
)
).toEqual(ENCRYPTED);
});
it('validates a correctly encrypted message', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.bob.decryptMessage(
ENCRYPTED,
keyring.alice.publicKey
)
).toEqual(message);
});
it('fails a correctly encrypted message (message changed)', (): void => {
expect(
keyring.bob.decryptMessage(
ENCRYPTED_CHANGED,
keyring.alice.publicKey
)
).toEqual(null);
});
it('fails a correctly encrypted message (sender changed)', (): void => {
expect(
keyring.bob.decryptMessage(
ENCRYPTED,
keyring.charlie.publicKey
)
).toEqual(null);
});
it('fails a correctly encrypted message (receiver changed)', (): void => {
expect(
keyring.charlie.decryptMessage(
ENCRYPTED,
keyring.alice.publicKey
)
).toEqual(null);
});
it('validates encryption between ed25519 & sr25519 key pairs', (): void => {
const PASS = 'testing';
const encodedA = keyring.alice.encodePkcs8(PASS);
const encodedB = keyring.bob.encodePkcs8(PASS);
const pairA = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.alice.publicKey });
const pairB = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.bob.publicKey });
pairA.decodePkcs8(PASS, encodedA);
pairB.decodePkcs8(PASS, encodedB);
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
// alice-sr25519 -> bob-ed25519
const encrypted1 = pairA.encryptMessage(message, keyring.bob.publicKey);
// alice-sr25519 -> bob-sr25519
const encrypted2 = pairA.encryptMessage(message, pairB.publicKey);
// alice-ed25519 -> bob-sr25519
const encrypted3 = keyring.alice.encryptMessage(message, pairB.publicKey);
// decrypt: Bob-ed25519 - use alice-ed25519 pubkey
expect(
keyring.bob.decryptMessage(encrypted3, keyring.alice.publicKey)
).toEqual(message);
// decrypt: Bob-ed25519 - use alice-sr25519 pubkey
expect(
keyring.bob.decryptMessage(encrypted1, pairA.publicKey)
).toEqual(message);
// decrypt: Bob-sr25519 - use alice-sr25519 pubkey
expect(
pairB.decryptMessage(encrypted2, pairA.publicKey)
).toEqual(message);
});
it('allows setting/getting of meta', (): void => {
keyring.bob.setMeta({ foo: 'bar', something: 'else' });
@@ -159,8 +252,15 @@ describe('pair', (): void => {
it('has a valid address from a known public', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') });
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.addressRaw).toEqual(hexToU8a('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887'));
expect(pair.address).toEqual(TEST_ADDRESS);
expect(pair.addressRaw).toEqual(hexToU8a(TEST_ADDRESS));
});
it('has a valid address from a known ethereum address (20 length)', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: new Uint8Array([75, 32, 205, 127, 248, 119, 52, 31, 46, 171, 170, 23, 158, 23, 46, 108, 95, 180, 186, 168]), secretKey: new Uint8Array([]) });
expect(pair.address.toLowerCase()).toEqual('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8');
expect(pair.addressRaw).toEqual(hexToU8a('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8'));
});
it('converts to json', (): void => {
@@ -175,10 +275,21 @@ describe('pair', (): void => {
expect(json.address).toEqual(u8aToHex(PUBLICDERIVED));
});
it('has Gerald as test address for Ethereum type parachains', (): void => {
const keyringEthereum = createTestPairs({ type: 'ethereum' }, false);
it('denies access to encryptMessage/decryptMessage API', (): void => {
const PASS = 'testing';
const encoded = keyring.alice.encodePkcs8(PASS);
expect(keyringEthereum.Gerald.address).toEqual('0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b');
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: keyring.alice.publicKey });
pair.decodePkcs8(PASS, encoded);
expect(
() => pair.encryptMessage(
new Uint8Array(4), // null message
keyring.bob.publicKey,
new Uint8Array(24)
)
).toThrow('Secp256k1 not supported yet');
});
});
});
+25 -3
View File
@@ -7,7 +7,7 @@ import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } fro
import type { PairInfo } from './types';
import { assert, u8aConcat, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
import { blake2AsU8a, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVrfSign, schnorrkelVrfVerify, secp256k1Compress, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify } from '@polkadot/util-crypto';
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclOpen, naclSeal, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVrfSign, schnorrkelVrfVerify, secp256k1Compress, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify } from '@polkadot/util-crypto';
import { decodePair } from './decode';
import { encodePair } from './encode';
@@ -44,7 +44,7 @@ const TYPE_SIGNATURE = {
const TYPE_ADDRESS = {
ecdsa: (p: Uint8Array) => p.length > 32 ? blake2AsU8a(p) : p,
ed25519: (p: Uint8Array) => p,
ethereum: (p: Uint8Array) => keccakAsU8a(secp256k1Expand(p)),
ethereum: (p: Uint8Array) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),
sr25519: (p: Uint8Array) => p
};
@@ -145,6 +145,17 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
},
// eslint-disable-next-line sort-keys
decodePkcs8,
decryptMessage: (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
return naclOpen(
u8aToU8a(encryptedMessageWithNonce.slice(24, encryptedMessageWithNonce.length)),
u8aToU8a(encryptedMessageWithNonce.slice(0, 24)),
convertPublicKeyToCurve25519(u8aToU8a(senderPublicKey)),
convertSecretKeyToCurve25519(secretKey)
);
},
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair => {
assert(type !== 'ethereum', 'Unable to derive on this keypair');
assert(!isLocked(secretKey), 'Cannot derive on a locked keypair');
@@ -157,6 +168,14 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
encodePkcs8: (passphrase?: string): Uint8Array => {
return recode(passphrase);
},
encryptMessage: (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, _nonce?: Uint8Array): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
const { nonce, sealed } = naclSeal(u8aToU8a(message), convertSecretKeyToCurve25519(secretKey), convertPublicKeyToCurve25519(u8aToU8a(recipientPublicKey)), _nonce);
return u8aConcat(nonce, sealed);
},
lock: (): void => {
secretKey = new Uint8Array();
},
@@ -176,8 +195,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
toJson: (passphrase?: string): KeyringPair$Json => {
// NOTE: For ecdsa and ethereum, the publicKey cannot be extracted from the address. For these
// pass the hex-encoded publicKey through to the address portion of the JSON (before decoding)
// unless the publicKey is already an address
const address = ['ecdsa', 'ethereum'].includes(type)
? u8aToHex(secp256k1Compress(publicKey))
? publicKey.length === 20
? u8aToHex(publicKey)
: u8aToHex(secp256k1Compress(publicKey))
: encodeAddress();
return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);
+6
View File
@@ -30,11 +30,17 @@ export function nobody (): KeyringPair {
decodePkcs8: (passphrase?: string, encoded?: Uint8Array): void =>
undefined,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
decryptMessage: (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null =>
null,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair =>
pair,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
encodePkcs8: (passphrase?: string): Uint8Array =>
new Uint8Array(0),
// eslint-disable-next-line @typescript-eslint/no-unused-vars
encryptMessage: (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, _nonce?: Uint8Array): Uint8Array =>
new Uint8Array(),
isLocked: true,
lock: (): void => {
// no locking, it is always locked
+4 -6
View File
@@ -24,13 +24,11 @@ export class Pairs implements KeyringPairs {
public get (address: string | Uint8Array): KeyringPair {
const pair = this.#map[decodeAddress(address).toString()];
assert(pair, (): string => {
const formatted: string = isU8a(address) || isHex(address)
assert(pair, () => `Unable to retrieve keypair '${
isU8a(address) || isHex(address)
? u8aToHex(u8aToU8a(address))
: address;
return `Unable to retrieve keypair '${formatted}'`;
});
: address
}'`);
return pair;
}
+15 -27
View File
@@ -6,8 +6,8 @@ import type { KeyringInstance, KeyringOptions } from './types';
import { hexToU8a } from '@polkadot/util';
import { KeypairType } from '@polkadot/util-crypto/types';
import { Keyring } from './keyring';
import { createPair } from './pair';
import Keyring from '.';
interface PairDef {
name?: string;
@@ -24,49 +24,49 @@ interface PairDef {
export const PAIRSSR25519: PairDef[] = [
{
publicKey: hexToU8a('0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'),
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'),
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'), // nosemgrep
seed: 'Alice',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'),
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'),
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'), // nosemgrep
seed: 'Alice//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48'),
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'),
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'), // nosemgrep
seed: 'Bob',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e'),
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'),
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'), // nosemgrep
seed: 'Bob//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22'),
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'),
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'), // nosemgrep
seed: 'Charlie',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20'),
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'),
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'), // nosemgrep
seed: 'Dave',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e'),
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'),
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'), // nosemgrep
seed: 'Eve',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c'),
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'),
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'), // nosemgrep
seed: 'Ferdie',
type: 'sr25519'
}
@@ -76,54 +76,42 @@ export const PAIRSETHEREUM: PairDef[] = [
{
name: 'Alith',
publicKey: hexToU8a('0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f'),
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'),
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
{
name: 'Baltathar',
publicKey: hexToU8a('0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518'),
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'),
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
{
name: 'Charleth',
publicKey: hexToU8a('0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e'),
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'),
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
{
name: 'Dorothy',
publicKey: hexToU8a('0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c'),
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'),
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
{
name: 'Ethan',
publicKey: hexToU8a('0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa'),
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'),
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
{
name: 'Faith',
publicKey: hexToU8a('0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74'),
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'),
seed: "m/44'/40'/0'/0",
type: 'ethereum'
},
// Gerald will be removed when moonbeam is done changing dev addresses (should def be done by end of march 21)
{
name: 'Gerald',
publicKey: new Uint8Array([3, 98, 79, 114, 14, 174, 103, 106,
4, 17, 22, 49, 201, 202, 51, 140,
17, 208, 245, 168, 14, 228, 34, 16,
198, 190, 114, 152, 60, 235, 98, 15,
191]),
secretKey: hexToU8a('0x99b3c12287537e38c90a9219d4cb074a89a16e9cdb20bf85728ebd97c343e342'),
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'), // nosemgrep
seed: "m/44'/40'/0'/0",
type: 'ethereum'
}
+4 -2
View File
@@ -7,6 +7,8 @@ import { cryptoWaitReady } from '@polkadot/util-crypto';
import { createTestPairs } from './testingPairs';
import Keyring from '.';
const TEST_ADD = '0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac';
describe('testingPairs', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
@@ -33,7 +35,7 @@ describe('testingPairs', (): void => {
it('has the correct address for Alith (Eth)', (): void => {
expect(
createTestPairs({ type: 'ethereum' }).Alith.address
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
).toEqual(TEST_ADD);
});
it('has the correct address for Alith (Eth), same as obtained by createFromUri', (): void => {
@@ -42,7 +44,7 @@ describe('testingPairs', (): void => {
expect(
pair && pair.address
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
).toEqual(TEST_ADD);
});
it('checks eth test addresses', (): void => {
+2
View File
@@ -37,6 +37,8 @@ export interface KeyringPair {
sign (message: string | Uint8Array, options?: SignOptions): Uint8Array;
toJson (passphrase?: string): KeyringPair$Json;
unlock (passphrase?: string): void;
encryptMessage (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, nonce?: Uint8Array): Uint8Array;
decryptMessage (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null;
verify (message: string | Uint8Array, signature: Uint8Array, signerPublic: string | Uint8Array): boolean;
vrfSign (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array;
vrfVerify (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: Uint8Array | string, context?: string | Uint8Array, extra?: string | Uint8Array): boolean;
+7 -4
View File
@@ -1,10 +1,13 @@
{
"name": "@polkadot/networks",
"version": "6.0.2",
"version": "7.2.1",
"type": "module",
"description": "A list of all available Substrate networks and their applicable prefixes",
"main": "index.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
@@ -13,10 +16,10 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
"dependencies": {
"@babel/runtime": "^7.13.9"
"@babel/runtime": "^7.15.3"
},
"devDependencies": {
"@polkadot/util": "6.0.2",
"@polkadot/x-fetch": "6.0.2"
"@polkadot/util": "7.2.1",
"@polkadot/x-fetch": "7.2.1"
}
}
@@ -0,0 +1,59 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import fs from 'fs';
import fetch from 'node-fetch';
const SUBSTRATE_REGISTRY = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
function outputField (v) {
if (typeof v === 'string') {
return `'${v}'`;
} else if (Array.isArray(v)) {
return `[${v.map((v) => outputField(v)).join(', ')}]`;
}
return v;
}
async function getSubstrateRegistry () {
const original = await fetch(SUBSTRATE_REGISTRY);
const json = await original.json();
return json.registry
.map((e) =>
` {\n${Object
.entries(e)
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => ` ${k}: ${outputField(v)}`)
.join(',\n')}\n }`
)
.join(',\n');
}
getSubstrateRegistry()
.then((entries) => {
fs.writeFileSync('packages/networks/src/substrate.ts', `// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Auto-generated by yarn networks:sync (via scripts/fromSubstrate.mjs)
//
// Do not edit, rather
// - make a PR to the upstream registry as per ${SUBSTRATE_REGISTRY}
// - yarn networks:sync
//
import type { KnownSubstrate } from './types';
export const knownSubstrate: KnownSubstrate[] = [\n${entries}\n];
`);
console.log('Completed.');
process.exit(0);
})
.catch((error) => {
console.error('Error:', error.message);
process.exit(-1);
});
+14 -15
View File
@@ -1,16 +1,17 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Ss58Registry } from './types';
import type { KnownSubstrate, Ss58Registry } from './types';
import fs from 'fs';
import { stringify } from '@polkadot/util';
import { fetch } from '@polkadot/x-fetch';
import { all } from './';
import { allNetworks } from './';
const ORIGINAL = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
const OUTPUT = './.github/ss58-check.md';
const SUBSTRATE_REGISTRY = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
function assertAndLog (check: boolean, error: string): void {
if (!check) {
@@ -27,46 +28,44 @@ describe('check latest Substrate ss58 registry', (): void => {
let original: Ss58Registry;
beforeAll(async (): Promise<void> => {
original = (await (await fetch(ORIGINAL)).json()) as Ss58Registry;
original = (await (await fetch(SUBSTRATE_REGISTRY)).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}`);
assertAndLog(allNetworks.length === original.registry.length, `Number of entries mismatched:: Expected ${original.registry.length} found ${allNetworks.length}`);
});
it('has no missing any entries', (): void => {
const missing = original.registry
.filter(({ prefix }) => !all.some((n) => n.prefix === prefix))
.filter(({ prefix }) => !allNetworks.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Missing entries found: ${JSON.stringify(missing, null, 2)}`);
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
});
it('has no extra entries', (): void => {
const missing = all
const missing = allNetworks
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Extra entries found: ${JSON.stringify(missing, null, 2)}`);
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
});
it('has the same values as the original', (): void => {
const fields = Object.keys(original.schema);
const fields = Object.keys(original.schema) as (keyof KnownSubstrate)[];
const errors = original.registry
.map((n): [string, string[]] => {
const other = all.find(({ prefix }) => prefix === n.prefix);
const other = allNetworks.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]))
? fields.filter((f) => stringify(n[f]) !== stringify(other[f]))
: []
];
})
.filter(([, fields]) => fields.length);
assertAndLog(!errors.length, `Mismatches found: ${JSON.stringify(errors.map(([name, m]) => `${name}:: ${m.join(', ')}`), null, 2)}`);
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
});
});
+25
View File
@@ -0,0 +1,25 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { isHex } from '@polkadot/util';
import { knownGenesis, knownLedger } from './defaults';
describe('defaults', (): void => {
it('has hex values for all genesis chains', (): void => {
expect(
Object.keys(knownGenesis).filter((network) =>
!knownGenesis[network].length ||
knownGenesis[network].some((g) => !isHex(g, 256))
)
).toEqual([]);
});
it('has genesis for all Ledger chains', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!knownGenesis[network]
)
).toEqual([]);
});
});
+87
View File
@@ -0,0 +1,87 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KnownGenesis, KnownIcon, KnownLedger, KnownTestnet } from './types';
// 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)
export const knownGenesis: KnownGenesis = {
centrifuge: [
'0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
],
'dock-mainnet': [
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
],
edgeware: [
'0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
],
equilibrium: [
'0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
],
hydradx: [
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
],
karura: [
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
],
kulupu: [
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
],
kusama: [
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
plasm: [
'0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'
],
polkadot: [
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
],
polymesh: [
'0x9deeb940c92ae02111c3bd5baca89970384f4c9849f02a1b2e53e66414d30f9f'
],
statemine: [
'0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'
],
subsocial: [
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
]
};
// these are icon overrides
export const knownIcon: KnownIcon = {
centrifuge: 'polkadot',
kusama: 'polkadot',
polkadot: 'polkadot',
statemine: 'polkadot',
statemint: 'polkadot',
westmint: 'polkadot'
};
// These match up with the keys of the ledgerApps object in the @polkadot/hw-ledger/defaults.ts
// and maps to the known slip44 (minus the `0x8` hard derivation flag)
// NOTE: Any network here needs to have a genesisHash attached in the config above
export const knownLedger: KnownLedger = {
centrifuge: 0x000002eb,
'dock-mainnet': 0x00000252,
edgeware: 0x0000020b,
equilibrium: 0x05f5e0fd,
kusama: 0x000001b2,
polkadot: 0x00000162,
polymesh: 0x00000253,
statemine: 0x000001b2 // common-good on Kusama, shares derivation
};
// testnets should not allow selection
export const knownTestnet: KnownTestnet = {
'dock-testnet': true,
jupiter: true,
'mathchain-testnet': true,
'zero-alphaville': true
};
+70 -4
View File
@@ -1,14 +1,80 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import filtered, { available } from '.';
import type { SubstrateNetwork } from './types';
describe('filtered', (): void => {
import { knownGenesis, knownIcon, knownLedger, knownTestnet } from './defaults';
import { allNetworks, availableNetworks, selectableNetworks } from '.';
describe('selectableNetworks', (): void => {
it('has the correct starting order', (): void => {
expect(filtered.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
expect(selectableNetworks.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
});
it('has no ignored networks', (): void => {
expect(available.some(({ isIgnored }) => isIgnored)).toEqual(false);
expect(availableNetworks.some(({ isIgnored }) => isIgnored)).toEqual(false);
});
it('has no reserved networks', (): void => {
expect(availableNetworks.some(({ prefix }) => prefix === 47)).toEqual(false);
});
it('has allNetworks genesis information', (): void => {
expect(
Object.entries(knownGenesis).filter(([network, genesisHash]) =>
availableNetworks.some((a) =>
a.network === network &&
genesisHash.some((g, index) => a.genesisHash[index] !== g)
)
)
).toEqual([]);
});
it('has allNetworks ledger details', (): void => {
expect(
Object.entries(knownLedger).filter(([network, slip44]) =>
availableNetworks.some((a) =>
a.network === network && (
a.slip44 !== slip44 ||
!a.hasLedgerSupport ||
!a.genesisHash.length
)
)
)
).toEqual([]);
});
it('has no testnets exposed', (): void => {
expect(
Object.keys(knownTestnet).filter((network) =>
availableNetworks.some((a) =>
a.network === network
)
)
).toEqual([]);
});
it('has allNetworks icons, except for overrides', (): void => {
expect(
availableNetworks.filter(({ icon, network }) =>
icon !== 'substrate' &&
knownIcon[network] !== icon
)
).toEqual([]);
});
it('has no ss58 duplicates', (): void => {
const dupes: SubstrateNetwork[] = [];
const uniques: SubstrateNetwork[] = [];
allNetworks.forEach((a): void => {
if (uniques.some((u) => u.prefix === a.prefix)) {
dupes.push(a);
} else {
uniques.push(a);
}
});
expect(dupes).toEqual([]);
});
});
+1 -505
View File
@@ -1,509 +1,5 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// This contains exactly the same information as available in (with some extensions)
// https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json
//
// Once the above is published as a package, the duplication here can be removed
import type { Network, NetworkFromSubstrate, NetworkFromSubstrateNamed } from './types';
export * from './interfaces';
export { packageInfo } from './packageInfo';
// These are known prefixes that are not sorted
const UNSORTED = [0, 2, 42];
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
// last. This make lookups for the current a simple genesisHash[0]
// (See Kusama as an example)
const createReserved = (prefix: number, displayName: string, network: string | null = null): NetworkFromSubstrate => ({
decimals: null,
displayName,
isIgnored: true,
network,
prefix,
standardAccount: null,
symbols: null,
website: null
});
export const all: NetworkFromSubstrate[] = [
{
decimals: [10],
displayName: 'Polkadot Relay Chain',
genesisHash: ['0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'],
hasLedgerSupport: true,
icon: 'polkadot',
network: 'polkadot',
prefix: 0,
slip44: 0x00000162,
standardAccount: '*25519',
symbols: ['DOT'],
website: 'https://polkadot.network'
},
createReserved(1, 'Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.'),
{
decimals: [12],
displayName: 'Kusama Relay Chain',
genesisHash: [
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
hasLedgerSupport: true,
icon: 'polkadot',
network: 'kusama',
prefix: 2,
slip44: 0x000001b2,
standardAccount: '*25519',
symbols: ['KSM'],
website: 'https://kusama.network'
},
createReserved(3, 'Bare 32-bit Ed25519 public key.'),
{
decimals: null,
displayName: 'Katal Chain',
network: 'katalchain',
prefix: 4,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Plasm Network',
genesisHash: ['0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'],
network: 'plasm',
prefix: 5,
standardAccount: '*25519',
symbols: ['PLM'],
website: null
},
{
decimals: [12],
displayName: 'Bifrost',
network: 'bifrost',
prefix: 6,
standardAccount: '*25519',
symbols: ['BNC'],
website: 'https://bifrost.finance/'
},
{
decimals: [18],
displayName: 'Edgeware',
genesisHash: ['0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'],
network: 'edgeware',
prefix: 7,
standardAccount: '*25519',
symbols: ['EDG'],
website: 'https://edgewa.re'
},
{
decimals: [18],
displayName: 'Acala Karura Canary',
network: 'karura',
prefix: 8,
standardAccount: '*25519',
symbols: ['KAR'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar Reynolds Canary',
network: 'reynolds',
prefix: 9,
standardAccount: '*25519',
symbols: ['REY'],
website: 'http://laminar.network/'
},
{
decimals: [18],
displayName: 'Acala',
network: 'acala',
prefix: 10,
standardAccount: '*25519',
symbols: ['ACA'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar',
network: 'laminar',
prefix: 11,
standardAccount: '*25519',
symbols: ['LAMI'],
website: 'http://laminar.network/'
},
{
decimals: [6],
displayName: 'Polymesh',
genesisHash: ['0x12fddc9e2128b3fe571e4e5427addcb87fcaf08493867a68dd6ae44b406b39c7'],
hasLedgerSupport: true,
network: 'polymesh',
prefix: 12,
slip44: 0x00000253,
standardAccount: '*25519',
symbols: ['POLYX'],
website: 'https://polymath.network/'
},
{
decimals: null,
displayName: 'SubstraTEE',
network: 'substratee',
prefix: 13,
standardAccount: '*25519',
symbols: null,
website: 'https://www.substratee.com'
},
{
decimals: [0],
displayName: 'Totem',
network: 'totem',
prefix: 14,
standardAccount: '*25519',
symbols: ['XTX'],
website: 'https://totemaccounting.com'
},
{
decimals: [12],
displayName: 'Synesthesia',
network: 'synesthesia',
prefix: 15,
standardAccount: '*25519',
symbols: ['SYN'],
website: 'https://synesthesia.network/'
},
{
decimals: [12],
displayName: 'Kulupu',
genesisHash: ['0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'],
network: 'kulupu',
prefix: 16,
standardAccount: '*25519',
symbols: ['KLP'],
website: 'https://kulupu.network/'
},
{
decimals: null,
displayName: 'Dark Mainnet',
network: 'dark',
prefix: 17,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [9, 9],
displayName: 'Darwinia Network',
network: 'darwinia',
prefix: 18,
standardAccount: '*25519',
symbols: ['RING', 'KTON'],
website: 'https://darwinia.network/'
},
{
decimals: [12],
displayName: 'GeekCash',
network: 'geek',
prefix: 19,
standardAccount: '*25519',
symbols: ['GEEK'],
website: 'https://geekcash.org'
},
{
decimals: [12],
displayName: 'Stafi',
genesisHash: ['0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'],
network: 'stafi',
prefix: 20,
standardAccount: '*25519',
symbols: ['FIS'],
website: 'https://stafi.io'
},
{
decimals: [6],
displayName: 'Dock Testnet',
isIgnored: true, // testnet
network: 'dock-testnet',
prefix: 21,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: [6],
displayName: 'Dock Mainnet',
genesisHash: ['0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'],
hasLedgerSupport: true,
network: 'dock-mainnet',
prefix: 22,
slip44: 0x00000252,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: null,
displayName: 'ShiftNrg',
network: 'shift',
prefix: 23,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'ZERO',
network: 'zero',
prefix: 24,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [18],
displayName: 'ZERO Alphaville',
isIgnored: true, // testnet
network: 'zero-alphaville',
prefix: 25,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [10],
displayName: 'Jupiter',
isIgnored: true, // testnet
network: 'jupiter',
prefix: 26,
standardAccount: '*25519',
symbols: ['jDOT'],
website: 'https://jupiter.patract.io'
},
{
decimals: [10, 12],
displayName: 'Patract',
network: 'patract',
prefix: 27,
standardAccount: '*25519',
symbols: ['pDOT', 'pKSM'],
website: 'https://patract.network'
},
{
decimals: null,
displayName: 'Subsocial',
genesisHash: ['0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'],
network: 'subsocial',
prefix: 28,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'Dhiway CORD Network',
network: 'cord',
prefix: 29,
standardAccount: '*25519',
symbols: ['DCU'],
website: 'https://dhiway.com/'
},
{
decimals: [12],
displayName: 'Phala Network',
network: 'phala',
prefix: 30,
standardAccount: '*25519',
symbols: ['PHA'],
website: 'https://phala.network'
},
{
decimals: [12],
displayName: 'Litentry Network',
network: 'litentry',
prefix: 31,
standardAccount: '*25519',
symbols: ['LIT'],
website: 'https://litentry.com/'
},
{
decimals: [9],
displayName: 'Robonomics',
network: 'robonomics',
prefix: 32,
standardAccount: '*25519',
symbols: ['XRT'],
website: 'https://robonomics.network'
},
{
decimals: null,
displayName: 'DataHighway',
network: 'datahighway',
prefix: 33,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Ares Protocol',
network: 'ares',
prefix: 34,
standardAccount: '*25519',
symbols: ['ARES'],
website: 'https://www.aresprotocol.com/'
},
{
decimals: [15],
displayName: 'Valiu Liquidity Network',
network: 'vln',
prefix: 35,
standardAccount: '*25519',
symbols: ['USDv'],
website: 'https://valiu.com/'
},
{
decimals: [18],
displayName: 'Centrifuge Chain',
network: 'centrifuge',
prefix: 36,
standardAccount: '*25519',
symbols: ['RAD'],
website: 'https://centrifuge.io/'
},
{
decimals: [18],
displayName: 'Nodle Chain',
network: 'nodle',
prefix: 37,
standardAccount: '*25519',
symbols: ['NODL'],
website: 'https://nodle.io/'
},
{
decimals: [18],
displayName: 'KILT Chain',
network: 'kilt',
prefix: 38,
standardAccount: '*25519',
symbols: ['KILT'],
website: 'https://kilt.io/'
},
{
decimals: [18],
displayName: 'MathChain mainnet',
network: 'mathchain',
prefix: 39,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: [18],
displayName: 'MathChain testnet',
isIgnored: true, // testnet
network: 'mathchain-testnet',
prefix: 40,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: null,
displayName: 'Polimec Chain',
network: 'poli',
prefix: 41,
standardAccount: '*25519',
symbols: null,
website: 'https://polimec.io/'
},
{
decimals: null,
displayName: 'Substrate',
network: 'substrate',
prefix: 42,
standardAccount: '*25519',
symbols: null,
website: 'https://substrate.dev/'
},
createReserved(43, 'Bare 32-bit ECDSA SECP-256k1 public key.'),
{
decimals: [8],
displayName: 'ChainX',
network: 'chainx',
prefix: 44,
standardAccount: '*25519',
symbols: ['PCX'],
website: 'https://chainx.org/'
},
{
decimals: [12, 12],
displayName: 'UniArts Network',
network: 'uniarts',
prefix: 45,
standardAccount: '*25519',
symbols: ['UART', 'UINK'],
website: 'https://uniarts.me'
},
createReserved(46, 'This prefix is reserved.', 'reserved46'),
createReserved(47, 'This prefix is reserved.', 'reserved47'),
{
decimals: [12],
displayName: 'Neatcoin Mainnet',
network: 'neatcoin',
prefix: 48,
standardAccount: '*25519',
symbols: ['NEAT'],
website: 'https://neatcoin.org'
},
{
decimals: [12],
displayName: 'HydraDX',
network: 'hydradx',
prefix: 63,
standardAccount: '*25519',
symbols: ['HDX'],
website: 'https://hydradx.io'
},
{
decimals: [18],
displayName: 'AvN Mainnet',
network: 'aventus',
prefix: 65,
standardAccount: '*25519',
symbols: ['AVT'],
website: 'https://aventus.io'
},
{
decimals: [12],
displayName: 'Crust Network',
network: 'crust',
prefix: 66,
standardAccount: '*25519',
symbols: ['CRU'],
website: 'https://crust.network'
}
];
// The list of available/claimed prefixes
// - no testnets
// - we only include those where we have a standardAccount
// - when no icon has been specified, default to substrate
// - sort by name, however we keep 0, 2, 42 first in the list
export const available: Network[] = all
.filter((n): n is NetworkFromSubstrateNamed => !n.isIgnored && !!n.network)
.map((n) => ({ ...n, genesisHash: n.genesisHash || [], icon: n.icon || 'substrate' }))
.sort((a, b) =>
UNSORTED.includes(a.prefix) && UNSORTED.includes(b.prefix)
? 0
: UNSORTED.includes(a.prefix)
? -1
: UNSORTED.includes(b.prefix)
? 1
: a.displayName.localeCompare(b.displayName)
);
// A filtered list of those chains we have details about (genesisHashes)
export default available.filter((n) => n.genesisHash.length || n.prefix === 42);
+43
View File
@@ -0,0 +1,43 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Network, SubstrateNetwork } from './types';
import { knownGenesis, knownIcon, knownLedger, knownTestnet } from './defaults';
import { knownSubstrate } from './substrate';
// These are known prefixes that are not sorted
const UNSORTED = [0, 2, 42];
export const allNetworks = knownSubstrate.map((o): SubstrateNetwork => {
const network = o.network || '';
const n = o as SubstrateNetwork;
n.slip44 = knownLedger[network];
n.hasLedgerSupport = !!n.slip44;
n.genesisHash = knownGenesis[network] || [];
n.icon = knownIcon[network] || 'substrate';
n.isIgnored = !network || !!knownTestnet[network] || network.startsWith('reserved');
return n;
});
// The list of available/claimed prefixes
// - no testnets
// - we only include those where we have a standardAccount
// - sort by name, however we keep 0, 2, 42 first in the list
export const availableNetworks = allNetworks
.filter((n): n is Network => !n.isIgnored && !!n.network)
.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)
export const selectableNetworks = availableNetworks.filter((n) => n.genesisHash.length || n.prefix === 42);
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/networks', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/networks', version: '7.2.1' };
+608
View File
@@ -0,0 +1,608 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Auto-generated by yarn networks:sync (via scripts/fromSubstrate.mjs)
//
// Do not edit, rather
// - make a PR to the upstream registry as per https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json
// - yarn networks:sync
//
import type { KnownSubstrate } from './types';
export const knownSubstrate: KnownSubstrate[] = [
{
decimals: [10],
displayName: 'Polkadot Relay Chain',
network: 'polkadot',
prefix: 0,
standardAccount: '*25519',
symbols: ['DOT'],
website: 'https://polkadot.network'
},
{
decimals: null,
displayName: 'Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.',
network: null,
prefix: 1,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Kusama Relay Chain',
network: 'kusama',
prefix: 2,
standardAccount: '*25519',
symbols: ['KSM'],
website: 'https://kusama.network'
},
{
decimals: null,
displayName: 'Bare 32-bit Ed25519 public key.',
network: null,
prefix: 3,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Katal Chain',
network: 'katalchain',
prefix: 4,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [15],
displayName: 'Plasm Network',
network: 'plasm',
prefix: 5,
standardAccount: '*25519',
symbols: ['PLM'],
website: 'https://plasmnet.io'
},
{
decimals: [12],
displayName: 'Bifrost',
network: 'bifrost',
prefix: 6,
standardAccount: '*25519',
symbols: ['BNC'],
website: 'https://bifrost.finance/'
},
{
decimals: [18],
displayName: 'Edgeware',
network: 'edgeware',
prefix: 7,
standardAccount: '*25519',
symbols: ['EDG'],
website: 'https://edgewa.re'
},
{
decimals: [12],
displayName: 'Karura',
network: 'karura',
prefix: 8,
standardAccount: '*25519',
symbols: ['KAR'],
website: 'https://karura.network/'
},
{
decimals: [18],
displayName: 'Laminar Reynolds Canary',
network: 'reynolds',
prefix: 9,
standardAccount: '*25519',
symbols: ['REY'],
website: 'http://laminar.network/'
},
{
decimals: [12],
displayName: 'Acala',
network: 'acala',
prefix: 10,
standardAccount: '*25519',
symbols: ['ACA'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar',
network: 'laminar',
prefix: 11,
standardAccount: '*25519',
symbols: ['LAMI'],
website: 'http://laminar.network/'
},
{
decimals: [6],
displayName: 'Polymesh',
network: 'polymesh',
prefix: 12,
standardAccount: '*25519',
symbols: ['POLYX'],
website: 'https://polymath.network/'
},
{
decimals: null,
displayName: 'SubstraTEE',
network: 'substratee',
prefix: 13,
standardAccount: '*25519',
symbols: null,
website: 'https://www.substratee.com'
},
{
decimals: [0],
displayName: 'Totem',
network: 'totem',
prefix: 14,
standardAccount: '*25519',
symbols: ['XTX'],
website: 'https://totemaccounting.com'
},
{
decimals: [12],
displayName: 'Synesthesia',
network: 'synesthesia',
prefix: 15,
standardAccount: '*25519',
symbols: ['SYN'],
website: 'https://synesthesia.network/'
},
{
decimals: [12],
displayName: 'Kulupu',
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',
network: 'stafi',
prefix: 20,
standardAccount: '*25519',
symbols: ['FIS'],
website: 'https://stafi.io'
},
{
decimals: [6],
displayName: 'Dock Testnet',
network: 'dock-testnet',
prefix: 21,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: [6],
displayName: 'Dock Mainnet',
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: [10],
displayName: 'Jupiter',
network: 'jupiter',
prefix: 26,
standardAccount: '*25519',
symbols: ['jDOT'],
website: 'https://jupiter.patract.io'
},
{
decimals: null,
displayName: 'Subsocial',
network: 'subsocial',
prefix: 28,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'Dhiway CORD Network',
network: 'cord',
prefix: 29,
standardAccount: '*25519',
symbols: ['DCU'],
website: 'https://dhiway.com/'
},
{
decimals: [12],
displayName: 'Phala Network',
network: 'phala',
prefix: 30,
standardAccount: '*25519',
symbols: ['PHA'],
website: 'https://phala.network'
},
{
decimals: [12],
displayName: 'Litentry Network',
network: 'litentry',
prefix: 31,
standardAccount: '*25519',
symbols: ['LIT'],
website: 'https://litentry.com/'
},
{
decimals: [9],
displayName: 'Robonomics',
network: 'robonomics',
prefix: 32,
standardAccount: '*25519',
symbols: ['XRT'],
website: 'https://robonomics.network'
},
{
decimals: null,
displayName: 'DataHighway',
network: 'datahighway',
prefix: 33,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Ares Protocol',
network: 'ares',
prefix: 34,
standardAccount: '*25519',
symbols: ['ARES'],
website: 'https://www.aresprotocol.com/'
},
{
decimals: [15],
displayName: 'Valiu Liquidity Network',
network: 'vln',
prefix: 35,
standardAccount: '*25519',
symbols: ['USDv'],
website: 'https://valiu.com/'
},
{
decimals: [18],
displayName: 'Centrifuge Chain',
network: 'centrifuge',
prefix: 36,
standardAccount: '*25519',
symbols: ['CFG'],
website: 'https://centrifuge.io/'
},
{
decimals: [18],
displayName: 'Nodle Chain',
network: 'nodle',
prefix: 37,
standardAccount: '*25519',
symbols: ['NODL'],
website: 'https://nodle.io/'
},
{
decimals: [18],
displayName: 'KILT Chain',
network: 'kilt',
prefix: 38,
standardAccount: '*25519',
symbols: ['KILT'],
website: 'https://kilt.io/'
},
{
decimals: [18],
displayName: 'MathChain mainnet',
network: 'mathchain',
prefix: 39,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: [18],
displayName: 'MathChain testnet',
network: 'mathchain-testnet',
prefix: 40,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: null,
displayName: 'Polimec Chain',
network: 'poli',
prefix: 41,
standardAccount: '*25519',
symbols: null,
website: 'https://polimec.io/'
},
{
decimals: null,
displayName: 'Substrate',
network: 'substrate',
prefix: 42,
standardAccount: '*25519',
symbols: null,
website: 'https://substrate.dev/'
},
{
decimals: null,
displayName: 'Bare 32-bit ECDSA SECP-256k1 public key.',
network: null,
prefix: 43,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [8],
displayName: 'ChainX',
network: 'chainx',
prefix: 44,
standardAccount: '*25519',
symbols: ['PCX'],
website: 'https://chainx.org/'
},
{
decimals: [12, 12],
displayName: 'UniArts Network',
network: 'uniarts',
prefix: 45,
standardAccount: '*25519',
symbols: ['UART', 'UINK'],
website: 'https://uniarts.me'
},
{
decimals: null,
displayName: 'This prefix is reserved.',
network: 'reserved46',
prefix: 46,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: null,
displayName: 'This prefix is reserved.',
network: 'reserved47',
prefix: 47,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Neatcoin Mainnet',
network: 'neatcoin',
prefix: 48,
standardAccount: '*25519',
symbols: ['NEAT'],
website: 'https://neatcoin.org'
},
{
decimals: [12],
displayName: 'HydraDX',
network: 'hydradx',
prefix: 63,
standardAccount: '*25519',
symbols: ['HDX'],
website: 'https://hydradx.io'
},
{
decimals: [18],
displayName: 'AvN Mainnet',
network: 'aventus',
prefix: 65,
standardAccount: '*25519',
symbols: ['AVT'],
website: 'https://aventus.io'
},
{
decimals: [12],
displayName: 'Crust Network',
network: 'crust',
prefix: 66,
standardAccount: '*25519',
symbols: ['CRU'],
website: 'https://crust.network'
},
{
decimals: [0, 9, 9, 9, 9, 9, 9, 9],
displayName: 'Equilibrium Network',
network: 'equilibrium',
prefix: 67,
standardAccount: '*25519',
symbols: ['Unknown', 'USD', 'EQ', 'ETH', 'BTC', 'EOS', 'DOT', 'CRV'],
website: 'https://equilibrium.io'
},
{
decimals: [18],
displayName: 'SORA Network',
network: 'sora',
prefix: 69,
standardAccount: '*25519',
symbols: ['XOR'],
website: 'https://sora.org'
},
{
decimals: [10],
displayName: 'Zeitgeist',
network: 'zeitgeist',
prefix: 73,
standardAccount: '*25519',
symbols: ['ZTG'],
website: 'https://zeitgeist.pm'
},
{
decimals: [12],
displayName: 'Manta network',
network: 'manta',
prefix: 77,
standardAccount: '*25519',
symbols: ['MA'],
website: 'https://manta.network'
},
{
decimals: [12],
displayName: 'Calamari: Manta Canary Network',
network: 'calamari',
prefix: 78,
standardAccount: '*25519',
symbols: ['KMA'],
website: 'https://manta.network'
},
{
decimals: [18],
displayName: 'PolkaSmith Canary Network',
network: 'polkasmith',
prefix: 98,
standardAccount: '*25519',
symbols: ['PKS'],
website: 'https://polkafoundry.com'
},
{
decimals: [18],
displayName: 'PolkaFoundry Network',
network: 'polkafoundry',
prefix: 99,
standardAccount: '*25519',
symbols: ['PKF'],
website: 'https://polkafoundry.com'
},
{
decimals: [18],
displayName: 'OriginTrail Parachain',
network: 'origintrail-parachain',
prefix: 101,
standardAccount: 'secp256k1',
symbols: ['TRAC'],
website: 'https://origintrail.io'
},
{
decimals: [12],
displayName: 'Heiko',
network: 'heiko',
prefix: 110,
standardAccount: '*25519',
symbols: ['HKO'],
website: 'https://parallel.fi/'
},
{
decimals: [18],
displayName: 'Altair',
network: 'altair',
prefix: 136,
standardAccount: '*25519',
symbols: ['AIR'],
website: 'https://centrifuge.io/'
},
{
decimals: [12],
displayName: 'Parallel',
network: 'parallel',
prefix: 172,
standardAccount: '*25519',
symbols: ['PARA'],
website: 'https://parallel.fi/'
},
{
decimals: [18],
displayName: 'Social Network',
network: 'social-network',
prefix: 252,
standardAccount: '*25519',
symbols: ['NET'],
website: 'https://social.network'
},
{
decimals: [18],
displayName: 'Moonbeam',
network: 'moonbeam',
prefix: 1284,
standardAccount: 'secp256k1',
symbols: ['GLMR'],
website: 'https://moonbeam.network'
},
{
decimals: [18],
displayName: 'Moonriver',
network: 'moonriver',
prefix: 1285,
standardAccount: 'secp256k1',
symbols: ['MOVR'],
website: 'https://moonbeam.network'
},
{
decimals: [12],
displayName: 'Basilisk',
network: 'basilisk',
prefix: 10041,
standardAccount: '*25519',
symbols: ['BSX'],
website: 'https://bsx.fi'
}
];
+20 -14
View File
@@ -3,32 +3,38 @@
export type Icon = 'beachball' | 'empty' | 'jdenticon' | 'polkadot' | 'substrate';
export interface NetworkFromSubstrate {
export interface KnownSubstrate {
decimals: number[] | null,
displayName: string;
network: string | null;
prefix: number;
genesisHash?: string[] | null;
hasLedgerSupport?: boolean;
icon?: Icon | null;
isIgnored?: boolean;
slip44?: number;
standardAccount: '*25519' | null;
standardAccount: '*25519' | 'secp256k1' | null;
symbols: string[] | null;
website: string | null;
}
export interface NetworkFromSubstrateNamed extends NetworkFromSubstrate {
export type KnownIcon = Record<string, Icon>;
export type KnownLedger = Record<string, number>;
export type KnownGenesis = Record<string, string[]>;
export type KnownTestnet = Record<string, true>;
export interface SubstrateNetwork extends KnownSubstrate {
genesisHash: string[];
hasLedgerSupport: boolean;
icon: Icon;
isIgnored: boolean;
slip44?: number | null;
}
export interface Network extends SubstrateNetwork {
network: string;
}
export interface Network extends NetworkFromSubstrateNamed {
genesisHash: string[];
icon: Icon;
}
export interface Ss58Registry {
registry: NetworkFromSubstrate[];
registry: KnownSubstrate[];
specification: string;
schema: Record<string, string>;
}
+15 -9
View File
@@ -1,13 +1,18 @@
{
"name": "@polkadot/util-crypto",
"version": "6.0.2",
"version": "7.2.1",
"type": "module",
"description": "A collection of useful crypto utilities for @polkadot",
"main": "index.js",
"sideEffects": [
"./cryptoInit.js",
"./cryptoInit.cjs",
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -16,16 +21,17 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util-crypto#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/networks": "6.0.2",
"@polkadot/util": "6.0.2",
"@polkadot/wasm-crypto": "^4.0.1",
"@polkadot/x-randomvalues": "6.0.2",
"@babel/runtime": "^7.15.3",
"@polkadot/networks": "7.2.1",
"@polkadot/util": "7.2.1",
"@polkadot/wasm-crypto": "^4.1.2",
"@polkadot/x-randomvalues": "7.2.1",
"base-x": "^3.0.8",
"base64-js": "^1.5.1",
"blakejs": "^1.1.0",
"blakejs": "^1.1.1",
"bn.js": "^4.11.9",
"create-hash": "^1.2.0",
"ed2curve": "^0.3.0",
"elliptic": "^6.5.4",
"hash.js": "^1.1.7",
"js-sha3": "^0.8.0",
@@ -36,11 +42,11 @@
"devDependencies": {
"@types/bn.js": "^4.11.6",
"@types/create-hash": "^1.2.2",
"@types/elliptic": "^6.4.12",
"@types/elliptic": "^6.4.13",
"@types/scryptsy": "^2.0.0",
"@types/xxhashjs": "^0.2.2"
},
"peerDependencies": {
"@polkadot/util": "6.0.2"
"@polkadot/util": "7.2.1"
}
}
@@ -17,6 +17,18 @@ describe('checkAddressChecksum', (): void => {
).toEqual([true, 34, 2, 66]);
});
it('correctly extracts the info from a 2-byte-prefix address (69)', (): void => {
expect(
checkAddressChecksum(base58Decode('cnVvyMzRdqjwejTFuByQQ4w2yu78V2hpFixjHQz5zr6NSYsxA'))
).toEqual([true, 34, 2, 69]);
});
it('correctly extracts the info from a 2-byte-prefix address (252)', (): void => {
expect(
checkAddressChecksum(base58Decode('xw8Ffc2SZtDqUJKd9Ky4vc7PRz2D2asuVkEEzf3WGAbw9cnfq'))
).toEqual([true, 34, 2, 252]);
});
it('correctly extracts the info from a 2-byte-prefix address (255)', (): void => {
expect(
checkAddressChecksum(base58Decode('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k'))
@@ -89,6 +89,22 @@ describe('decodeAddress', (): void => {
);
});
it('decodes a 2-byte prefix (69)', (): void => {
expect(
decodeAddress('cnUaoo5wodnTVA4bnr4woSweto8hWZADUvLFXkR9Q6U7BRsbF')
).toEqual(
hexToU8a('0x88eafe0305d460d1695cf34c2f786050df8e40d215e488790cc70929c9e8316d')
);
});
it('decodes a 2-byte prefix (252)', (): void => {
expect(
decodeAddress('xw9Hca4RJTmBRgzJT4ieJBh7XCK9gE3NXBDSEmgGHd4TCrbnG')
).toEqual(
hexToU8a('0xfc422da6c3bc6dfa2a436a506428072941662f816987baaa8914e02ff5947f4b')
);
});
it('decodes a 2-byte prefix (255)', (): void => {
expect(
decodeAddress('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k')
@@ -103,12 +119,6 @@ describe('decodeAddress', (): void => {
).toEqual('0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9');
});
it.skip('allows invalid prefix (in list)', (): void => {
expect(
(): Uint8Array => decodeAddress('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
).toThrow(/address prefix/);
});
it('fails when length is invalid', (): void => {
expect(
(): Uint8Array => decodeAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
+4 -2
View File
@@ -10,7 +10,9 @@ import { base58Decode } from '../base58/decode';
import { checkAddressChecksum } from './checksum';
import { defaults } from './defaults';
export function decodeAddress (encoded: string | Uint8Array, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
export function decodeAddress (encoded?: string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
assert(encoded, 'Invalid empty address passed');
if (isU8a(encoded) || isHex(encoded)) {
return u8aToU8a(encoded);
}
@@ -23,7 +25,7 @@ export function decodeAddress (encoded: string | Uint8Array, ignoreChecksum?: bo
const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
assert(ignoreChecksum || isValid, 'Invalid decoded address checksum');
assert([-1, ss58Decoded].includes(ss58Format), `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
assert([-1, ss58Decoded].includes(ss58Format), () => `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
return decoded.slice(ss58Length, endPos);
} catch (error) {
+2 -2
View File
@@ -1,12 +1,12 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { available } from '@polkadot/networks';
import { availableNetworks } from '../networks';
export const defaults = {
allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
// publicKey has prefix + 2 checksum bytes, short only prefix + 1 checksum byte
allowedEncodedLengths: [3, 4, 6, 10, 35, 36, 37, 38],
allowedPrefix: available.map(({ prefix }) => prefix),
allowedPrefix: availableNetworks.map(({ prefix }) => prefix),
prefix: 42
};
@@ -26,12 +26,24 @@ const SUBKEY = [
publicKey: '0x04a047d52fe542484c69bc528990cfeaf3a663dded0638ee1b51cf78bacd1072',
ss58Format: 66
},
{
// sora
address: 'cnVRwXfAnz3RSVQyBUC8f8McrK3YBX2QYd4WoctpeSC6VTJYm',
publicKey: '0xae640d53cfa815f4a6a50ae70235cd7d9d134d0f1c3a4ccd118e321dfb6ab51f',
ss58Format: 69
},
{
// ecdsa
address: '4pbsSkWcBaYoFHrKJZp5fDVUKbqSYD9dhZZGvpp3vQ5ysVs5ybV',
publicKey: '0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9',
ss58Format: 200
},
{
// social-network
address: 'xw5g1Eec8LT99pZLZMaTWwrwvNtfM6vrSuZeVbtEszCDUwByg',
publicKey: '0x5c64f1151f0ce4358c27238fb20c88e7c899825436f565410724c8c2c5add869',
ss58Format: 252
},
{
address: 'yGF4JP7q5AK46d1FPCEm9sYQ4KooSjHMpyVAjLnsCSWVafPnf',
publicKey: '0x66cd6cf085627d6c85af1aaf2bd10cf843033e929b4e3b1c2ba8e4aa46fe111b',
+14 -14
View File
@@ -11,27 +11,27 @@ import { decodeAddress } from './decode';
import { defaults } from './defaults';
import { sshash } from './sshash';
export function encodeAddress (_key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
export function encodeAddress (key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
// decode it, this means we can re-encode an address
const key = decodeAddress(_key);
const u8a = decodeAddress(key);
assert(ss58Format >= 0 && ss58Format <= 16383 && ![46, 47].includes(ss58Format), 'Out of range ss58Format specified');
assert(defaults.allowedDecodedLengths.includes(key.length), `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
assert(defaults.allowedDecodedLengths.includes(u8a.length), () => `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
const isPublicKey = [32, 33].includes(key.length);
const input = u8aConcat(
new Uint8Array(
ss58Format < 64
? [ss58Format]
: [
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
]
),
key
ss58Format < 64
? [ss58Format]
: [
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
],
u8a
);
return base58Encode(
u8aConcat(input, sshash(input).subarray(0, isPublicKey ? 2 : 1))
u8aConcat(
input,
sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)
)
);
}
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type BN from 'bn.js';
import type { BN } from '@polkadot/util';
import type { Prefix } from './types';
import { decodeAddress } from './decode';
@@ -14,6 +14,6 @@ import { createKeyDerived } from './keyDerived';
* @description
* Creates a Substrate derived address based on the input address/publicKey and the index supplied.
*/
export function encodeDerivedAddress (who: Uint8Array | string, index: BigInt | BN | number, ss58Format?: Prefix): string {
export function encodeDerivedAddress (who: Uint8Array | string, index: bigint | BN | number, ss58Format?: Prefix): string {
return encodeAddress(createKeyDerived(decodeAddress(who), index), ss58Format);
}
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type BN from 'bn.js';
import type { BN } from '@polkadot/util';
import type { Prefix } from './types';
import { encodeAddress } from './encode';
@@ -13,6 +13,6 @@ import { createKeyMulti } from './keyMulti';
* @description
* Creates a Substrate multisig address based on the input address and the required threshold.
*/
export function encodeMultiAddress (who: (Uint8Array | string)[], threshold: BigInt | BN | number, ss58Format?: Prefix): string {
export function encodeMultiAddress (who: (Uint8Array | string)[], threshold: bigint | BN | number, ss58Format?: Prefix): string {
return encodeAddress(createKeyMulti(who, threshold), ss58Format);
}
@@ -13,5 +13,7 @@ export { encodeDerivedAddress } from './encodeDerived';
export { encodeMultiAddress } from './encodeMulti';
export { evmToAddress } from './evmToAddress';
export { addressEq } from './eq';
export { isAddress } from './is';
export { setSS58Format } from './setSS58Format';
export { sortAddresses } from './sort';
export { validateAddress } from './validate';
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Prefix } from './types';
import { validateAddress } from './validate';
export function isAddress (address?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): address is string {
try {
return validateAddress(address, ignoreChecksum, ss58Format);
} catch (error) {
return false;
}
}
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type BN from 'bn.js';
import type { BN } from '@polkadot/util';
import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
@@ -10,7 +10,7 @@ import { decodeAddress } from './decode';
const PREFIX = stringToU8a('modlpy/utilisuba');
export function createKeyDerived (who: Uint8Array | string, index: BigInt | BN | number): Uint8Array {
export function createKeyDerived (who: Uint8Array | string, index: bigint | BN | number): Uint8Array {
return blake2AsU8a(
u8aConcat(
PREFIX,
+2 -2
View File
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type BN from 'bn.js';
import type { BN } from '@polkadot/util';
import { bnToU8a, compactToU8a, stringToU8a, u8aConcat, u8aSorted } from '@polkadot/util';
@@ -10,7 +10,7 @@ import { decodeAddress } from './decode';
const PREFIX = stringToU8a('modlpy/utilisuba');
export function createKeyMulti (who: (Uint8Array | string)[], threshold: BigInt | BN | number): Uint8Array {
export function createKeyMulti (who: (Uint8Array | string)[], threshold: bigint | BN | number): Uint8Array {
return blake2AsU8a(
u8aConcat(
PREFIX,
@@ -3,12 +3,18 @@
import type { Prefix } from './types';
import { logger } from '@polkadot/util';
import { defaults } from './defaults';
const l = logger('setSS58Format');
/**
* @description Sets the global SS58 format to use for address encoding
* @deprecated Use keyring.setSS58Format
*/
export function setSS58Format (prefix: Prefix): void {
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as pat of the address encode function');
defaults.prefix = prefix;
}
@@ -0,0 +1,10 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Prefix } from './types';
import { decodeAddress } from './decode';
export function validateAddress (encoded?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): encoded is string {
return !!decodeAddress(encoded, ignoreChecksum, ss58Format);
}
+1 -1
View File
@@ -11,6 +11,6 @@ export function testValidator (validate: (value?: string | null, ipfsCompat?: bo
}
}
export function isBase32 (value?: string | null, ipfsCompat?: boolean): boolean {
export function isBase32 (value?: string | null, ipfsCompat?: boolean): value is string {
return testValidator(base32Validate, value, ipfsCompat);
}
+2 -2
View File
@@ -10,8 +10,8 @@ const BASE_CONFIG = { alphabet: BASE32_ALPHABET, ipfsChar: 'b', type: 'base32' }
* @name base32Validate
* @summary Validates a base32 value.
* @description
* Validates the the supplied value is valid base32
* Validates that the supplied value is valid base32
*/
export function base32Validate (value?: string | null, ipfsCompat?: boolean): true {
export function base32Validate (value?: string | null, ipfsCompat?: boolean): value is string {
return validateChars(BASE_CONFIG, value, ipfsCompat);
}
+1 -1
View File
@@ -4,6 +4,6 @@
import { testValidator } from '../base32/is';
import { base58Validate } from './validate';
export function isBase58 (value?: string | null, ipfsCompat?: boolean): boolean {
export function isBase58 (value?: string | null, ipfsCompat?: boolean): value is string {
return testValidator(base58Validate, value, ipfsCompat);
}
+6 -6
View File
@@ -13,12 +13,12 @@ interface CheckConfig {
const BASE_CONFIG = { alphabet: BASE58_ALPHABET, ipfsChar: 'z', type: 'base58' };
export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?: string | null, ipfsCompat?: boolean): true {
assert(value, `Expected non-null, non-empty ${type} input`);
assert(!ipfsCompat || value[0] === ipfsChar, `Expected ${type} to start with '${ipfsChar}'`);
export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?: unknown, ipfsCompat?: boolean): true {
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
assert(!ipfsCompat || value[0] === ipfsChar, () => `Expected ${type} to start with '${ipfsChar}'`);
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
assert(alphabet.includes(value[i]), `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
assert(alphabet.includes(value[i]), () => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
}
return true;
@@ -28,8 +28,8 @@ export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?
* @name base58Validate
* @summary Validates a base58 value.
* @description
* Validates the the supplied value is valid base58
* Validates that the supplied value is valid base58
*/
export function base58Validate (value?: string | null, ipfsCompat?: boolean): true {
export function base58Validate (value?: string | null, ipfsCompat?: boolean): value is string {
return validateChars(BASE_CONFIG, value, ipfsCompat);
}
+1 -1
View File
@@ -3,7 +3,7 @@
import { base64Validate } from './validate';
export function isBase64 (value?: string | null): boolean {
export function isBase64 (value?: string | null): value is string {
try {
return base64Validate(value);
} catch (error) {
+3 -3
View File
@@ -7,10 +7,10 @@ import { assert } from '@polkadot/util';
* @name base64Validate
* @summary Validates a base64 value.
* @description
* Validates the the supplied value is valid base64
* Validates that the supplied value is valid base64
*/
export function base64Validate (value?: string | null): true {
assert(value, 'Expected non-null, non-empty base64 input');
export function base64Validate (value?: string | null): value is string {
assert(value && typeof value === 'string', 'Expected non-null, non-empty base64 string input');
assert(/^(?:[A-Za-z0-9+/]{2}[A-Za-z0-9+/]{2})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value), 'Invalid base64 encoding');
return true;
+34 -26
View File
@@ -11,35 +11,43 @@ describe('blake2AsHex', (): void => {
await waitReady();
});
it('returns a 64-bit value (specified)', (): void => {
expect(
blake2AsHex('abc', 64)
).toEqual('0xd8bb14d833d59559');
});
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a 64-bit value (specified)', (): void => {
expect(
blake2AsHex('abc', 64, null, onlyJs)
).toEqual('0xd8bb14d833d59559');
});
it('returns a 128-bit value (as specified)', (): void => {
expect(
blake2AsHex('abc', 128)
).toEqual('0xcf4ab791c62b8d2b2109c90275287816');
});
it('returns a 128-bit value (as specified)', (): void => {
expect(
blake2AsHex('abc', 128, null, onlyJs)
).toEqual('0xcf4ab791c62b8d2b2109c90275287816');
});
it('returns a 256-bit value (default)', (): void => {
expect(
blake2AsHex('abc')
).toEqual('0xbddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319');
});
it('returns a 128-bit value (as specified, with key)', (): void => {
expect(
blake2AsHex('abc', 128, new Uint8Array([1, 2]), onlyJs)
).toEqual('0x36f3d08cda72a00ddf2be103eb5770d9');
});
it('returns a 512-bit value (as specified)', (): void => {
expect(
blake2AsHex('abc', 512)
).toEqual('0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923');
});
it('returns a 256-bit value (default)', (): void => {
expect(
blake2AsHex('abc', undefined, null, onlyJs)
).toEqual('0xbddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319');
});
it('matches with the Rust implementation', (): void => {
expect(
blake2AsHex(
hexToU8a('0x454545454545454545454545454545454545454545454545454545454545454501000000000000002481853da20b9f4322f34650fea5f240dcbfb266d02db94bfa0153c31f4a29dbdbf025dd4a69a6f4ee6e1577b251b655097e298b692cb34c18d3182cac3de0dc00000000'), 256
)
).toEqual('0x1025e5db74fdaf4d2818822dccf0e1604ae9ccc62f26cecfde23448ff0248abf');
it('returns a 512-bit value (as specified)', (): void => {
expect(
blake2AsHex('abc', 512, null, onlyJs)
).toEqual('0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923');
});
it('matches with the Rust implementation', (): void => {
expect(
blake2AsHex(
hexToU8a('0x454545454545454545454545454545454545454545454545454545454545454501000000000000002481853da20b9f4322f34650fea5f240dcbfb266d02db94bfa0153c31f4a29dbdbf025dd4a69a6f4ee6e1577b251b655097e298b692cb34c18d3182cac3de0dc00000000'), 256, undefined, onlyJs
)
).toEqual('0x1025e5db74fdaf4d2818822dccf0e1604ae9ccc62f26cecfde23448ff0248abf');
});
});
});
+2 -2
View File
@@ -19,8 +19,8 @@ import { blake2AsU8a } from './asU8a';
* blake2AsHex('abc'); // => 0xba80a53f981c4d0d
* ```
*/
export function blake2AsHex (data: Uint8Array | string, bitLength = 256): string {
export function blake2AsHex (data: Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): string {
return u8aToHex(
blake2AsU8a(data, bitLength)
blake2AsU8a(data, bitLength, key, onlyJs)
);
}
+5 -11
View File
@@ -11,38 +11,32 @@ describe('blake2AsU8a', (): void => {
await waitReady();
});
[false, true].forEach((onlyJs): void => {
it(`returns a 64-bit value by default (onlyJs=${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a 64-bit value by default', (): void => {
expect(
blake2AsU8a('abc', undefined, undefined, onlyJs)
).toEqual(
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
);
});
});
[false, true].forEach((onlyJs): void => {
it(`returns a 128-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
it('returns a 128-bit value (as specified,)', (): void => {
expect(
blake2AsU8a('abc', 128, undefined, onlyJs)
).toEqual(
new Uint8Array([207, 74, 183, 145, 198, 43, 141, 43, 33, 9, 201, 2, 117, 40, 120, 22])
);
});
});
[false, true].forEach((onlyJs): void => {
it(`returns a 256-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
it('returns a 256-bit value (as specified)', (): void => {
expect(
blake2AsU8a('abc', 256, undefined, onlyJs)
).toEqual(
new Uint8Array([189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25])
);
});
});
[false, true].forEach((onlyJs): void => {
it(`returns a 512-bit value (as specified, onlyJs=${onlyJs.toString()})`, (): void => {
it('returns a 512-bit value (as specified)', (): void => {
expect(
blake2AsU8a('abc', 512, undefined, onlyJs)
).toEqual(
+2 -2
View File
@@ -20,10 +20,10 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto';
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa53, 0xf98, 0x1c, 0x4d, 0x0d]
* ```
*/
export function blake2AsU8a (data: Uint8Array | string, bitLength = 256, key: Uint8Array | null = null, onlyJs = false): Uint8Array {
export function blake2AsU8a (data: Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): Uint8Array {
const byteLength = Math.ceil(bitLength / 8);
return isReady() && !onlyJs
? blake2b(u8aToU8a(data), u8aToU8a(key), byteLength)
: js.blake2b(u8aToU8a(data), key, byteLength);
: js.blake2b(u8aToU8a(data), key || undefined, byteLength);
}
+31
View File
@@ -0,0 +1,31 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import './cryptoInit';
export { packageInfo } from './packageInfo';
// all internal exports
export * from './address';
export * from './base32';
export * from './base58';
export * from './base64';
export * from './blake2';
export * from './crypto';
export * from './ethereum';
export * from './hd';
export * from './hmac';
export * from './json';
export * from './keccak';
export * from './key';
export * from './mnemonic';
export * from './networks';
export * from './nacl';
export * from './pbkdf2';
export * from './random';
export * from './schnorrkel';
export * from './scrypt';
export * from './secp256k1';
export * from './sha512';
export * from './signature';
export * from './xxhash';
@@ -8,9 +8,7 @@ import { isEthereumChecksum } from './isChecksum';
export function isEthereumAddress (address?: string): boolean {
if (!address || address.length !== 42 || !isHex(address)) {
return false;
}
if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
} else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
return true;
}
@@ -6,7 +6,11 @@ import { u8aToHex } from '@polkadot/util';
import { keccakAsU8a } from '../keccak';
function isInvalidChar (char: string, byte: number): boolean {
return (byte > 7 && char !== char.toUpperCase()) || (byte <= 7 && char !== char.toLowerCase());
return char !== (
byte > 7
? char.toUpperCase()
: char.toLowerCase()
);
}
export function isEthereumChecksum (_address: string): boolean {
@@ -7,6 +7,7 @@ import { hdLedger } from '..';
const MNE_0 = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
const MNE_1 = 'open jelly jeans corn ketchup supreme brief element armed lens vault weather original scissors rug priority vicious lesson raven spot gossip powder person volcano';
const MNE_P = `${MNE_1} testing`;
const TESTS = {
Kusama: {
@@ -36,6 +37,11 @@ const TESTS = {
ed25519: '0xe8c68348586d53e4e8d1a864b0e4e17c75e4eb06e0c63c1432bef2ba29e69d41',
index: [0, 0],
mnemonic: MNE_0
},
{
ed25519: '0x3890e8db837eba3f8f25215c753e1091062298ce671a51441e7ef89a7adc4f48',
index: [0, 0],
mnemonic: MNE_P
}
]
}
+14 -3
View File
@@ -11,7 +11,18 @@ import { HARDENED, hdValidatePath } from '../validatePath';
import { ledgerDerivePrivate } from './derivePrivate';
import { ledgerMaster } from './master';
export function hdLedger (mnemonic: string, path: string): Keypair {
export function hdLedger (_mnemonic: string, path: string): Keypair {
const parts = _mnemonic
.split(' ')
.map((s) => s.trim())
.filter((s) => s);
assert([12, 24, 25].includes(parts.length), 'Expected a mnemonic with 24 words (or 25 including a password)');
const [mnemonic, password] = parts.length === 25
? [parts.slice(0, 24).join(' '), parts[24]]
: [parts.join(' '), ''];
assert(mnemonicValidate(mnemonic), 'Invalid mnemonic passed to ledger derivation');
assert(hdValidatePath(path), 'Invalid derivation path');
@@ -19,9 +30,9 @@ export function hdLedger (mnemonic: string, path: string): Keypair {
path
.split('/')
.slice(1)
.map((n) => parseInt(n.replace("'", ''), 10))
.map((n) => parseInt(n.replace(/'$/, ''), 10))
.map((n) => (n < HARDENED) ? (n + HARDENED) : n)
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic))
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic, password))
.slice(0, 32)
);
}
+2 -2
View File
@@ -9,8 +9,8 @@ import { mnemonicToSeedSync } from '../../mnemonic/bip39';
const ED25519_CRYPTO = 'ed25519 seed';
// gets an xprv from a mnemonic
export function ledgerMaster (mnemonic: string): Uint8Array {
const seed = mnemonicToSeedSync(mnemonic);
export function ledgerMaster (mnemonic: string, password?: string): Uint8Array {
const seed = mnemonicToSeedSync(mnemonic, password);
const chainCode = hmacSha256(ED25519_CRYPTO, new Uint8Array([1, ...seed]));
let priv;
+1 -1
View File
@@ -12,7 +12,7 @@ export function hdValidatePath (path: string): boolean {
return parts.every((n) => /^\d+'?$/.test(n)) && (
!parts
.map((n) => parseInt(n.replace("'", ''), 10))
.map((n) => parseInt(n.replace(/'$/, ''), 10))
.some((n) => isNaN(n) || (n >= HARDENED) || (n < 0))
);
}
+1 -26
View File
@@ -1,31 +1,6 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import './cryptoInit';
import './detectPackage';
export { packageInfo } from './packageInfo';
// all internal exports
export * from './address';
export * from './base32';
export * from './base58';
export * from './base64';
export * from './blake2';
export * from './crypto';
export * from './ethereum';
export * from './hd';
export * from './hmac';
export * from './json';
export * from './keccak';
export * from './key';
export * from './mnemonic';
export * from './nacl';
export * from './pbkdf2';
export * from './random';
export * from './schnorrkel';
export * from './scrypt';
export * from './secp256k1';
export * from './sha512';
export * from './signature';
export * from './xxhash';
export * from './bundle';
+1 -1
View File
@@ -11,7 +11,7 @@ import { ENCODING, NONCE_LENGTH, SCRYPT_LENGTH } from './constants';
export function jsonDecryptData (encrypted?: Uint8Array | null, passphrase?: string | null, encType: EncryptedJsonEncoding[] = ENCODING): Uint8Array {
assert(encrypted, 'No encrypted data available to decode');
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encypted data');
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encrypted data');
let encoded: Uint8Array | null = encrypted;
+5 -15
View File
@@ -6,8 +6,6 @@ import { waitReady } from '@polkadot/wasm-crypto';
import { keccakAsU8a } from '.';
const BITS: (256 | 512)[] = [256, 512];
describe('keccakAsU8a', (): void => {
beforeEach(async (): Promise<void> => {
await waitReady();
@@ -23,29 +21,21 @@ describe('keccakAsU8a', (): void => {
)
};
BITS.forEach((bitLength): void => {
[false, true].forEach((onlyJs): void => {
it(`returns an hex representation (string, bitLength=${bitLength}, onlyJs=${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
describe.each([256, 512] as (256 | 512)[])('bitLength=$p', (bitLength): void => {
it('returns an hex representation (string)', (): void => {
expect(
keccakAsU8a(input, bitLength, onlyJs)
).toEqual(output[bitLength]);
});
});
});
BITS.forEach((bitLength): void => {
[false, true].forEach((onlyJs): void => {
it(`returns an hex representation (Buffer, bitLength=${bitLength}, onlyJs=${onlyJs.toString()})`, (): void => {
it('returns an hex representation (Buffer)', (): void => {
expect(
keccakAsU8a(Buffer.from(input), bitLength, onlyJs)
).toEqual(output[bitLength]);
});
});
});
BITS.forEach((bitLength): void => {
[false, true].forEach((onlyJs): void => {
it(`returns an hex representation (Uint8Array, bitLength=${bitLength}, onlyJs=${onlyJs.toString()})`, (): void => {
it('returns an hex representation (Uint8Array)', (): void => {
expect(
keccakAsU8a(stringToU8a(input), bitLength, onlyJs)
).toEqual(output[bitLength]);
+7 -11
View File
@@ -1,9 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type BN from 'bn.js';
import { bnToHex, compactAddLength, hexToU8a, isBigInt, isBn, isHex, isNumber, isString, stringToU8a } from '@polkadot/util';
import { BN, bnToHex, compactAddLength, hexToU8a, isBigInt, isBn, isHex, isNumber, isString, stringToU8a } from '@polkadot/util';
import { blake2AsU8a } from '../blake2/asU8a';
@@ -49,7 +47,7 @@ export class DeriveJunction {
return !this.#isHard;
}
public hard (value: number | string | BigInt | BN | Uint8Array): DeriveJunction {
public hard (value: number | string | bigint | BN | Uint8Array): DeriveJunction {
return this.soft(value).harden();
}
@@ -59,16 +57,14 @@ export class DeriveJunction {
return this;
}
public soft (value: number | string | BigInt | BN | Uint8Array): DeriveJunction {
public soft (value: number | string | bigint | BN | Uint8Array): DeriveJunction {
if (isNumber(value) || isBn(value) || isBigInt(value)) {
return this.soft(bnToHex(value, BN_OPTIONS));
} else if (isHex(value)) {
return this.soft(hexToU8a(value));
} else if (isString(value)) {
return isHex(value)
? this.soft(hexToU8a(value))
: this.soft(compactAddLength(stringToU8a(value)));
}
if (value.length > JUNCTION_ID_LEN) {
return this.soft(compactAddLength(stringToU8a(value)));
} else if (value.length > JUNCTION_ID_LEN) {
return this.soft(blake2AsU8a(value));
}
+1 -1
View File
@@ -28,7 +28,7 @@ export function keyExtractPath (derivePath: string): ExtractResult {
});
}
assert(constructed === derivePath, `Re-constructed path "${constructed}" does not match input`);
assert(constructed === derivePath, () => `Re-constructed path "${constructed}" does not match input`);
return {
parts,
@@ -16,20 +16,16 @@ describe('mnemonicGenerate', (): void => {
).toEqual(true);
});
[false, true].forEach((onlyJs): void => {
([12, 15, 18, 21, 24] as WordCount[]).forEach((num: WordCount): void => {
it(`generates a valid mnemonic (${num} words, onlyJs=${onlyJs.toString()})`, (): void => {
const mnemonic = mnemonicGenerate(num, onlyJs);
const isValid = mnemonicValidate(mnemonic);
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it.each([12, 15, 18, 21, 24] as WordCount[])('generates a valid mnemonic (%p words)', (num): void => {
const mnemonic = mnemonicGenerate(num, onlyJs);
const isValid = mnemonicValidate(mnemonic);
expect(mnemonic.split(' ')).toHaveLength(num);
expect(isValid).toEqual(true);
});
expect(mnemonic.split(' ')).toHaveLength(num);
expect(isValid).toEqual(true);
});
});
[true, false].forEach((onlyJs): void => {
it(`generates not deterministic (onlyJs=${onlyJs.toString()})`, (): void => {
it('generates not deterministic', (): void => {
const m1 = mnemonicGenerate(24, onlyJs);
const m2 = mnemonicGenerate(24, onlyJs);
@@ -12,9 +12,9 @@ describe('mnemonicToEntropy', (): void => {
await cryptoWaitReady();
});
tests.forEach(([mnemonic, entropy], index): void => {
[false, true].forEach((onlyJs): void => {
it(`Created correct entropy for ${index} (onlyJs = ${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
tests.forEach(([mnemonic, entropy], index): void => {
it(`Created correct entropy for ${index}`, (): void => {
expect(u8aToHex(mnemonicToEntropy(mnemonic, onlyJs))).toEqual(entropy);
});
});
@@ -15,35 +15,29 @@ describe('mnemonicToLegacySeed', (): void => {
await waitReady();
});
[undefined, 'foo', 'bar'].forEach((password): void => {
it(`generates Wasm & Js equivalents (password = ${password || 'undefined'})`, (): void => {
expect(
u8aEq(
mnemonicToLegacySeed(MNEMONIC, password, true),
mnemonicToLegacySeed(MNEMONIC, password, false)
)
).toEqual(true);
});
it.each([undefined, 'foo', 'bar'])('generates Wasm & Js equivalents (password = %p', (password): void => {
expect(
u8aEq(
mnemonicToLegacySeed(MNEMONIC, password, true),
mnemonicToLegacySeed(MNEMONIC, password, false)
)
).toEqual(true);
});
[false, true].forEach((onlyJs): void => {
it(`generates a valid 64bytes seed (onlyJs = ${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('generates a valid 64bytes seed', (): void => {
expect(
u8aToHex(mnemonicToLegacySeed(MNEMONIC, undefined, onlyJs, 64))
).toEqual(SEED_64);
});
});
[false, true].forEach((onlyJs): void => {
it(`generates a valid 32bytes seed (onlyJs = ${onlyJs.toString()})`, (): void => {
it('generates a valid 32bytes seed', (): void => {
expect(
u8aToHex(mnemonicToLegacySeed(MNEMONIC, undefined, onlyJs))
).toEqual(SEED_32);
});
});
[false, true].forEach((onlyJs): void => {
it(`fails with non-mnemonics (onlyJs = ${onlyJs.toString()})`, (): void => {
it('fails with non-mnemonics', (): void => {
expect(
() => mnemonicToLegacySeed('foo bar baz', undefined, onlyJs)
).toThrow(/mnemonic specified/);
@@ -14,19 +14,19 @@ import { mnemonicValidate } from './validate';
* <BR>
*
* ```javascript
* import { mnemonicGenerate, mnemonicToBip39, mnemonicValidate } from '@polkadot/util-crypto';
* import { mnemonicGenerate, mnemonicToLegacySeed, mnemonicValidate } from '@polkadot/util-crypto';
*
* const mnemonic = mnemonicGenerate(); // => string
* const isValidMnemonic = mnemonicValidate(mnemonic); // => boolean
*
* if (isValidMnemonic) {
* console.log(`Seed generated from mnemonic: ${mnemonicToBip39(mnemonic)}`); => u8a
* console.log(`Seed generated from mnemonic: ${mnemonicToLegacySeed(mnemonic)}`); => u8a
* }
* ```
*/
export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs = false, byteLength: 32 | 64 = 32): Uint8Array {
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
assert([32, 64].includes(byteLength), `Invalid seed length ${byteLength}, expected 32 or 64`);
assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`);
if (byteLength && byteLength === 32) {
return isReady() && !onlyJs
@@ -15,28 +15,30 @@ describe('mnemonicToMiniSecret', (): void => {
await cryptoWaitReady();
});
[undefined, 'foo', 'bar'].forEach((password): void => {
it(`generates Wasm & Js equivalents (password = ${password || 'undefined'})`, (): void => {
expect(
u8aEq(
mnemonicToMiniSecret(MNEMONIC, password, true),
mnemonicToMiniSecret(MNEMONIC, password, false)
)
).toEqual(true);
});
it.each([undefined, 'foo', 'bar'])('generates Wasm & Js equivalents for password = %p', (password): void => {
expect(
u8aEq(
mnemonicToMiniSecret(MNEMONIC, password, true),
mnemonicToMiniSecret(MNEMONIC, password, false)
)
).toEqual(true);
});
[false, true].forEach((onlyJs): void => {
it(`generates a valid seed (onlyJs = ${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('generates a valid seed', (): void => {
expect(
u8aToHex(mnemonicToMiniSecret(MNEMONIC, undefined, onlyJs))
).toEqual(SEED);
});
});
tests.forEach(([mnemonic, , seed], index): void => {
[false, true].forEach((onlyJs): void => {
it(`Created correct seed for ${index} (onlyJs = ${onlyJs.toString()})`, (): void => {
it('fails with non-mnemonics', (): void => {
expect(
() => mnemonicToMiniSecret('foo bar baz', undefined, onlyJs)
).toThrow(/mnemonic specified/);
});
tests.forEach(([mnemonic, , seed], index): void => {
it(`Created correct seed for ${index}`, (): void => {
expect(
u8aToHex(mnemonicToMiniSecret(mnemonic, 'Substrate', onlyJs))
).toEqual(
@@ -46,12 +48,4 @@ describe('mnemonicToMiniSecret', (): void => {
});
});
});
[false, true].forEach((onlyJs): void => {
it(`fails with non-mnemonics (onlyJs = ${onlyJs.toString()})`, (): void => {
expect(
() => mnemonicToMiniSecret('foo bar baz', undefined, onlyJs)
).toThrow(/mnemonic specified/);
});
});
});
@@ -0,0 +1,57 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { arrayRange, u8aEq } from '@polkadot/util';
import { cryptoWaitReady, mnemonicGenerate, mnemonicToMiniSecret, naclKeypairFromSeed, schnorrkelKeypairFromSeed } from '..';
// NOTE: This basically controls how long stuff runs for, YMMV
//
// - 100 runs with 5 checks, takes 2mins on _my_ machine
// - 10_000 runs with 5 checks should be ~3hrs
const NUM_RUNS = 100;
const NUM_CHECKS = 5;
// generate either a JS or WASM mnemonic
describe.each([true, false])('mnemonicToMiniSecret (compare), onlyJsMnemonic=%p', (onlyJsMnemonic): void => {
beforeAll(async (): Promise<void> => {
await cryptoWaitReady();
});
// loop through lots of mnemonics
describe.each(arrayRange(NUM_RUNS))('run=%p', (): void => {
// compare both JS and WASM outputs against original
describe.each([true, false])('onlyJsMini=%p', (onlyJsMini): void => {
// NOTE we cannot actually use the onlyJsMnemonic flag here
const mnemonic = mnemonicGenerate(12);
describe(mnemonic, (): void => {
// do iterations to check and re-check that all matches
it.concurrent.each(arrayRange(NUM_CHECKS))('check=%p', (count): void => {
const minisecret = mnemonicToMiniSecret(mnemonic, count ? `${count}` : '', onlyJsMnemonic);
const edpub = naclKeypairFromSeed(minisecret).publicKey;
const srpub = schnorrkelKeypairFromSeed(minisecret).publicKey;
const testmini = mnemonicToMiniSecret(mnemonic, count ? `${count}` : '', onlyJsMini);
// explicit minisecret compare
expect(
u8aEq(minisecret, testmini)
).toEqual(true);
// compare the sr25519 keypair generated
expect(
u8aEq(srpub, schnorrkelKeypairFromSeed(testmini).publicKey)
).toEqual(true);
// compare ed both in WASM and JS
[true, false].forEach((onlyJsEd): void => {
expect(
u8aEq(edpub, naclKeypairFromSeed(testmini, onlyJsEd).publicKey)
).toEqual(true);
});
});
});
});
});
});
@@ -0,0 +1,12 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import ed2curve from 'ed2curve';
export function convertSecretKeyToCurve25519 (secretKey: Uint8Array): Uint8Array {
return ed2curve.convertSecretKey(secretKey);
}
export function convertPublicKeyToCurve25519 (publicKey: Uint8Array): Uint8Array {
return ed2curve.convertPublicKey(publicKey) as Uint8Array;
}
+1
View File
@@ -15,3 +15,4 @@ export { naclVerify } from './verify';
export { naclBoxKeypairFromSecret } from './box/fromSecret';
export { naclOpen } from './open';
export { naclSeal } from './seal';
export { convertSecretKeyToCurve25519, convertPublicKeyToCurve25519 } from './convertKey';
@@ -31,8 +31,10 @@ describe('naclKeypairFromSeed', (): void => {
});
it('generates a valid publicKey/secretKey pair (u8a)', (): void => {
expect(
naclKeypairFromSeed(TEST)
).toEqual(RESULT);
[true, false].forEach((onlyJs): void => {
expect(
naclKeypairFromSeed(TEST, onlyJs)
).toEqual(RESULT);
});
});
});
@@ -21,8 +21,8 @@ import { ed25519KeypairFromSeed, isReady } from '@polkadot/wasm-crypto';
* naclKeypairFromSeed(...); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclKeypairFromSeed (seed: Uint8Array): Keypair {
if (isReady()) {
export function naclKeypairFromSeed (seed: Uint8Array, onlyJs = false): Keypair {
if (!onlyJs && isReady()) {
const full = ed25519KeypairFromSeed(seed);
return {
+1 -1
View File
@@ -19,7 +19,7 @@ interface Sealed {
* <BR>
*
* ```javascript
* import { naclEncrypt } from '@polkadot/util-crypto';
* import { naclSeal } from '@polkadot/util-crypto';
*
* naclSeal([...], [...], [...], [...]); // => [...]
* ```
+2 -2
View File
@@ -11,8 +11,8 @@ describe('naclSign', (): void => {
await waitReady();
});
[false, true].forEach((onlyJs): void => {
it(`returns a valid signature for the message (onlyJs=${onlyJs.toString()})`, (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a valid signature for the message', (): void => {
expect(
naclSign(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),

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