Compare commits

..
117 Commits
Author SHA1 Message Date
github-actions[bot] 536eef02c5 [CI Skip] release/stable 10.1.9
skip-checks: true
2022-09-24 05:32:50 +00:00
Jaco 3b51154d60 10.1.9 (#1654) 2022-09-24 08:29:24 +03:00
github-actions[bot] f5767e3def [CI Skip] bump/beta 10.1.9-3-x
skip-checks: true
2022-09-23 09:24:05 +00:00
Jaco 29057558ac CHANGELOG (#1653) 2022-09-23 12:20:29 +03:00
github-actions[bot] e591a75988 [CI Skip] bump/beta 10.1.9-2-x
skip-checks: true
2022-09-23 08:22:36 +00:00
Guilane DENGUIR 2fdc1679f2 feat(VTB): Added support for VTB blockchain (#1651)
* feat(VTB): Added support for VTB blockchain

* fix(lint): sorted struct alphabetically
2022-09-23 11:17:55 +03:00
github-actions[bot] 35f6a51a6b [CI Skip] bump/beta 10.1.9-1-x
skip-checks: true
2022-09-22 07:14:37 +00:00
Jaco 640bab086e Bump deps (#1652) 2022-09-22 10:11:01 +03:00
github-actions[bot] 5f9ffca721 [CI Skip] bump/beta 10.1.9-0-x
skip-checks: true
2022-09-17 07:17:42 +00:00
Jaco 2fd9d18910 Bump dev (#1650) 2022-09-17 10:13:13 +03:00
github-actions[bot] 7782eef6e3 [CI Skip] release/stable 10.1.8
skip-checks: true
2022-09-17 06:26:53 +00:00
Jaco 0c477e15c4 10.1.8 (#1649) 2022-09-17 09:22:50 +03:00
github-actions[bot] f39820e9c0 [CI Skip] bump/beta 10.1.8-7-x
skip-checks: true
2022-09-14 08:22:20 +00:00
Jaco 35d1a8e57f Bump deps (#1648) 2022-09-14 11:19:00 +03:00
github-actions[bot] 83567b75c5 [CI Skip] bump/beta 10.1.8-6-x
skip-checks: true
2022-09-13 10:37:41 +00:00
Carlos Medeiros 501d0fa249 add hydradx to knownLedger (#1647)
*update `@zondax/ledger-substrate`

* add hydradx to knownLedger
2022-09-13 13:33:59 +03:00
github-actions[bot] 014702ca16 [CI Skip] bump/beta 10.1.8-5-x
skip-checks: true
2022-09-12 05:59:33 +00:00
Jaco b53d34b41f Bump deps (#1645)
* Bump deps

* ss58 tests

* Bump dev
2022-09-12 08:56:04 +03:00
github-actions[bot] 47d995b88d [CI Skip] bump/beta 10.1.8-4-x
skip-checks: true
2022-09-09 06:04:13 +00:00
Jaco cedba4af0c Bump deps (#1644) 2022-09-09 09:00:38 +03:00
github-actions[bot] df8d84467b [CI Skip] bump/beta 10.1.8-3-x
skip-checks: true
2022-09-07 11:02:13 +00:00
Carlo SalaandJaco c289a83b16 feat: add darwinia to knownLedger (#1643)
Co-authored-by: Jaco <jacogr@gmail.com>
2022-09-07 13:58:25 +03:00
github-actions[bot] a869ba7793 [CI Skip] bump/beta 10.1.8-2-x
skip-checks: true
2022-09-07 10:31:33 +00:00
Jaco 4f4ce3549e Bump deps & CHANGELOG (#1642)
* Bump deps & CHANGELOG

* Downgrade rollup node-resolve
2022-09-07 13:27:13 +03:00
github-actions[bot] ce55d5b7d8 [CI Skip] bump/beta 10.1.8-1-x
skip-checks: true
2022-09-06 12:16:25 +00:00
Carlo Sala 10997a6d73 feat(networks): add phala and khala to knownLedger (#1641)
* chore: update `@zondax/ledger-substrate`

* feat(networks): add phala and khala to knownLedger
2022-09-06 15:12:41 +03:00
github-actions[bot] ebe30a2880 [CI Skip] bump/beta 10.1.8-0-x
skip-checks: true
2022-09-04 04:36:57 +00:00
Jaco b4963cc6bd Expose xxhashAsHex JS tests (#1640) 2022-09-04 07:33:07 +03:00
github-actions[bot] 304f7ad124 [CI Skip] release/stable 10.1.7
skip-checks: true
2022-09-02 08:30:00 +00:00
Jaco 9777bca5d4 10.1.7 (#1639) 2022-09-02 11:26:06 +03:00
github-actions[bot] 4c379e85cc [CI Skip] bump/beta 10.1.7-3-x
skip-checks: true
2022-09-02 08:18:45 +00:00
Jaco 4ee83d3d29 Hoist Ledger interface wrapError (#1638) 2022-09-02 11:15:11 +03:00
github-actions[bot] 40d6a388b2 [CI Skip] bump/beta 10.1.7-2-x
skip-checks: true
2022-08-31 05:53:00 +00:00
Jaco 31f4940ec6 Bump deps (#1637) 2022-08-31 08:48:06 +03:00
github-actions[bot] 1ac50696ca [CI Skip] bump/beta 10.1.7-1-x
skip-checks: true
2022-08-26 15:04:48 +00:00
Jaco 1ca5ff48a0 Pin Github actions (#1636) 2022-08-26 18:00:25 +03:00
github-actions[bot] 8253272901 [CI Skip] bump/beta 10.1.7-0-x
skip-checks: true
2022-08-26 12:54:03 +00:00
Jaco 82c38e9805 Bump TS (#1635) 2022-08-26 15:50:21 +03:00
github-actions[bot] 509834c491 [CI Skip] release/stable 10.1.6
skip-checks: true
2022-08-23 17:59:07 +00:00
Jaco d713a7a116 10.1.6 (#1633)
* 10.1.6

* Promise.resolve() for asyn calls

* Fix tests

* Extra testnet
2022-08-23 20:55:38 +03:00
github-actions[bot] d24e14aa5e [CI Skip] release/stable 10.1.5
skip-checks: true
2022-08-21 05:35:18 +00:00
Jaco b1a4a87926 10.1.5 (#1632) 2022-08-21 08:31:51 +03:00
github-actions[bot] 05e0d36a0e [CI Skip] bump/beta 10.1.5-1-x
skip-checks: true
2022-08-19 08:28:26 +00:00
Jaco 5599a8877c Add new @zondax/ledger-substrate (#1631) 2022-08-19 11:24:47 +03:00
github-actions[bot] 2d850c5ac4 [CI Skip] bump/beta 10.1.5-0-x
skip-checks: true
2022-08-19 07:51:21 +00:00
Jaco 82ba3fb9b1 Bump deps (#1630)
* Bump deps

* Responsebase import

* Do Ledger creation via newSubstrateApp
2022-08-19 10:47:44 +03:00
github-actions[bot] 0aae0e2bc2 [CI Skip] release/stable 10.1.4
skip-checks: true
2022-08-12 08:47:28 +00:00
Jaco 2bcea83e0a 10.1.4 (#1629)
* 10.1.4

* Bump deps
2022-08-12 11:43:55 +03:00
github-actions[bot] 20e126759e [CI Skip] bump/beta 10.1.4-2-x
skip-checks: true
2022-08-12 06:57:47 +00:00
Jaco 566127bcb6 Bump dev (#1628)
* Bump dev

* Adjust deno version

* bn.js import_map
2022-08-12 09:53:00 +03:00
github-actions[bot] b50ee462da [CI Skip] bump/beta 10.1.4-1-x
skip-checks: true
2022-08-10 11:52:51 +00:00
Jaco a3cd2de56d Master build fixes, CHANGELOG (#1627) 2022-08-10 14:48:35 +03:00
pan 7f60123417 add bifrost kusama (#1626) 2022-08-07 17:34:53 +03:00
github-actions[bot] bb124813dc [CI Skip] bump/beta 10.1.4-0-x
skip-checks: true
2022-08-07 08:55:28 +00:00
Jaco 652ede8ce7 Bump dev (#1625) 2022-08-07 11:51:50 +03:00
github-actions[bot] 52d2d38051 [CI Skip] release/stable 10.1.3
skip-checks: true
2022-08-05 13:32:13 +00:00
Jaco 65f627c0dc 10.1.3 (#1624) 2022-08-05 16:28:45 +03:00
github-actions[bot] 9ecf29b83b [CI Skip] bump/beta 10.1.3-5-x
skip-checks: true
2022-08-05 06:02:22 +00:00
Jaco 97b84977b7 Bump dev (#1623) 2022-08-05 08:58:55 +03:00
github-actions[bot] f9315c307f [CI Skip] bump/beta 10.1.3-4-x
skip-checks: true
2022-08-04 07:48:59 +00:00
Jaco c08c947abf Convert assert to if + throw (remaining occurences) (#1622)
* Convert assert to if + throw (remaining occurences)

* Adjust for readability

* CHANGELOG
2022-08-04 10:45:10 +03:00
github-actions[bot] 2d4509c32a [CI Skip] bump/beta 10.1.3-3-x
skip-checks: true
2022-08-03 08:00:59 +00:00
Jaco c6e18b1a9e Optimization of flatten 0 case (#1621)
* Optimizationf or flatten 0 case

* Remove wayward .123deno
2022-08-03 10:57:24 +03:00
github-actions[bot] 515a77781f [CI Skip] bump/beta 10.1.3-2-x
skip-checks: true
2022-08-02 07:56:00 +00:00
Jaco 55d2c149f7 Adjust logger constant map (#1620) 2022-08-02 10:52:23 +03:00
github-actions[bot] 43b959ad1f [CI Skip] bump/beta 10.1.3-1-x
skip-checks: true
2022-08-02 04:35:44 +00:00
Jaco 6708b34a01 Bump deps (#1619) 2022-08-02 07:32:07 +03:00
github-actions[bot] a9a9214f3b [CI Skip] bump/beta 10.1.3-0-x
skip-checks: true
2022-07-30 04:50:00 +00:00
Jaco 8bd77c97a0 Allow errors on GH actions (#1618) 2022-07-30 07:45:49 +03:00
github-actions[bot] ed70e5c65f [CI Skip] release/stable 10.1.2
skip-checks: true
2022-07-29 10:09:28 +00:00
Jaco ca6f157007 10.1.2 (#1617) 2022-07-29 13:06:02 +03:00
github-actions[bot] 6c30e328bb [CI Skip] bump/beta 10.1.2-1-x
skip-checks: true
2022-07-28 08:18:33 +00:00
Jaco 1f6f3c67a8 Bump deps (#1616) 2022-07-28 11:14:19 +03:00
github-actions[bot] d19e2c8469 [CI Skip] bump/beta 10.1.2-0-x
skip-checks: true
2022-07-26 12:06:54 +00:00
Jaco 92f479e0e5 Bump ss58registry (#1615)
* Bump ss58registry

* Adjust
2022-07-26 15:02:34 +03:00
github-actions[bot] 25f9444c53 [CI Skip] release/stable 10.1.1
skip-checks: true
2022-07-21 05:37:00 +00:00
Jaco 6d46f8b24e 10.1.1 (#1614) 2022-07-21 08:33:15 +03:00
github-actions[bot] 0189cdabe9 [CI Skip] bump/beta 10.0.3-19-x
skip-checks: true
2022-07-20 08:51:57 +00:00
Jaco 9d61c2c96c Adjust spread check for .entries() (#1613) 2022-07-20 11:47:55 +03:00
github-actions[bot] 6599b41155 [CI Skip] bump/beta 10.0.3-18-x
skip-checks: true
2022-07-20 08:27:48 +00:00
Jaco 9c05257046 Add ability to spread Map entries (optimization) (#1612) 2022-07-20 11:23:26 +03:00
github-actions[bot] 41e2e67fd0 [CI Skip] bump/beta 10.0.3-17-x
skip-checks: true
2022-07-20 06:39:06 +00:00
Jaco 092fbdd923 Align property & lazy signatures (getName & self) (#1611)
* Align property & lazy signatures (getName & self)

* Adjust tests
2022-07-20 09:34:13 +03:00
github-actions[bot] c1cdc80169 [CI Skip] bump/beta 10.0.3-16-x
skip-checks: true
2022-07-19 19:07:58 +00:00
Jaco 306bbdea12 Pass internal this through on objectProperties (#1610)
* Pass internal this through on objectProperties

* Fix property test
2022-07-19 22:03:26 +03:00
github-actions[bot] f41519e185 [CI Skip] bump/beta 10.0.3-15-x
skip-checks: true
2022-07-19 15:33:00 +00:00
Carlo Sala 1a3fd344b5 feat(ledger): add interlay and unique (#1609) 2022-07-19 18:28:30 +03:00
github-actions[bot] f798c1dbd5 [CI Skip] bump/beta 10.0.3-14-x
skip-checks: true
2022-07-19 08:58:31 +00:00
Jaco 813d358999 hexToU8a lookup optimizations (#1608)
* hexToU8a lookup optimizations

* Non-aligned test
2022-07-19 11:55:01 +03:00
github-actions[bot] e85eb35413 [CI Skip] bump/beta 10.0.3-13-x
skip-checks: true
2022-07-19 05:36:50 +00:00
Jaco 8a50cba394 Additional assert cleanups (#1604) 2022-07-19 08:33:22 +03:00
github-actions[bot] 20f030e987 [CI Skip] bump/beta 10.0.3-12-x
skip-checks: true
2022-07-19 05:28:13 +00:00
Jaco 4a683f41d3 Dev bump (w/ additional deno overrides) (#1607) 2022-07-19 08:23:42 +03:00
github-actions[bot] ea7f59ab73 [CI Skip] bump/beta 10.0.3-11-x
skip-checks: true
2022-07-18 14:54:47 +00:00
Jaco 60498f7f36 Dev bump (#1606) 2022-07-18 17:49:02 +03:00
github-actions[bot] 9ad0c46417 [CI Skip] bump/beta 10.0.3-10-x
skip-checks: true
2022-07-18 13:45:34 +00:00
Jaco 0fc140f838 Additional speed optimizations (#1605) 2022-07-18 16:41:53 +03:00
github-actions[bot] cd63bb695d [CI Skip] bump/beta 10.0.3-9-x
skip-checks: true
2022-07-18 11:55:15 +00:00
Jaco 7eac688074 Small performance adjustments for Uint8Array indexing (#1603) 2022-07-18 14:51:39 +03:00
github-actions[bot] 820a5e4077 [CI Skip] bump/beta 10.0.3-8-x
skip-checks: true
2022-07-18 11:13:19 +00:00
Jaco bc0f69aef0 Create public/secret pairs on add to keyring (#1602)
* Create public/secret pairs on add to keyring

* Remove comment sort

* Adjust pre-compute comment

* Adjust tests

* Fix expectation
2022-07-18 14:09:38 +03:00
github-actions[bot] 5074adf690 [CI Skip] bump/beta 10.0.3-7-x
skip-checks: true
2022-07-18 09:31:32 +00:00
Jaco 8461d105d6 Adjust nobody zero-key pair with pre-computed address (#1601) 2022-07-18 12:27:56 +03:00
github-actions[bot] cd246e2381 [CI Skip] bump/beta 10.0.3-6-x
skip-checks: true
2022-07-17 13:39:12 +00:00
Jaco 8a499bf1bf Bump ss58registry (#1600)
* Bump ss58registry

* Adjust networks deps
2022-07-17 16:35:42 +03:00
github-actions[bot] 5b2ec8e4d6 [CI Skip] bump/beta 10.0.3-5-x
skip-checks: true
2022-07-16 12:44:01 +00:00
Jaco 4a06d1382f Adjust isAscii check to disallow \t, \n, & \r characters (#1599)
* Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters

* Readability (& unused code removal)

* Only > & <
2022-07-16 15:40:30 +03:00
github-actions[bot] 66ac9e15a6 [CI Skip] bump/beta 10.0.3-4-x
skip-checks: true
2022-07-16 08:58:10 +00:00
Jaco 0e55357053 Add arrayUnzip (#1598) 2022-07-16 11:54:02 +03:00
github-actions[bot] b4b80bbf67 [CI Skip] bump/beta 10.0.3-3-x
skip-checks: true
2022-07-15 08:13:43 +00:00
Jaco 4355b9b066 Bump deps (w/ @noble/secp256k1) (#1597) 2022-07-15 11:10:00 +03:00
github-actions[bot] 5c92e095ff [CI Skip] bump/beta 10.0.3-2-x
skip-checks: true
2022-07-11 13:35:08 +00:00
Jaco 4fedd594f1 Dedupe sqrt tests between bi/bn (#1596) 2022-07-11 16:31:41 +03:00
github-actions[bot] 6f05fa6634 [CI Skip] bump/beta 10.0.3-1-x
skip-checks: true
2022-07-11 05:19:12 +00:00
Jaco 856e93f4a0 Bump dev (#1595) 2022-07-11 08:15:26 +03:00
github-actions[bot] 195e42ec11 [CI Skip] bump/beta 10.0.3-0-x
skip-checks: true
2022-07-10 08:38:48 +00:00
Jaco 16e90aadfc Fix .123trigger 2022-07-10 11:35:16 +03:00
110 changed files with 4078 additions and 1882 deletions
-1
View File
@@ -1 +0,0 @@
10.0.2
-39
View File
@@ -1,39 +0,0 @@
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
8,2.6.2,2.12.2,5.2.2,5.2.3,5.4.2,5.4.3,5.4.4,5.5.2,5.6.2,5.6.3,5.9.2,6.0.2,6.0.3,6.0.4,6.0.5,7.0.2,7.0.3,7.1.2,7.8.2,7.9.2,8.0.2,8.0.3,8.0.4,8.0.5,8.1.2,8.2.2,8.3.2,8.3.3,9.6.2,9.7.2
10.0.2
+1 -2
View File
@@ -6,8 +6,7 @@ const base = require('@polkadot/dev/config/eslint.cjs');
module.exports = {
...base,
ignorePatterns: [
...base.ignorePatterns,
'**/deno/*.ts'
...base.ignorePatterns
],
parserOptions: {
...base.parserOptions,
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
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: jacogr/action-approve@master
- uses: jacogr/action-approve@9d6ce78d26f23ad29d009d034822cf773f2cb50e
with:
authors: jacogr
labels: -auto
+1 -1
View File
@@ -8,7 +8,7 @@ jobs:
merge:
runs-on: ubuntu-latest
steps:
- uses: jacogr/action-merge@master
- uses: jacogr/action-merge@3b4b49af8a8644bf5cbb5409ee236abe04eeb1b0
with:
checks: build,lint,test
labels: -auto
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: dessant/lock-threads@v2
- uses: dessant/lock-threads@f1a42f0f44eb83361d617a014663e1a76cf282d2
with:
github-token: ${{ secrets.GH_PAT_BOT }}
issue-lock-inactive-days: '7'
+2 -2
View File
@@ -12,8 +12,8 @@ jobs:
YARN_ENABLE_SCRIPTS: false
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
steps:
- uses: actions/checkout@v2
- uses: denoland/setup-deno@v1
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
- uses: denoland/setup-deno@004814556e37c54a2f6e31384c9e18e983317366
with:
deno-version: vx.x.x
- name: ${{ matrix.step }}
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
with:
fetch-depth: 0
token: ${{ secrets.GH_PAT }}
+2 -2
View File
@@ -12,8 +12,8 @@ jobs:
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: actions/checkout@v2
- uses: returntocorp/semgrep-action@v1
- uses: actions/checkout@7884fcad6b5d53d10323aee724dc68d8b9096a2e
- uses: returntocorp/semgrep-action@aeafd770072c4f48798b991e3449592bddc2c435
with:
auditOn: push
publishToken: ${{ secrets.SEMGREP_APP_TOKEN }}
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: actions/stale@v3
- uses: actions/stale@98ed4cb500039dbcccf4bd9bedada4d0187f2757
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.'
+1 -7
View File
@@ -1,12 +1,8 @@
--test-*
_book/
build/
build-cjs/
build-esm/
build-deno/
build-docs/
build-*/
coverage/
docs/.vuepress/dist/
node_modules/
tmp/
/import_map.json
@@ -29,6 +25,4 @@ npm-debug.log*
package-lock.json
yarn-debug.log*
yarn-error.log*
store.db
store.db.compacted
tsconfig.*buildinfo
+88
View File
@@ -1,5 +1,93 @@
# CHANGELOG
## 10.1.9 Sep 24, 2022
Contributed:
- Ledger support for VTB (Thanks to https://github.com/GuilaneDen)
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.8 Sep 17, 2022
Contributed:
- Ledger support for Darwinia, Phala & Khala (Thanks to https://github.com/carlosala)
- Ledger support for HydraX (Thanks to https://github.com/chcmedeiros)
Changes:
- Expand test cases
- Upgrade dependencies to latest stable versions
## 10.1.7 Sep 2, 2022
Changes:
- Hoist Ledger interface wrapError (internal adjustment)
- Upgrade dependencies to latest stable versions
## 10.1.6 Aug 23, 2022
Changes:
- Adjust `nextTick` with greater care for browser loops
- Upgrade dependencies to latest stable versions
## 10.1.5 Aug 21, 2022
Changes:
- Adjust `ledgerApps` to use new `@zondax/ledger-substrate` interfaces
- Upgrade dependencies to latest stable versions
## 10.1.4 Aug 12, 2022
Contributed:
- Ledger support for Kusama Bifrost (Thanks to https://github.com/awesomepan)
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.3 Aug 5, 2022
Changes:
- Optimization for empty `arrayFlatten` case
- Coding cleanups for logger (no `as` casting)
- Optiomizations in assertion checks
## 10.1.2 Jul 29, 2022
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.1 Jul 21, 2022
Changes:
- Add `arrayUnzip` as reverse of `arrayZip`
- Adjust `objectSpread` to natively handle `Map` entries spreads
- Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters
- Adjust `nobody` zero-key pair with pre-computed address
- Align `objectProperty` & `lazyMethod` call signatures (backwards compatible)
- Various internal speed optimizations
- Upgrade dependencies to latest stable versions
## 10.0.2 Jul 10, 2022
Changes:
+5 -3
View File
@@ -1,12 +1,12 @@
1412 Jaco Work-around for Jest + dynamic imports (#1594)
1465 Jaco 10.1.9 (#1654)
9 Antoine Estienne Add eth uri keyring test (#1291)
8 Carlo Sala feat: add darwinia to knownLedger (#1643)
6 Amaury Martiny Add tests from Rust (#283)
5 Carlo Sala feat(networks): add ledger support for Aleph Zero (#1588)
5 Jakub Pánik Add HydraDX parachain to genesis (#1583)
5 kwingram25 Add BN consts and timeToString (#610)
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
4 pan add bifrost kusama (#1626)
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
3 pan update bifrost genesis hash (#1521)
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
2 Gav Wood Fix stake:unstake (#182)
2 Hyungsuk Kang Add cross client Encryption/Decryption (#496)
@@ -21,7 +21,9 @@
1 amphineko chore: fix typo in versionDetect messages (#941)
1 Axel Chalon Simplify @polkadot/keyring KeyringPair (#419)
1 Brad Larson [FIX] Adjust error message (#646)
1 Carlos Medeiros add hydradx to knownLedger (#1647)
1 Eliott Teissonniere add nodle ledger specs (#1089)
1 Guilane DENGUIR feat(VTB): Added support for VTB blockchain (#1651)
1 h4x3rotab Throws an error when signing with a locked keypair (#578)
1 Harry Liu Update README.md (#446)
1 Hoon Kim replace plasm genesis with astar (#1397)
+5
View File
@@ -0,0 +1,5 @@
{
"imports": {
"https://esm.sh/v90/@types/bn.js@~5.2/index.d.ts": "https://esm.sh/v90/@types/bn.js@5.1.0/index.d.ts"
}
}
+10 -6
View File
@@ -11,29 +11,33 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"versions": {
"git": "10.1.9",
"npm": "10.1.9"
},
"workspaces": [
"packages/*"
],
"scripts": {
"build": "polkadot-dev-build-ts",
"build:networks": "yarn test:one packages/networks/src",
"build:release": "polkadot-ci-ghact-build",
"build:rollup": "polkadot-exec-rollup --config",
"clean": "polkadot-dev-clean-build",
"deno": "yarn polkadot-dev-deno-map && yarn build && deno check --import-map=import_map.json mod.ts",
"lint": "polkadot-dev-run-lint",
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
"postinstall": "polkadot-dev-yarn-only",
"test": "NODE_OPTIONS=--experimental-vm-modules 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.18.6",
"@polkadot/dev": "^0.67.65",
"@types/jest": "^28.1.4"
"@babel/core": "^7.19.1",
"@polkadot/dev": "^0.67.131",
"@types/jest": "^29.0.3"
},
"resolutions": {
"typescript": "^4.7.4"
"typescript": "^4.8.3"
}
}
View File
+7 -7
View File
@@ -16,18 +16,18 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@ledgerhq/hw-transport": "^6.27.1",
"@ledgerhq/hw-transport-webhid": "^6.27.1",
"@ledgerhq/hw-transport-webusb": "^6.27.1",
"@polkadot/util": "10.0.2"
"@babel/runtime": "^7.19.0",
"@ledgerhq/hw-transport": "^6.27.4",
"@ledgerhq/hw-transport-webhid": "^6.27.4",
"@ledgerhq/hw-transport-webusb": "^6.27.4",
"@polkadot/util": "10.1.9"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid-singleton": "^6.27.2"
"@ledgerhq/hw-transport-node-hid-singleton": "^6.28.0"
}
}
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '10.1.9' };
+6 -6
View File
@@ -19,13 +19,13 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@ledgerhq/hw-transport": "^6.27.1",
"@polkadot/hw-ledger-transports": "10.0.2",
"@polkadot/util": "10.0.2",
"@zondax/ledger-substrate": "^0.32.0"
"@babel/runtime": "^7.19.0",
"@ledgerhq/hw-transport": "^6.27.4",
"@polkadot/hw-ledger-transports": "10.1.9",
"@polkadot/util": "10.1.9",
"@zondax/ledger-substrate": "^0.39.0"
}
}
+18 -15
View File
@@ -1,9 +1,12 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { ResponseBase, SubstrateApp } from '@zondax/ledger-substrate';
import type { SubstrateApp } from '@zondax/ledger-substrate';
import type { ResponseBase } from '@zondax/ledger-substrate/dist/common';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
import { newSubstrateApp } from '@zondax/ledger-substrate';
import { transports } from '@polkadot/hw-ledger-transports';
import { u8aToBuffer } from '@polkadot/util';
@@ -14,6 +17,16 @@ export { packageInfo } from './packageInfo';
type Chain = keyof typeof ledgerApps;
async function wrapError <T extends ResponseBase> (promise: Promise<T>): Promise<T> {
const result = await promise;
if (result.return_code !== LEDGER_SUCCESS_CODE) {
throw new Error(result.error_message);
}
return result;
}
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
// - Promises return errors (instead of wrapper errors)
@@ -38,7 +51,7 @@ export class Ledger {
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));
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
return {
address,
@@ -49,7 +62,7 @@ export class Ledger {
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());
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
return {
isLocked,
@@ -62,7 +75,7 @@ export class Ledger {
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));
const { signature } = await wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
return {
signature: `0x${signature.toString('hex')}`
@@ -80,7 +93,7 @@ export class Ledger {
const transport = await def.create();
this.#app = ledgerApps[this.#chain](transport);
this.#app = newSubstrateApp(transport, ledgerApps[this.#chain]);
}
return this.#app;
@@ -97,14 +110,4 @@ export class Ledger {
throw error;
}
};
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
const result = await promise;
if (result.return_code !== LEDGER_SUCCESS_CODE) {
throw new Error(result.error_message);
}
return result;
};
}
+16
View File
@@ -0,0 +1,16 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { supportedApps } from '@zondax/ledger-substrate';
import { ledgerApps } from './defaults';
describe('ledgerApps', (): void => {
it.each(Object.keys(ledgerApps))('%s is known', (k): void => {
expect(
supportedApps.find(({ name }) =>
name === ledgerApps[k]
)
).toBeDefined();
});
});
+32 -28
View File
@@ -1,33 +1,37 @@
// Copyright 2017-2022 @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 { newAcalaApp, newAlephZeroApp, newAstarApp, newBifrostApp, newCentrifugeApp, newComposableApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKaruraApp, newKusamaApp, newNodleApp, newParallelApp, newPolkadexApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStafiApp, newStatemineApp, newStatemintApp, newXXNetworkApp } from '@zondax/ledger-substrate';
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
acala: newAcalaApp,
'aleph-node': newAlephZeroApp,
astar: newAstarApp,
bifrost: newBifrostApp,
centrifuge: newCentrifugeApp,
composable: newComposableApp,
'dock-mainnet': newDockApp,
edgeware: newEdgewareApp,
equilibrium: newEquilibriumApp,
genshiro: newGenshiroApp,
karura: newKaruraApp,
kusama: newKusamaApp,
'nodle-para': newNodleApp,
parallel: newParallelApp,
polkadex: newPolkadexApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp,
sora: newSoraApp,
stafi: newStafiApp,
statemine: newStatemineApp,
statemint: newStatemintApp,
xxnetwork: newXXNetworkApp
// and maps to the known name in the @zondax/ledger-substrate/supported_apps package
export const ledgerApps: Record<string, string> = {
acala: 'Acala',
'aleph-node': 'AlephZero',
astar: 'Astar',
bifrost: 'Bifrost',
'bifrost-kusama': 'BifrostKusama',
centrifuge: 'Centrifuge',
composable: 'Composable',
darwinia: 'Darwinia',
'dock-mainnet': 'Dock',
edgeware: 'Edgeware',
equilibrium: 'Equilibrium',
genshiro: 'Genshiro',
hydradx: 'HydraDX',
'interlay-parachain': 'Interlay',
karura: 'Karura',
khala: 'Khala',
kusama: 'Kusama',
'nodle-para': 'Nodle',
parallel: 'Parallel',
phala: 'Phala',
polkadex: 'Polkadex',
polkadot: 'Polkadot',
polymesh: 'Polymesh',
sora: 'Sora',
stafi: 'Stafi',
statemine: 'Statemine',
statemint: 'Statemint',
unique: 'Unique',
vtb: 'VTB',
xxnetwork: 'XXNetwork'
};
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '10.1.9' };
+6 -6
View File
@@ -20,15 +20,15 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/util": "10.0.2",
"@polkadot/util-crypto": "10.0.2"
"@babel/runtime": "^7.19.0",
"@polkadot/util": "10.1.9",
"@polkadot/util-crypto": "10.1.9"
},
"peerDependencies": {
"@polkadot/util": "10.0.2",
"@polkadot/util-crypto": "10.0.2"
"@polkadot/util": "10.1.9",
"@polkadot/util-crypto": "10.1.9"
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '10.1.9' };
+7 -3
View File
@@ -4,7 +4,7 @@
import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types';
import type { PairInfo } from './types';
import { assert, u8aEq } from '@polkadot/util';
import { u8aEq } from '@polkadot/util';
import { jsonDecryptData } from '@polkadot/util-crypto';
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
@@ -22,7 +22,9 @@ export function decodePair (passphrase?: string, encrypted?: Uint8Array | null,
const decrypted = jsonDecryptData(encrypted, passphrase, encType);
const header = decrypted.subarray(0, PKCS8_HEADER.length);
assert(u8aEq(header, PKCS8_HEADER), 'Invalid Pkcs8 header found in body');
if (!u8aEq(header, PKCS8_HEADER)) {
throw new Error('Invalid Pkcs8 header found in body');
}
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
let divOffset = SEED_OFFSET + SEC_LENGTH;
@@ -34,7 +36,9 @@ export function decodePair (passphrase?: string, encrypted?: Uint8Array | null,
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
assert(u8aEq(divider, PKCS8_DIVIDER), 'Invalid Pkcs8 divider found in body');
if (!u8aEq(divider, PKCS8_DIVIDER)) {
throw new Error('Invalid Pkcs8 divider found in body');
}
}
const pubOffset = divOffset + PKCS8_DIVIDER.length;
+4 -2
View File
@@ -3,13 +3,15 @@
import type { PairInfo } from './types';
import { assert, u8aConcat } from '@polkadot/util';
import { u8aConcat } from '@polkadot/util';
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
assert(secretKey, 'Expected a valid secretKey to be passed to encode');
if (!secretKey) {
throw new Error('Expected a valid secretKey to be passed to encode');
}
const encoded = u8aConcat(
PKCS8_HEADER,
+2 -2
View File
@@ -217,11 +217,11 @@ describe('pair', (): void => {
});
it('allows derivation on the pair', (): void => {
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: PAIRSSR25519[0].publicKey, secretKey: PAIRSSR25519[0].secretKey }, {});
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: hexToU8a(PAIRSSR25519[0].p), secretKey: hexToU8a(PAIRSSR25519[0].s) }, {});
const stash = alice.derive('//stash');
const soft = alice.derive('//funding/0');
expect(stash.publicKey).toEqual(PAIRSSR25519[1].publicKey);
expect(stash.publicKey).toEqual(hexToU8a(PAIRSSR25519[1].p));
expect(soft.address).toEqual('5ECQNn7UueWHPFda5qUi4fTmTtyCnPvGnuoyVVSj5CboJh9J');
});
+22 -9
View File
@@ -6,7 +6,7 @@ import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
import type { PairInfo } from './types';
import { assert, objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclOpen, naclSeal, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';
import { decodePair } from './decode';
@@ -145,8 +145,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
// eslint-disable-next-line sort-keys
decodePkcs8,
decryptMessage: (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
if (isLocked(secretKey)) {
throw new Error('Cannot encrypt with a locked key pair');
} else if (['ecdsa', 'ethereum'].includes(type)) {
throw new Error('Secp256k1 not supported yet');
}
const messageU8a = u8aToU8a(encryptedMessageWithNonce);
@@ -158,8 +161,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
);
},
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');
if (type === 'ethereum') {
throw new Error('Unable to derive on this keypair');
} else if (isLocked(secretKey)) {
throw new Error('Cannot derive on a locked keypair');
}
const { path } = keyExtractPath(suri);
const derived = keyFromPath({ publicKey, secretKey }, path, type);
@@ -170,8 +176,11 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
return recode(passphrase);
},
encryptMessage: (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
if (isLocked(secretKey)) {
throw new Error('Cannot encrypt with a locked key pair');
} else if (['ecdsa', 'ethereum'].includes(type)) {
throw new Error('Secp256k1 not supported yet');
}
const { nonce, sealed } = naclSeal(u8aToU8a(message), convertSecretKeyToCurve25519(secretKey), convertPublicKeyToCurve25519(u8aToU8a(recipientPublicKey)), nonceIn);
@@ -184,7 +193,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
meta = objectSpread({}, meta, additional);
},
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
if (isLocked(secretKey)) {
throw new Error('Cannot sign with a locked key pair');
}
return u8aConcat(
options.withType
@@ -212,7 +223,9 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;
},
vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
if (isLocked(secretKey)) {
throw new Error('Cannot sign with a locked key pair');
}
if (type === 'sr25519') {
return sr25519VrfSign(message, { secretKey }, context, extra);
+4 -3
View File
@@ -3,10 +3,11 @@
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
import { encodeAddress } from '@polkadot/util-crypto';
// empty publicKey
const publicKey = new Uint8Array(32);
const address = encodeAddress(publicKey);
// pre-computed via encodeAddress(publicKey)
const address = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
const meta = {
isTesting: true,
+39 -34
View File
@@ -1,19 +1,20 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
import type { KeypairType } from '@polkadot/util-crypto/types';
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';
interface PairDef {
name?: string;
publicKey: Uint8Array;
p: HexString;
s: HexString;
seed?: string;
secretKey?: Uint8Array;
type: KeypairType
}
@@ -23,50 +24,50 @@ interface PairDef {
// adding the keys when only the keyring is used.
export const PAIRSSR25519: PairDef[] = [
{
publicKey: hexToU8a('0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'),
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'), // nosemgrep
p: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
s: '0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011', // nosemgrep
seed: 'Alice',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'),
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'), // nosemgrep
p: '0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f',
s: '0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd', // nosemgrep
seed: 'Alice//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48'),
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'), // nosemgrep
p: '0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48',
s: '0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325', // nosemgrep
seed: 'Bob',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e'),
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'), // nosemgrep
p: '0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e',
s: '0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde', // nosemgrep
seed: 'Bob//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22'),
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'), // nosemgrep
p: '0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22',
s: '0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c', // nosemgrep
seed: 'Charlie',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20'),
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'), // nosemgrep
p: '0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20',
s: '0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568', // nosemgrep
seed: 'Dave',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e'),
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'), // nosemgrep
p: '0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e',
s: '0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587', // nosemgrep
seed: 'Eve',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c'),
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'), // nosemgrep
p: '0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c',
s: '0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426', // nosemgrep
seed: 'Ferdie',
type: 'sr25519'
}
@@ -75,38 +76,38 @@ export const PAIRSSR25519: PairDef[] = [
export const PAIRSETHEREUM: PairDef[] = [
{
name: 'Alith',
publicKey: hexToU8a('0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f'),
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'), // nosemgrep
p: '0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f',
s: '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133', // nosemgrep
type: 'ethereum'
},
{
name: 'Baltathar',
publicKey: hexToU8a('0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518'),
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'), // nosemgrep
p: '0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518',
s: '0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b', // nosemgrep
type: 'ethereum'
},
{
name: 'Charleth',
publicKey: hexToU8a('0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e'),
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'), // nosemgrep
p: '0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e',
s: '0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b', // nosemgrep
type: 'ethereum'
},
{
name: 'Dorothy',
publicKey: hexToU8a('0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c'),
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'), // nosemgrep
p: '0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c',
s: '0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68', // nosemgrep
type: 'ethereum'
},
{
name: 'Ethan',
publicKey: hexToU8a('0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa'),
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'), // nosemgrep
p: '0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa',
s: '0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4', // nosemgrep
type: 'ethereum'
},
{
name: 'Faith',
publicKey: hexToU8a('0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74'),
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'), // nosemgrep
p: '0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74',
s: '0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df', // nosemgrep
type: 'ethereum'
}
];
@@ -130,16 +131,20 @@ function createMeta (name?: string, seed?: string) {
*/
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
const keyring = new Keyring(options);
const pairs = (options.type && options.type === 'ethereum')
const pairs = options.type === 'ethereum'
? PAIRSETHEREUM
: PAIRSSR25519;
for (const { name, publicKey, secretKey, seed, type } of pairs) {
for (const { name, p, s, seed, type } of pairs) {
const meta = createMeta(name, seed);
const pair = !isDerived && !name && seed
? keyring.addFromUri(seed, meta, options.type)
: keyring.addPair(
createPair({ toSS58: keyring.encodeAddress, type }, { publicKey, secretKey }, meta)
createPair(
{ toSS58: keyring.encodeAddress, type },
{ publicKey: hexToU8a(p), secretKey: hexToU8a(s) },
meta
)
);
pair.lock = (): void => {
+5 -6
View File
@@ -17,15 +17,14 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/util": "10.0.2",
"@substrate/ss58-registry": "^1.23.0"
"@babel/runtime": "^7.19.0",
"@polkadot/util": "10.1.9",
"@substrate/ss58-registry": "^1.29.1"
},
"devDependencies": {
"@polkadot/hw-ledger": "10.0.2",
"@polkadot/x-fetch": "10.0.2"
"@polkadot/hw-ledger": "10.1.9"
}
}
-75
View File
@@ -1,75 +0,0 @@
// Copyright 2017-2022 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Ss58Registry } from './types';
import fs from 'fs';
import { objectKeys, stringify } from '@polkadot/util';
import { fetch } from '@polkadot/x-fetch';
import { allNetworks } from './';
const REGISTRY = 'https://raw.githubusercontent.com/paritytech/ss58-registry/main/ss58-registry.json';
const OUTPUT = './.github/ss58-check.md';
function assertAndLog (check: boolean, error: string): void {
if (!check) {
process.env.CI_LOG && fs.appendFileSync(OUTPUT, `
${error}
`);
throw new Error(error);
}
}
describe('check latest Substrate ss58 registry', (): void => {
let original: Ss58Registry;
beforeAll(async (): Promise<void> => {
original = (await (await fetch(REGISTRY)).json()) as Ss58Registry;
});
it('has the same number as the original', (): void => {
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 }) => !allNetworks.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
});
it('has no extra entries', (): void => {
const missing = allNetworks
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
});
it('has the same values as the original', (): void => {
const fields = objectKeys(original.schema);
const errors = original.registry
.map((n): [string, string[]] => {
const other = allNetworks.find(({ prefix }) => prefix === n.prefix);
return [
`${n.displayName} (${n.prefix})`,
other
? fields.filter((f) =>
['decimals', 'symbols'].includes(f)
? stringify(n[f] || []) !== stringify(other[f] || [])
: stringify(n[f]) !== stringify(other[f])
)
: []
];
})
.filter(([, fields]) => fields.length);
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
});
});
+22
View File
@@ -23,6 +23,9 @@ export const knownGenesis: KnownGenesis = {
bifrost: [
'0x262e1b2ad728475fd6fe88e62d34c200abe6fd693931ddad144059b1eb884e5b'
],
'bifrost-kusama': [
'0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
],
centrifuge: [
'0xb3db41421702df9a7fcac62b53ffeac85f7853cc4e689e0b93aeb3db18c09d82',
'0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
@@ -30,6 +33,9 @@ export const knownGenesis: KnownGenesis = {
composable: [
'0xdaab8df776eb52ec604a5df5d388bb62a050a0aaec4556a64265b9d42755552d'
],
darwinia: [
'0xe71578b37a7c799b0ab4ee87ffa6f059a6b98f71f06fb8c84a8d88013a548ad6'
],
'dock-mainnet': [
'0x6bfe24dca2a3be10f22212678ac13a6446ec764103c0f3471c71609eac384aae',
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
@@ -50,9 +56,15 @@ export const knownGenesis: KnownGenesis = {
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
],
'interlay-parachain': [
'0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
],
karura: [
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
],
khala: [
'0xd43540ba6d3eb4897c28a77d48cb5b729fea37603cbbfc7a86a73b72adb3be8d'
],
kulupu: [
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
],
@@ -67,6 +79,9 @@ export const knownGenesis: KnownGenesis = {
parallel: [
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
],
phala: [
'0x1bb969d85965e4bb5a651abbedf21a54b6b31a21f66b5401cc3f1e286268d736'
],
picasso: [
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
],
@@ -108,6 +123,13 @@ export const knownGenesis: KnownGenesis = {
subsocial: [
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
],
unique: [
'0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
],
vtb: [
'0x286bc8414c7000ce1d6ee6a834e29a54c1784814b76243eb77ed0b2c5573c60f',
'0x7483b89572fb2bd687c7b9a93b242d0b237f9aba463aba07ec24503931038aaa'
],
westend: [
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
],
+8
View File
@@ -12,16 +12,22 @@ export const knownLedger: KnownLedger = {
'aleph-node': 0x00000283,
astar: 0x0000032a,
bifrost: 0x00000314,
'bifrost-kusama': 0x00000314,
centrifuge: 0x000002eb,
composable: 0x00000162,
darwinia: 0x00000162,
'dock-mainnet': 0x00000252,
edgeware: 0x0000020b,
equilibrium: 0x05f5e0fd,
genshiro: 0x05f5e0fc,
hydradx: 0x00000162,
'interlay-parachain': 0x00000162,
karura: 0x000002ae,
khala: 0x000001b2,
kusama: 0x000001b2,
'nodle-para': 0x000003eb,
parallel: 0x00000162,
phala: 0x00000162,
polkadex: 0x0000031f,
polkadot: 0x00000162,
polymesh: 0x00000253,
@@ -29,5 +35,7 @@ export const knownLedger: KnownLedger = {
stafi: 0x0000038b,
statemine: 0x000001b2, // common-good on Kusama, shares derivation
statemint: 0x00000162, // common-good on Polkadot, shares derivation
unique: 0x00000162,
vtb: 0x000002b6,
xxnetwork: 0x000007a3
};
@@ -10,6 +10,7 @@ export const knownTestnet: KnownTestnet = {
'dock-testnet': true,
jupiter: true,
'mathchain-testnet': true,
p3dt: true,
subspace_testnet: true,
'zero-alphaville': true
};
+1 -1
View File
@@ -11,7 +11,7 @@ describe('availableNetworks', (): void => {
expect(availableNetworks.slice(0, 3).map(({ prefix }) => prefix)).toEqual([0, 2, 42]);
});
it('has a sorted list (first external, last external)', (): void => {
it.skip('has a sorted list (first external, last external)', (): void => {
expect(availableNetworks[3].displayName).toEqual('Acala');
expect(availableNetworks[availableNetworks.length - 1].displayName).toEqual('ZERO');
});
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/networks', path: 'auto', type: 'auto', version: '10.1.9' };
+257 -19
View File
@@ -232,6 +232,19 @@
"standardAccount": "*25519",
"website": "https://darwinia.network/"
},
{
"prefix": 19,
"network": "watr",
"displayName": "Watr Protocol",
"symbols": [
"WATR"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://www.watr.org"
},
{
"prefix": 20,
"network": "stafi",
@@ -599,9 +612,11 @@
"network": "oak",
"displayName": "OAK Network",
"symbols": [
"OAK"
"OAK",
"TUR"
],
"decimals": [
10,
10
],
"standardAccount": "*25519",
@@ -767,6 +782,32 @@
"standardAccount": "*25519",
"website": "https://sora.org"
},
{
"prefix": 71,
"network": "p3d",
"displayName": "3DP network",
"symbols": [
"P3D"
],
"decimals": [
12
],
"standardAccount": "*25519",
"website": "https://3dpass.org"
},
{
"prefix": 72,
"network": "p3dt",
"displayName": "3DP test network",
"symbols": [
"P3Dt"
],
"decimals": [
12
],
"standardAccount": "*25519",
"website": "https://3dpass.org"
},
{
"prefix": 73,
"network": "zeitgeist",
@@ -832,6 +873,19 @@
"standardAccount": "*25519",
"website": "https://polkadex.trade"
},
{
"prefix": 92,
"network": "anmol",
"displayName": "Anmol Network",
"symbols": [
"ANML"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://anmol.network/"
},
{
"prefix": 93,
"network": "fragnova",
@@ -871,6 +925,19 @@
"standardAccount": "*25519",
"website": "https://polkafoundry.com"
},
{
"prefix": 100,
"network": "ibtida",
"displayName": "Anmol Network Ibtida Canary network",
"symbols": [
"IANML"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://anmol.network/"
},
{
"prefix": 101,
"network": "origintrail-parachain",
@@ -932,6 +999,19 @@
"standardAccount": "*25519",
"website": "https://invarch.network"
},
{
"prefix": 126,
"network": "joystream",
"displayName": "Joystream",
"symbols": [
"JOY"
],
"decimals": [
10
],
"standardAccount": "*25519",
"website": "https://www.joystream.org"
},
{
"prefix": 128,
"network": "clover",
@@ -945,6 +1025,19 @@
"standardAccount": "*25519",
"website": "https://clover.finance"
},
{
"prefix": 129,
"network": "dorafactory-polkadot",
"displayName": "Dorafactory Polkadot Network",
"symbols": [
"DORA"
],
"decimals": [
12
],
"standardAccount": "*25519",
"website": "https://dorafactory.org"
},
{
"prefix": 131,
"network": "litmus",
@@ -1005,7 +1098,7 @@
"QTZ"
],
"decimals": [
15
18
],
"standardAccount": "*25519",
"website": "https://unique.network"
@@ -1059,7 +1152,7 @@
"decimals": [
18
],
"standardAccount": "Sr25519",
"standardAccount": "*25519",
"website": "https://efinity.io/"
},
{
@@ -1140,6 +1233,19 @@
"standardAccount": "*25519",
"website": "https://ajuna.io"
},
{
"prefix": 1985,
"network": "seals",
"displayName": "Seals Network",
"symbols": [
"SEAL"
],
"decimals": [
9
],
"standardAccount": "*25519",
"website": "https://seals.app"
},
{
"prefix": 2007,
"network": "kapex",
@@ -1179,6 +1285,58 @@
"standardAccount": "*25519",
"website": "https://interlay.io/"
},
{
"prefix": 2112,
"network": "chainflip",
"displayName": "Chainflip",
"symbols": [
"FLIP"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://chainflip.io/"
},
{
"prefix": 2114,
"network": "Turing",
"displayName": "Turing Network",
"symbols": [
"TUR"
],
"decimals": [
10
],
"standardAccount": "*25519",
"website": "https://oak.tech/turing/home/"
},
{
"prefix": 2207,
"network": "SNOW",
"displayName": "SNOW: ICE Canary Network",
"symbols": [
"ICZ"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://icenetwork.io"
},
{
"prefix": 2208,
"network": "ICE",
"displayName": "ICE Network",
"symbols": [
"ICY"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://icenetwork.io"
},
{
"prefix": 2254,
"network": "subspace_testnet",
@@ -1192,6 +1350,71 @@
"standardAccount": "*25519",
"website": "https://subspace.network"
},
{
"prefix": 3000,
"network": "hashed",
"displayName": "Hashed Network",
"symbols": [
"HASH"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://hashed.network"
},
{
"prefix": 4000,
"network": "luhn",
"displayName": "Luhn Network",
"symbols": [
"LUHN"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://luhn.network"
},
{
"prefix": 4006,
"network": "tangle",
"displayName": "Tangle Network",
"symbols": [
"TNT"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://www.webb.tools/"
},
{
"prefix": 4450,
"network": "g1",
"displayName": "Ğ1",
"symbols": [
"G1"
],
"decimals": [
2
],
"standardAccount": "*25519",
"website": "https://duniter.org"
},
{
"prefix": 5234,
"network": "humanode",
"displayName": "Humanode Network",
"symbols": [
"HMND"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://humanode.io"
},
{
"prefix": 6094,
"network": "subspace",
@@ -1210,7 +1433,7 @@
"network": "tidefi",
"displayName": "Tidefi",
"symbols": [
"TIFI"
"TDFY"
],
"decimals": [
12
@@ -1218,6 +1441,23 @@
"standardAccount": "*25519",
"website": "https://tidefi.com"
},
{
"prefix": 7013,
"network": "gm",
"displayName": "GM",
"symbols": [
"FREN",
"GM",
"GN"
],
"decimals": [
12,
0,
0
],
"standardAccount": "*25519",
"website": "https://gmordie.com"
},
{
"prefix": 7391,
"network": "unique_mainnet",
@@ -1231,6 +1471,19 @@
"standardAccount": "*25519",
"website": "https://unique.network"
},
{
"prefix": 8883,
"network": "sapphire_mainnet",
"displayName": "Sapphire by Unique",
"symbols": [
"QTZ"
],
"decimals": [
18
],
"standardAccount": "*25519",
"website": "https://unique.network"
},
{
"prefix": 9807,
"network": "dentnet",
@@ -1296,21 +1549,6 @@
"standardAccount": "*25519",
"website": "https://ata.network"
},
{
"prefix": 15253,
"network": "ice-network",
"displayName": "ICE Network",
"symbols": [
"ICX",
"ICY"
],
"decimals": [
18,
18
],
"standardAccount": "*25519",
"website": "https://icenetwork.io"
},
{
"prefix": 12191,
"network": "nftmart",
+1 -2
View File
@@ -12,7 +12,6 @@
],
"references": [
{ "path": "../hw-ledger/tsconfig.build.json" },
{ "path": "../util/tsconfig.build.json" },
{ "path": "../x-fetch/tsconfig.build.json" }
{ "path": "../util/tsconfig.build.json" }
]
}
+9 -9
View File
@@ -22,21 +22,21 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"browser": {
"crypto": false,
"stream": false
},
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@babel/runtime": "^7.19.0",
"@noble/hashes": "1.1.2",
"@noble/secp256k1": "1.6.0",
"@polkadot/networks": "10.0.2",
"@polkadot/util": "10.0.2",
"@polkadot/wasm-crypto": "^6.2.3",
"@polkadot/x-bigint": "10.0.2",
"@polkadot/x-randomvalues": "10.0.2",
"@noble/secp256k1": "1.7.0",
"@polkadot/networks": "10.1.9",
"@polkadot/util": "10.1.9",
"@polkadot/wasm-crypto": "^6.3.1",
"@polkadot/x-bigint": "10.1.9",
"@polkadot/x-randomvalues": "10.1.9",
"@scure/base": "1.1.1",
"ed2curve": "^0.3.0",
"tweetnacl": "^1.0.3"
@@ -45,6 +45,6 @@
"@types/ed2curve": "^0.2.2"
},
"peerDependencies": {
"@polkadot/util": "10.0.2"
"@polkadot/util": "10.1.9"
}
}
+12 -5
View File
@@ -5,14 +5,16 @@ import type { HexString } from '@polkadot/util/types';
import type { Prefix } from './types';
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L6
import { assert, isHex, isU8a, u8aToU8a } from '@polkadot/util';
import { isHex, isU8a, u8aToU8a } from '@polkadot/util';
import { base58Decode } from '../base58';
import { checkAddressChecksum } from './checksum';
import { defaults } from './defaults';
export function decodeAddress (encoded?: HexString | string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
assert(encoded, 'Invalid empty address passed');
if (!encoded) {
throw new Error('Invalid empty address passed');
}
if (isU8a(encoded) || isHex(encoded)) {
return u8aToU8a(encoded);
@@ -21,12 +23,17 @@ export function decodeAddress (encoded?: HexString | string | Uint8Array | null,
try {
const decoded = base58Decode(encoded);
assert(defaults.allowedEncodedLengths.includes(decoded.length), 'Invalid decoded address length');
if (!defaults.allowedEncodedLengths.includes(decoded.length)) {
throw new Error('Invalid decoded address length');
}
const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
assert(ignoreChecksum || isValid, 'Invalid decoded address checksum');
assert([-1, ss58Decoded].includes(ss58Format), () => `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
if (!isValid && !ignoreChecksum) {
throw new Error('Invalid decoded address checksum');
} else if (ss58Format !== -1 && ss58Format !== ss58Decoded) {
throw new Error(`Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
}
return decoded.slice(ss58Length, endPos);
} catch (error) {
+3 -3
View File
@@ -5,8 +5,6 @@ import type { HexString } from '@polkadot/util/types';
import type { DeriveJunction } from '../key/DeriveJunction';
import type { Prefix } from './types';
import { assert } from '@polkadot/util';
import { keyExtractPath } from '../key';
import { sr25519DerivePublic } from '../sr25519';
import { decodeAddress } from './decode';
@@ -25,7 +23,9 @@ function filterHard ({ isHard }: DeriveJunction): boolean {
export function deriveAddress (who: HexString | Uint8Array | string, suri: string, ss58Format?: Prefix): string {
const { path } = keyExtractPath(suri);
assert(path.length && !path.every(filterHard), 'Expected suri to contain a combination of non-hard paths');
if (!path.length || path.every(filterHard)) {
throw new Error('Expected suri to contain a combination of non-hard paths');
}
let publicKey = decodeAddress(who);
+6 -3
View File
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
import type { Prefix } from './types';
// Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L34
import { assert, u8aConcat } from '@polkadot/util';
import { u8aConcat } from '@polkadot/util';
import { base58Encode } from '../base58';
import { decodeAddress } from './decode';
@@ -16,8 +16,11 @@ export function encodeAddress (key: HexString | Uint8Array | string, ss58Format:
// decode it, this means we can re-encode an address
const u8a = decodeAddress(key);
assert(ss58Format >= 0 && ss58Format <= 16383 && ![46, 47].includes(ss58Format), 'Out of range ss58Format specified');
assert(defaults.allowedDecodedLengths.includes(u8a.length), () => `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
if ((ss58Format < 0) || (ss58Format > 16383) || [46, 47].includes(ss58Format)) {
throw new Error('Out of range ss58Format specified');
} else if (!defaults.allowedDecodedLengths.includes(u8a.length)) {
throw new Error(`Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
}
const input = u8aConcat(
ss58Format < 64
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
import type { HashType } from '../secp256k1/types';
import type { Prefix } from './types';
import { assert, u8aConcat } from '@polkadot/util';
import { u8aConcat } from '@polkadot/util';
import { hasher } from '../secp256k1/hasher';
import { encodeAddress } from './encode';
@@ -17,7 +17,9 @@ import { encodeAddress } from './encode';
export function evmToAddress (evmAddress: HexString | string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
const message = u8aConcat('evm:', evmAddress);
assert(message.length === 24, () => `Converting ${evmAddress as string}: Invalid evm address length`);
if (message.length !== 24) {
throw new Error(`Converting ${evmAddress as string}: Invalid evm address length`);
}
return encodeAddress(hasher(hashType, message), ss58Format);
}
+14 -13
View File
@@ -3,7 +3,7 @@
import type { U8aLike } from '@polkadot/util/types';
import { assert, u8aToU8a } from '@polkadot/util';
import { u8aToU8a } from '@polkadot/util';
// re-export the type so *.d.ts files don't have ../src imports
export type { U8aLike } from '@polkadot/util/types';
@@ -65,22 +65,23 @@ export function createIs (validate: ValidateFn): ValidateFn {
/** @internal */
export function createValidate ({ chars, ipfs, type }: Config): ValidateFn {
return (value?: unknown, ipfsCompat?: boolean): value is string => {
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
if (!value || typeof value !== 'string') {
throw new Error(`Expected non-null, non-empty ${type} string input`);
}
if (ipfs && ipfsCompat) {
assert(value[0] === ipfs, () => `Expected ipfs-compatible ${type} to start with '${ipfs}'`);
if (ipfs && ipfsCompat && value[0] !== ipfs) {
throw new Error(`Expected ipfs-compatible ${type} to start with '${ipfs}'`);
}
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
assert(
chars.includes(value[i]) || (
value[i] === '=' && (
(i === value.length - 1) ||
!chars.includes(value[i + 1])
)
),
() => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`
);
if (!(chars.includes(value[i]) || (
value[i] === '=' && (
(i === value.length - 1) ||
!chars.includes(value[i + 1])
)
))) {
throw new Error(`Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
}
}
return true;
+3 -2
View File
@@ -1,7 +1,6 @@
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { assert } from '@polkadot/util';
import { isReady, waitReady } from '@polkadot/wasm-crypto';
export const cryptoIsReady = isReady;
@@ -9,7 +8,9 @@ export const cryptoIsReady = isReady;
export function cryptoWaitReady (): Promise<boolean> {
return waitReady()
.then((): boolean => {
assert(isReady(), 'Unable to initialize @polkadot/util-crypto');
if (!isReady()) {
throw new Error('Unable to initialize @polkadot/util-crypto');
}
return true;
})
@@ -1,14 +1,16 @@
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { assert, compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
import { compactAddLength, isU8a, stringToU8a, u8aConcat } from '@polkadot/util';
import { blake2AsU8a } from '../blake2/asU8a';
const HDKD = compactAddLength(stringToU8a('Ed25519HDKD'));
export function ed25519DeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
if (!isU8a(chainCode) || chainCode.length !== 32) {
throw new Error('Invalid chainCode passed to derive');
}
return blake2AsU8a(
u8aConcat(HDKD, seed, chainCode)
+4 -2
View File
@@ -6,7 +6,7 @@ import type { Keypair } from '../types';
import nacl from 'tweetnacl';
import { assert, u8aToU8a } from '@polkadot/util';
import { u8aToU8a } from '@polkadot/util';
import { ed25519Sign as wasmSign, isReady } from '@polkadot/wasm-crypto';
/**
@@ -24,7 +24,9 @@ import { ed25519Sign as wasmSign, isReady } from '@polkadot/wasm-crypto';
* ```
*/
export function ed25519Sign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial<Keypair>, onlyJs?: boolean): Uint8Array {
assert(secretKey, 'Expected a valid secretKey');
if (!secretKey) {
throw new Error('Expected a valid secretKey');
}
const messageU8a = u8aToU8a(message);
+6 -3
View File
@@ -5,7 +5,7 @@ import type { HexString } from '@polkadot/util/types';
import nacl from 'tweetnacl';
import { assert, u8aToU8a } from '@polkadot/util';
import { u8aToU8a } from '@polkadot/util';
import { ed25519Verify as wasmVerify, isReady } from '@polkadot/wasm-crypto';
/**
@@ -27,8 +27,11 @@ export function ed25519Verify (message: HexString | Uint8Array | string, signatu
const publicKeyU8a = u8aToU8a(publicKey);
const signatureU8a = u8aToU8a(signature);
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
if (publicKeyU8a.length !== 32) {
throw new Error(`Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
} else if (signatureU8a.length !== 64) {
throw new Error(`Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
}
return !onlyJs && isReady()
? wasmVerify(signatureU8a, messageU8a, publicKeyU8a)
+4 -2
View File
@@ -3,7 +3,7 @@
import type { HexString } from '@polkadot/util/types';
import { assert, u8aToHex, u8aToU8a } from '@polkadot/util';
import { u8aToHex, u8aToU8a } from '@polkadot/util';
import { keccakAsU8a } from '../keccak';
import { secp256k1Expand } from '../secp256k1';
@@ -23,7 +23,9 @@ export function ethereumEncode (addressOrPublic?: HexString | string | Uint8Arra
const u8aAddress = u8aToU8a(addressOrPublic);
assert([20, 32, 33, 65].includes(u8aAddress.length), 'Invalid address or publicKey passed');
if (![20, 32, 33, 65].includes(u8aAddress.length)) {
throw new Error('Invalid address or publicKey passed');
}
const address = u8aToHex(getH160(u8aAddress), -1, false);
const hash = u8aToHex(keccakAsU8a(address), -1, false);
@@ -3,7 +3,7 @@
import type { Keypair } from '../../types';
import { assert, bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
import { BN_BE_32_OPTS } from '../../bn';
import { hmacShaAsU8a } from '../../hmac';
@@ -51,7 +51,9 @@ export function hdEthereum (seed: Uint8Array, path = ''): Keypair {
return hd;
}
assert(hdValidatePath(path), 'Invalid derivation path');
if (!hdValidatePath(path)) {
throw new Error('Invalid derivation path');
}
const parts = path.split('/').slice(1);
+8 -5
View File
@@ -3,8 +3,6 @@
import type { Keypair } from '../../types';
import { assert } from '@polkadot/util';
import { ed25519PairFromSeed } from '../../ed25519';
import { mnemonicValidate } from '../../mnemonic';
import { HARDENED, hdValidatePath } from '../validatePath';
@@ -17,14 +15,19 @@ export function hdLedger (_mnemonic: string, path: string): Keypair {
.map((s) => s.trim())
.filter((s) => s);
assert([12, 24, 25].includes(words.length), 'Expected a mnemonic with 24 words (or 25 including a password)');
if (![12, 24, 25].includes(words.length)) {
throw new Error('Expected a mnemonic with 24 words (or 25 including a password)');
}
const [mnemonic, password] = words.length === 25
? [words.slice(0, 24).join(' '), words[24]]
: [words.join(' '), ''];
assert(mnemonicValidate(mnemonic), 'Invalid mnemonic passed to ledger derivation');
assert(hdValidatePath(path), 'Invalid derivation path');
if (!mnemonicValidate(mnemonic)) {
throw new Error('Invalid mnemonic passed to ledger derivation');
} else if (!hdValidatePath(path)) {
throw new Error('Invalid derivation path');
}
const parts = path.split('/').slice(1);
let seed = ledgerMaster(mnemonic, password);
+4 -2
View File
@@ -3,13 +3,15 @@
import type { EncryptedJson } from './types';
import { assert, hexToU8a, isHex } from '@polkadot/util';
import { hexToU8a, isHex } from '@polkadot/util';
import { base64Decode } from '../base64';
import { jsonDecryptData } from './decryptData';
export function jsonDecrypt ({ encoded, encoding }: EncryptedJson, passphrase?: string | null): Uint8Array {
assert(encoded, 'No encrypted data available to decode');
if (!encoded) {
throw new Error('No encrypted data available to decode');
}
return jsonDecryptData(
isHex(encoded)
+9 -4
View File
@@ -3,15 +3,18 @@
import type { EncryptedJsonEncoding } from './types';
import { assert, stringToU8a, u8aFixLength } from '@polkadot/util';
import { stringToU8a, u8aFixLength } from '@polkadot/util';
import { naclDecrypt } from '../nacl';
import { scryptEncode, scryptFromU8a } from '../scrypt';
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 encrypted data');
if (!encrypted) {
throw new Error('No encrypted data available to decode');
} else if (encType.includes('xsalsa20-poly1305') && !passphrase) {
throw new Error('Password required to decode encrypted data');
}
let encoded: Uint8Array | null = encrypted;
@@ -34,7 +37,9 @@ export function jsonDecryptData (encrypted?: Uint8Array | null, passphrase?: str
);
}
assert(encoded, 'Unable to decode using the supplied passphrase');
if (!encoded) {
throw new Error('Unable to decode using the supplied passphrase');
}
return encoded;
}
+3 -3
View File
@@ -1,8 +1,6 @@
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { assert } from '@polkadot/util';
import { DeriveJunction } from './DeriveJunction';
const RE_JUNCTION = /\/(\/?)([^/]+)/g;
@@ -28,7 +26,9 @@ export function keyExtractPath (derivePath: string): ExtractResult {
}
}
assert(constructed === derivePath, () => `Re-constructed path "${constructed}" does not match input`);
if (constructed !== derivePath) {
throw new Error(`Re-constructed path "${constructed}" does not match input`);
}
return {
parts,
+3 -3
View File
@@ -3,13 +3,13 @@
import type { Keypair } from '../types';
import { assert } from '@polkadot/util';
import { DeriveJunction } from './DeriveJunction';
export function createSeedDeriveFn (fromSeed: (seed: Uint8Array) => Keypair, derive: (seed: Uint8Array, chainCode: Uint8Array) => Uint8Array): (keypair: Keypair, junction: DeriveJunction) => Keypair {
return (keypair: Keypair, { chainCode, isHard }: DeriveJunction): Keypair => {
assert(isHard, 'A soft key was found in the path and is not supported');
if (!isHard) {
throw new Error('A soft key was found in the path and is not supported');
}
return fromSeed(
derive(keypair.secretKey.subarray(0, 32), chainCode)
@@ -1,6 +1,7 @@
// Copyright 2017-2022 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { entropyToMnemonic, mnemonicToEntropy } from './bip39';
import DEFAULT_WORDLIST from './bip39-en';
describe('wordlist', (): void => {
@@ -12,3 +13,13 @@ describe('wordlist', (): void => {
expect(DEFAULT_WORDLIST.some((n) => !n.length || n.trim() !== n)).toEqual(false);
});
});
describe('bip39', (): void => {
it('has a two-way entropy <-> mnemonic', (): void => {
const m = 'seed sock milk update focus rotate barely fade car face mechanic mercy';
expect(
entropyToMnemonic(mnemonicToEntropy(m))
).toEqual(m);
});
});
+25 -15
View File
@@ -14,7 +14,7 @@
// - Remove mnemonicToSeed (we only use the sync variant)
// - generateMnemonic takes number of words (instead of strength)
import { assert, stringToU8a, u8aToU8a } from '@polkadot/util';
import { stringToU8a, u8aToU8a } from '@polkadot/util';
import { pbkdf2Encode } from '../pbkdf2';
import { randomAsU8a } from '../random';
@@ -53,14 +53,18 @@ export function mnemonicToSeedSync (mnemonic: string, password?: string): Uint8A
export function mnemonicToEntropy (mnemonic: string): Uint8Array {
const words = normalize(mnemonic).split(' ');
assert(words.length % 3 === 0, INVALID_MNEMONIC);
if (words.length % 3 !== 0) {
throw new Error(INVALID_MNEMONIC);
}
// convert word indices to 11 bit binary strings
const bits = words
.map((word): string => {
const index = DEFAULT_WORDLIST.indexOf(word);
assert(index !== -1, INVALID_MNEMONIC);
if (index === -1) {
throw new Error(INVALID_MNEMONIC);
}
return index.toString(2).padStart(11, '0');
})
@@ -72,30 +76,36 @@ export function mnemonicToEntropy (mnemonic: string): Uint8Array {
const checksumBits = bits.slice(dividerIndex);
// calculate the checksum and compare
const entropyBytes = entropyBits.match(/(.{1,8})/g)?.map(binaryToByte);
const matched = entropyBits.match(/(.{1,8})/g);
const entropyBytes = matched && matched.map(binaryToByte);
assert(entropyBytes && (entropyBytes.length % 4 === 0) && (entropyBytes.length >= 16) && (entropyBytes.length <= 32), INVALID_ENTROPY);
if (!entropyBytes || (entropyBytes.length % 4 !== 0) || (entropyBytes.length < 16) || (entropyBytes.length > 32)) {
throw new Error(INVALID_ENTROPY);
}
const entropy = u8aToU8a(entropyBytes);
const newChecksum = deriveChecksumBits(entropy);
assert(newChecksum === checksumBits, INVALID_CHECKSUM);
if (deriveChecksumBits(entropy) !== checksumBits) {
throw new Error(INVALID_CHECKSUM);
}
return entropy;
}
export function entropyToMnemonic (entropy: Uint8Array): string {
// 128 <= ENT <= 256
assert((entropy.length % 4 === 0) && (entropy.length >= 16) && (entropy.length <= 32), INVALID_ENTROPY);
if ((entropy.length % 4 !== 0) || (entropy.length < 16) || (entropy.length > 32)) {
throw new Error(INVALID_ENTROPY);
}
const entropyBits = bytesToBinary(Array.from(entropy));
const checksumBits = deriveChecksumBits(entropy);
const matched = `${bytesToBinary(Array.from(entropy))}${deriveChecksumBits(entropy)}`.match(/(.{1,11})/g);
const mapped = matched && matched.map((binary) => DEFAULT_WORDLIST[binaryToByte(binary)]);
// we just set it prior, so this is a safe check
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return (entropyBits + checksumBits).match(/(.{1,11})/g)!
.map((binary) => DEFAULT_WORDLIST[binaryToByte(binary)])
.join(' ');
if (!mapped || (mapped.length < 12)) {
throw new Error('Unable to map entropy to mnemonic');
}
return mapped.join(' ');
}
export function generateMnemonic (numWords: 12 | 15 | 18 | 21 | 24): string {
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/util-crypto', path: 'auto', type: 'auto', version: '10.1.9' };
+16 -14
View File
@@ -10,21 +10,23 @@ describe('xxhashAsHex', (): void => {
await waitReady();
});
it('returns a 64-bit value by default', (): void => {
expect(
xxhashAsHex('abc')
).toEqual('0x990977adf52cbc44');
});
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a 64-bit value by default', (): void => {
expect(
xxhashAsHex('abc', undefined, onlyJs)
).toEqual('0x990977adf52cbc44');
});
it('returns a 128-bit value (as specified)', (): void => {
expect(
xxhashAsHex('abc', 128)
).toEqual('0x990977adf52cbc440889329981caa9be');
});
it('returns a 128-bit value (as specified)', (): void => {
expect(
xxhashAsHex('abc', 128, onlyJs)
).toEqual('0x990977adf52cbc440889329981caa9be');
});
it('returns a 256-bit value (as specified)', (): void => {
expect(
xxhashAsHex('abc', 256)
).toEqual('0x990977adf52cbc440889329981caa9bef7da5770b2b8a05303b75d95360dd62b');
it('returns a 256-bit value (as specified)', (): void => {
expect(
xxhashAsHex('abc', 256, onlyJs)
).toEqual('0x990977adf52cbc440889329981caa9bef7da5770b2b8a05303b75d95360dd62b');
});
});
});
+8 -8
View File
@@ -34,18 +34,18 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/x-bigint": "10.0.2",
"@polkadot/x-global": "10.0.2",
"@polkadot/x-textdecoder": "10.0.2",
"@polkadot/x-textencoder": "10.0.2",
"@types/bn.js": "^5.1.0",
"@babel/runtime": "^7.19.0",
"@polkadot/x-bigint": "10.1.9",
"@polkadot/x-global": "10.1.9",
"@polkadot/x-textdecoder": "10.1.9",
"@polkadot/x-textencoder": "10.1.9",
"@types/bn.js": "^5.1.1",
"bn.js": "^5.2.1"
},
"devDependencies": {
"@polkadot/x-randomvalues": "10.0.2"
"@polkadot/x-randomvalues": "10.1.9"
}
}
+19
View File
@@ -1,12 +1,31 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { perf } from '../test/performance';
import { arrayFlatten } from '.';
const PERF_ONE = [[1, 2, 3, 4, 5]];
const PERF_MUL = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
describe('arrayFlatten', (): void => {
it('flattens arrays', (): void => {
expect(
arrayFlatten([[0], [1, 2, 3], [4, 5], [6], [], [7, 8]])
).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8]);
});
it('flattens a single entry', (): void => {
expect(
arrayFlatten([[1, 2, 3, 4, 5]])
).toEqual([1, 2, 3, 4, 5]);
});
it('flattens an empty', (): void => {
expect(
arrayFlatten([])
).toEqual([]);
});
perf('arrayFlatten (single)', 10_000_000, [[PERF_ONE]], arrayFlatten);
perf('arrayFlatten (multi)', 700_000, [[PERF_MUL]], arrayFlatten);
});
+4 -2
View File
@@ -19,8 +19,10 @@
* ```
*/
export function arrayFlatten <T> (arrays: readonly T[][]): T[] {
// noop for the single-entry case
if (arrays.length === 1) {
// noop for the empty & single-entry case
if (arrays.length === 0) {
return [];
} else if (arrays.length === 1) {
return arrays[0];
}
+1
View File
@@ -10,4 +10,5 @@ export { arrayFilter } from './filter';
export { arrayFlatten } from './flatten';
export { arrayRange } from './range';
export { arrayShuffle } from './shuffle';
export { arrayUnzip } from './unzip';
export { arrayZip } from './zip';
+1 -1
View File
@@ -5,7 +5,7 @@
* @name arrayShuffle
* @description Shuffles the input array (unlike sort, this is not done in-place)
*/
export function arrayShuffle <T> (input: T[]): T[] {
export function arrayShuffle <T> (input: readonly T[]): T[] {
const result = input.slice();
let curr = result.length;
+12
View File
@@ -0,0 +1,12 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { arrayUnzip } from '.';
describe('arrayUnzip', (): void => {
it('unzips entries', (): void => {
expect(
arrayUnzip([['a', 1], ['b', 2], ['c', 3]])
).toEqual([['a', 'b', 'c'], [1, 2, 3]]);
});
});
+17
View File
@@ -0,0 +1,17 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
/**
* @name arrayUnzip
* @description Splits a single [K, V][] into [K[], V[]]
*/
export function arrayUnzip <K, V> (entries: readonly [K, V][]): [K[], V[]] {
const keys = new Array<K>(entries.length);
const values = new Array<V>(entries.length);
for (let i = 0; i < entries.length; i++) {
[keys[i], values[i]] = entries[i];
}
return [keys, values];
}
+2 -2
View File
@@ -5,7 +5,7 @@ import { BN } from '../bn';
import { SQRT_MAX_SAFE_INTEGER } from './sqrt';
import { nSqrt } from '.';
const TESTS: [string | number | BN | bigint, string | number][] = [
export const SQRT_TESTS: [string | number | BN | bigint, string | number][] = [
[0, 0],
[1, 1],
[4, 2],
@@ -45,7 +45,7 @@ describe('nSqrt', (): void => {
).toEqual(true);
});
TESTS.forEach(([value, expected], index): void => {
SQRT_TESTS.forEach(([value, expected], index): void => {
it(`calcs for test #${index}`, (): void => {
expect(
nSqrt(value) === BigInt(expected)
+2 -24
View File
@@ -1,32 +1,10 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { SQRT_TESTS } from '../bi/sqrt.spec';
import { SQRT_MAX_SAFE_INTEGER } from './sqrt';
import { BN, bnSqrt } from '.';
const TESTS: [string | number | BN | bigint, string | number][] = [
[0, 0],
[1, 1],
[4, 2],
[256 * 256, 256],
[Number.MAX_SAFE_INTEGER, 94906265],
[new BN(Number.MAX_SAFE_INTEGER).iaddn(256), 94906265],
[12345678n * 12345679n, 12345678],
// test cases below from https://github.com/Aisse-258/bigint-isqrt/blob/f5254b9750841959022461c1353437a07a08f501/test/sqrt-test.js
[
'54866395443885995655625',
'234235768925'
],
[
'82120471531550314555681345949499512621827274120673745141541602816614526075010755373654280259022317599142038423759320355177481886719814621305828811322920076213800348341464996337890625',
'9062034624274524065844376014975805577107171799890766992670739972241112960081909332275390625'
],
[
'2068290204957779940494571454815902632050207752627007664813877111611972735314294907791993008455381265730624848057015476004143868408297250386512042711005577373327434315310235583583151773358353534031397385969275475421659036494173765903706963544628565027679444680637920371210258368358706248446698622704138943704561842220533563976838506992543814273403403362954987589637283890281226038798503294069403370486523697009383229578343444337394508531937972775639593763364402389410142290440075517598007930025487176173228232153685095699851764630884360483051570513804913157899314303269924424908606245851172031453725690942288677622973423417902662711606364188470325930406288190754356367655606430407552275285889968860367977288564364154999338284288438279464648663835830140826171534470717958048887869721791862539529444820484648908879364324577951008050851801647916673254009490596379549192296404841454780884358889449367135382779230574781333008561195244620152128505091883408484094800737142399855337799331037607433934520934135669364954550499058123797911762228642423567268540444910163468496805547450495819213412636594319148417857753712526066272727725420886898680432958409892237191284583904066400736417812258327303739879128916456683685232170600928808798462776174857486589598776587550843543720784829419478239563366491666155716208452087857080883906200829769222868347286071365156305396955420561718593130305703074908891135467193627721682044757187980688062367562451981939375400543212890625',
'45478458691536369397924851088318871329614555665525810477032568598360481742967756704524034986984134271202405190906906195123751965012732122548540879928668891416468847696038707003466943811913626146981446753434347552196868717612248915137033581428310504778371173112125038060138252719589122657221314190626986951627417768579641354255445988772645883238873672997347648890137913979299598785628581961589739331483895853398160785485300758458294999124984266041998145956341386549681176624661615465976970855592467853824812945820721933491609237311130118125761849911376495970746282571994312288380577879004620824004760109618074670810797544446334767103935754106103208789391060008291027361311679876439695844637933763721093782805837690830230712890625'
]
];
describe('bnSqrt', (): void => {
it('fails on < 0 roots', (): void => {
expect(
@@ -46,7 +24,7 @@ describe('bnSqrt', (): void => {
).toEqual(true);
});
TESTS.forEach(([value, expected], index): void => {
SQRT_TESTS.forEach(([value, expected], index): void => {
it(`calcs for test #${index}`, (): void => {
expect(
bnSqrt(value).eq(new BN(expected))
+13 -1
View File
@@ -48,13 +48,25 @@ describe('hexToU8a', (): void => {
);
});
it('converts a non-aligned string', (): void => {
expect(
hexToU8a('0x123')
).toEqual(new Uint8Array([0x12, 0x30]));
});
it('converts known bytes to their correct values', (): void => {
expect(
hexToU8a('0x68656c6c6f20776f726c64') // hello world (11 bytes, non-aligned)
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
});
it('fails when non-hex value provided', (): void => {
it('converts known bytes to their correct values (upper/lower)', (): void => {
expect(
hexToU8a('0x68656C6c6f20776F726c64') // hello world (11 bytes, non-aligned)
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
});
it.skip('fails when non-hex value provided', (): void => {
expect(
() => hexToU8a('notahex')
).toThrow(/hex value to convert/);
+23 -23
View File
@@ -3,16 +3,23 @@
import type { HexString } from '../types';
import { REGEX_HEX_NOPREFIX, REGEX_HEX_PREFIXED } from '../is/hex';
const CHR = '0123456789abcdef';
const U8 = new Array<number>(256);
const U16 = new Array<number>(256 * 256);
const CHARS = '0123456789abcdef';
const UNHEX = new Array<number>(256);
for (let i = 0; i < CHARS.length; i++) {
UNHEX[CHARS[i].charCodeAt(0)] = i;
for (let i = 0; i < CHR.length; i++) {
U8[CHR[i].charCodeAt(0) | 0] = i | 0;
if (i > 9) {
UNHEX[CHARS[i].toUpperCase().charCodeAt(0)] = i;
U8[CHR[i].toUpperCase().charCodeAt(0) | 0] = i | 0;
}
}
for (let i = 0; i < 256; i++) {
const s = i << 8;
for (let j = 0; j < 256; j++) {
U16[s | j] = (U8[i] << 4) | U8[j];
}
}
@@ -32,30 +39,23 @@ for (let i = 0; i < CHARS.length; i++) {
* ```
*/
export function hexToU8a (value?: HexString | string | null, bitLength = -1): Uint8Array {
if (!value || value === '0x') {
if (!value) {
return new Uint8Array();
}
let s = 0;
let s = value.startsWith('0x')
? 2
: 0;
// we don't use hexStringPrefix here - that has substring which adds
// additional overhead. Instead we duplicate the logic, just incrementing
// the sactual string pointer, ignoring the prefix as required
if (REGEX_HEX_PREFIXED.test(value)) {
s = 2;
} else if (!REGEX_HEX_NOPREFIX.test(value)) {
throw new Error(`Expected hex value to convert, found '${value}'`);
}
const strLength = (value.length - s) / 2;
const decLength = Math.ceil((value.length - s) / 2);
const endLength = Math.ceil(
bitLength === -1
? strLength
? decLength
: bitLength / 8
);
const result = new Uint8Array(endLength);
const offset = endLength > strLength
? endLength - strLength
const offset = endLength > decLength
? endLength - decLength
: 0;
for (let i = offset; i < endLength; i++, s += 2) {
@@ -63,7 +63,7 @@ export function hexToU8a (value?: HexString | string | null, bitLength = -1): Ui
// HEX_TO_U16[value.substring()] we get an 10x slowdown. In the
// same vein using charCodeAt (as opposed to value[s] or value.charAt(s)) is
// also the faster operation by at least 2x with the character map above
result[i] = (UNHEX[value.charCodeAt(s)] << 4) + UNHEX[value.charCodeAt(s + 1)];
result[i] = U16[(value.charCodeAt(s) << 8) | value.charCodeAt(s + 1)];
}
return result;
+1 -1
View File
@@ -34,7 +34,7 @@ describe('hexToU8a', (): void => {
);
});
it('fails when non-hex value provided', (): void => {
it.skip('fails when non-hex value provided', (): void => {
expect(
() => hexToU8a('notahex')
).toThrow(/hex value to convert/);
+3 -3
View File
@@ -3,8 +3,6 @@
import type { HexString } from '../types';
import { hexStripPrefix } from './stripPrefix';
/**
* @name hexToU8a
* @summary Creates a Uint8Array object from a hex string.
@@ -25,7 +23,9 @@ export function hexToU8a (_value?: HexString | string | null, bitLength = -1): U
return new Uint8Array();
}
const value = hexStripPrefix(_value);
const value = _value.startsWith('0x')
? _value.substring(2)
: _value;
const buf = Buffer.from(value, 'hex');
const valLength = value.length / 2;
const resultLength = Math.ceil(
+8 -4
View File
@@ -7,7 +7,11 @@ import { isAscii } from '.';
describe('isAscii', (): void => {
it('returns true for an ASCII string', (): void => {
expect(isAscii('Hello\tWorld!\n\rTesting')).toEqual(true);
expect(isAscii('Hello World! Testing')).toEqual(true);
});
it('returns false for an ASCII string (with formatters)', (): void => {
expect(isAscii('Hello\tWorld!\n\rTesting')).toEqual(false);
});
it('returns false on an non-ascii string', (): void => {
@@ -15,7 +19,7 @@ describe('isAscii', (): void => {
});
it('returns true for ASCII bytes', (): void => {
expect(isAscii(new Uint8Array([0x31, 0x32, 0x20, 10]))).toEqual(true);
expect(isAscii(stringToU8a('Hello World! Testing'))).toEqual(true);
});
it('returns true for empty string inputs', (): void => {
@@ -38,6 +42,6 @@ describe('isAscii', (): void => {
expect(isAscii('0x010203')).toEqual(false);
});
perf('isAscii (str)', 2_000_000, [['Hello\tWorld!\n\rTesting']], isAscii);
perf('isAscii (u8a)', 200_000, [[[stringToU8a('Hello\tWorld!\n\rTesting')]]], isAscii);
perf('isAscii (str)', 2_000_000, [['Hello World! Testing']], isAscii);
perf('isAscii (u8a)', 200_000, [[[stringToU8a('Hello World! Testing')]]], isAscii);
});
+5 -5
View File
@@ -9,13 +9,13 @@ import { isString } from './string';
/** @internal */
function isAsciiStr (str: AnyString): boolean {
const count = str.length;
const count = str.length | 0;
for (let i = 0; i < count; i++) {
const b = str.charCodeAt(i);
// check is inlined here, it is faster than making a call
if (!((b < 127) && ((b >= 32) || (b === 10) || (b === 9) || (b === 13)))) {
if (b < 32 || b > 126) {
return false;
}
}
@@ -25,13 +25,13 @@ function isAsciiStr (str: AnyString): boolean {
/** @internal */
function isAsciiBytes (u8a: Uint8Array | Buffer | number[]): boolean {
const count = u8a.length;
const count = u8a.length | 0;
for (let i = 0; i < count; i++) {
const b = u8a[i];
const b = u8a[i] | 0;
// check is inlined here, it is faster than making a call
if (!((b < 127) && ((b >= 32) || (b === 10) || (b === 9) || (b === 13)))) {
if (b < 32 || b > 126) {
return false;
}
}
+6
View File
@@ -21,4 +21,10 @@ describe('isObject', (): void => {
isObject(null)
).toEqual(false);
});
it('returns false on bigint', (): void => {
expect(
isObject(123n)
).toEqual(false);
});
});
+2 -2
View File
@@ -35,7 +35,7 @@ describe('lazyMethod', (): void => {
expect(Object.prototype.hasOwnProperty.call(test, 'a')).toEqual(true);
expect(getter).not.toHaveBeenCalled();
expect(test.a).toEqual(123);
expect(getter).toHaveBeenCalledWith('a');
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
});
it('calls the getter a single time', (): void => {
@@ -46,7 +46,7 @@ describe('lazyMethod', (): void => {
expect(getter).not.toHaveBeenCalled();
expect(test.a).toEqual(123);
expect(getter).toHaveBeenCalledWith('a');
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
expect(test.a).toEqual(123);
expect(getter).toHaveBeenCalledTimes(1);
});
+5 -5
View File
@@ -10,9 +10,9 @@ type WithToString = { toString: () => string };
* @description
* Creates a lazy, on-demand getter for the specific value. Upon get the value will be evaluated.
*/
export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, creator: (d: K) => T, getName?: (d: K) => string): void {
export function lazyMethod <T, K, S> (result: Record<string, T> | AnyFn, item: K, creator: (item: K, index: number, self: S) => T, getName?: (item: K, index: number) => string, index = 0): void {
const name = getName
? getName(item)
? getName(item, index)
: (item as WithToString).toString();
let value: T | undefined;
@@ -30,7 +30,7 @@ export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, c
// with a value below ... however we ensure we are quire vigilant against
// all environment failures, so we are rather be safe than sorry
if (value === undefined) {
value = creator(item);
value = creator(item, index, this as S);
try {
// re-define the property as a value, next time around this
@@ -54,9 +54,9 @@ export function lazyMethod <T, K> (result: Record<string, T> | AnyFn, item: K, c
* @description
* Creates lazy, on-demand getters for the specific values.
*/
export function lazyMethods <T, K> (result: Record<string, T>, items: readonly K[], creator: (v: K) => T, getName?: (m: K) => string): Record<string, T> {
export function lazyMethods <T, K, S> (result: Record<string, T>, items: readonly K[], creator: (item: K, index: number, self: S) => T, getName?: (item: K, index: number) => string): Record<string, T> {
for (let i = 0; i < items.length; i++) {
lazyMethod(result, items[i], creator, getName);
lazyMethod(result, items[i], creator, getName, i);
}
return result;
+2 -2
View File
@@ -18,7 +18,7 @@ declare const process: { env: Record<string, string> };
type ConsoleType = 'error' | 'log' | 'warn';
type LogType = ConsoleType | 'debug';
const logTo = {
const logTo = <const> {
debug: 'log',
error: 'error',
log: 'log',
@@ -72,7 +72,7 @@ function apply (log: LogType, type: string, values: Logger$Data, maxSize = -1):
return apply(log, type, Array.isArray(fnResult) ? fnResult : [fnResult], maxSize);
}
console[logTo[log] as 'log'](
console[logTo[log]](
formatDate(new Date()),
type,
...values
+17 -12
View File
@@ -6,16 +6,21 @@
* @description Defer the operation to the queue for evaluation on the next tick
*/
export function nextTick (onExec: () => unknown, onError?: (error: Error) => unknown): void {
Promise
.resolve()
.then((): void => {
onExec();
})
.catch((error): void => {
if (onError) {
onError(error as Error);
} else {
console.error(error);
}
});
// While Promise.resolve().then(...) would defer to the nextTick, this
// actually does not play as nicely in browsers like the setTimeout(...)
// approach. So the safer, though less optimal approach is the one taken here
setTimeout((): void => {
Promise
.resolve()
.then((): void => {
onExec();
})
.catch((error: Error): void => {
if (onError) {
onError(error);
} else {
console.error(error);
}
});
}, 0);
}
+2 -2
View File
@@ -128,7 +128,7 @@ describe('objectProperty/objectProperties', (): void => {
expect(getter).not.toHaveBeenCalled();
expect(test.a).toEqual(123);
expect(getter).toHaveBeenCalledWith('a');
expect(getter).toHaveBeenCalledWith('a', 0, expect.objectContaining({}));
});
it('calls back with the key name & index (numtiple)', (): void => {
@@ -139,7 +139,7 @@ describe('objectProperty/objectProperties', (): void => {
expect(getter).not.toHaveBeenCalled();
expect(test.b).toEqual(123);
expect(getter).toHaveBeenCalledWith('b', 1);
expect(getter).toHaveBeenCalledWith('b', 1, expect.objectContaining({}));
});
perf('objectProperties (obj)', 50_000, [[]], () => objectProperties({}, ['foo', 'bar', 'baz'], (k) => k));
+12 -6
View File
@@ -5,19 +5,25 @@
* @name objectProperty
* @summary Assign a get property on the input object
*/
export function objectProperty (that: object, key: string, getter: (k: string) => unknown): void {
export function objectProperty <S> (that: object, key: string, getter: (key: string, index: number, self: S) => unknown, getName?: (key: string, index: number) => string, index = 0): void {
const name = getName
? getName(key, index)
: key;
// There are 3 approaches here -
// - Object.prototype.hasOwnProperty.call(that, key) - this only checks the current class, i.e
// will retuirn false if the property is set in the parent class
// - isUndefined(...) - this may yield a false positive when the property is there, but not set.
// Additionally, on pre-defined getters it may make a call
// - key in that - Does not need to be combined with either of the above and checks the full chain
if (!(key in that)) {
Object.defineProperty(that, key, {
if (!(name in that)) {
Object.defineProperty(that, name, {
enumerable: true,
// Unlike in lazy, we always call into the upper function, i.e. this method
// does not cache old values (it is expected to be used for dynamic values)
get: () => getter(key)
get: function (): unknown {
return getter(key, index, this as S);
}
});
}
}
@@ -26,8 +32,8 @@ export function objectProperty (that: object, key: string, getter: (k: string) =
* @name objectProperties
* @summary Assign get properties on the input object
*/
export function objectProperties (that: object, keys: string[], getter: (k: string, i: number) => unknown): void {
export function objectProperties <S> (that: object, keys: string[], getter: (key: string, index: number, self: S) => unknown, getName?: (key: string, index: number) => string): void {
for (let i = 0; i < keys.length; i++) {
objectProperty(that, keys[i], (k) => getter(k, i));
objectProperty(that, keys[i], getter, getName, i);
}
}
+16 -3
View File
@@ -5,10 +5,22 @@ import { perf } from '../test/performance';
import { objectSpread } from '.';
describe('objectSpread', (): void => {
it('spreads obj sources', (): void => {
expect(
objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 })
).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 });
});
it('spreads map sources', (): void => {
expect(
objectSpread({}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]]))
).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 });
});
it('spreads an object from multiple sources', (): void => {
expect(
objectSpread({ a: 1 }, { b: 2 }, { a: 2, c: { d: 3, e: 4 } })
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
objectSpread({ a: 1 }, { b: 2 }, { a: 2, c: { d: 3, e: 4 } }, new Map<string, unknown>([['f', 5], ['g', 6], ['h', { i: 7, k: 8 }]]))
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 }, f: 5, g: 6, h: { i: 7, k: 8 } });
});
it('spreads an object from multiple sources (with null & undefined)', (): void => {
@@ -17,5 +29,6 @@ describe('objectSpread', (): void => {
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
});
perf('objectSpread', 500_000, [[]], () => objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }));
perf('objectSpread (obj)', 350_000, [[{}, { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 }]], objectSpread);
perf('objectSpread (map)', 350_000, [[{}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]])]], objectSpread);
});
+7 -1
View File
@@ -10,7 +10,13 @@ export function objectSpread <T extends object> (dest: object, ...sources: (obje
const src = sources[i];
if (src) {
Object.assign(dest, src);
if (typeof (src as Map<string, unknown>).entries === 'function') {
for (const [key, value] of (src as Map<string, unknown>).entries()) {
(dest as Record<string, unknown>)[key] = value;
}
} else {
Object.assign(dest, src);
}
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/util', path: 'auto', type: 'auto', version: '10.1.9' };
+6 -2
View File
@@ -39,19 +39,23 @@ ${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s
${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`;
}
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn): void {
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn, withLog?: boolean): void {
if (process.env.GITHUB_REPOSITORY) {
return;
}
it(`performance: ${name}`, (): void => {
const [time] = loop(count, inputs, exec);
const [time, results] = loop(count, inputs, exec);
console.log(`
performance run for ${name} completed with ${formatNumber(count)} iterations.
${`${name}:`.padStart(PRE_PAD)} ${time.toFixed(2).padStart(NUM_PAD)} ms${formatOps(count, time)}
`);
if (withLog) {
console.log(results);
}
});
}
+21
View File
@@ -1,8 +1,25 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { perf } from '../test/performance';
import { u8aCmp } from '.';
const ltest = new Uint8Array(32768);
const stest = new Uint8Array(256);
const ztest = new Uint8Array(64);
for (let i = 0; i < ltest.length; i++) {
if (i < ztest.length) {
ztest[i] = i % 256;
}
if (i < stest.length) {
stest[i] = i % 256;
}
ltest[i] = i % 256;
}
describe('u8aCmp', (): void => {
it('has the same result as localCompare (equal length)', (): void => {
const a = 'test abc';
@@ -36,4 +53,8 @@ describe('u8aCmp', (): void => {
)
).toEqual(0);
});
perf('u8aCmp (64 cmp)', 100_000, [[ztest, ztest]], u8aCmp);
perf('u8aCmp (256 cmp)', 50_000, [[stest, stest]], u8aCmp);
perf('u8aCmp (32k cmp)', 500, [[ltest, ltest]], u8aCmp);
});
+2 -2
View File
@@ -8,12 +8,12 @@
* Checks to see if the input `Uint8Array` has zero length or contains all 0 values.
*/
export function u8aEmpty (value: Uint8Array): boolean {
const len = value.length;
const len = value.length | 0;
// on smaller sizes, the byte-by-byte compare is faster than allocating
// another object for DataView (on very large arrays the DataView is faster)
for (let i = 0; i < len; i++) {
if (value[i]) {
if (value[i] | 0) {
return false;
}
}
+2 -2
View File
@@ -26,8 +26,8 @@ export function u8aEq (a: HexString | Uint8Array | string, b: HexString | Uint8A
if (u8aa.length === u8ab.length) {
const dvA = new DataView(u8aa.buffer, u8aa.byteOffset);
const dvB = new DataView(u8ab.buffer, u8ab.byteOffset);
const mod = u8aa.length % 4;
const length = u8aa.length - mod;
const mod = (u8aa.length % 4) | 0;
const length = (u8aa.length - mod) | 0;
for (let i = 0; i < length; i += 4) {
if (dvA.getUint32(i) !== dvB.getUint32(i)) {
+2 -2
View File
@@ -78,12 +78,12 @@ describe('u8aToHex', (): void => {
).toEqual('0x68656c6c6f20776f726c64');
});
perfCmp('u8aToHex (32k)', ['u8aToHexBuffer', 'u8aToHex'], 2000, [[ptest32k]], (s: Uint8Array, isSecond) =>
perfCmp('u8aToHex (32k)', ['u8aToHexBuffer', 'u8aToHex'], 1000, [[ptest32k]], (s: Uint8Array, isSecond) =>
isSecond
? u8aToHex(s)
: u8aToHexBuffer(s)
);
perfCmp('u8aToHex (128)', ['u8aToHexBuffer', 'u8aToHex'], 100000, [[ptest256]], (s: Uint8Array, isSecond) =>
perfCmp('u8aToHex (128)', ['u8aToHexBuffer', 'u8aToHex'], 200_000, [[ptest256]], (s: Uint8Array, isSecond) =>
isSecond
? u8aToHex(s)
: u8aToHexBuffer(s)
+20 -17
View File
@@ -19,20 +19,16 @@ for (let i = 0; i < 256; i++) {
}
/** @internal */
function hex (value: Uint8Array): string {
const mod = value.length % 2;
const length = value.length - mod;
const dv = new DataView(value.buffer, value.byteOffset);
let result = '';
function hex (value: Uint8Array, result: HexString): HexString {
const mod = (value.length % 2) | 0;
const length = (value.length - mod) | 0;
for (let i = 0; i < length; i += 2) {
// we only use getUint16 here instead of getUint32 - at least in our
// tests this is faster to execute (both long & short strings tested)
result += U16[dv.getUint16(i)];
result += U16[(value[i] << 8) | value[i + 1]];
}
if (mod) {
result += U8[dv.getUint8(length)];
result += U8[value[length] | 0];
}
return result;
@@ -53,13 +49,20 @@ function hex (value: Uint8Array): string {
* ```
*/
export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed = true): HexString {
const length = Math.ceil(bitLength / 8);
// this is not 100% correct sinmce we support isPrefixed = false....
const empty = isPrefixed
? '0x'
: '' as HexString;
return `${isPrefixed ? '0x' : ''}${
!value || !value.length
? ''
: (bitLength > 0 && value.length > length)
? `${hex(value.subarray(0, length / 2))}…${hex(value.subarray(value.length - length / 2))}`
: hex(value)
}` as HexString;
if (!value || !value.length) {
return empty;
} else if (bitLength > 0) {
const length = Math.ceil(bitLength / 8);
if (value.length > length) {
return `${hex(value.subarray(0, length / 2), empty)}…${hex(value.subarray(value.length - length / 2), '' as HexString)}`;
}
}
return hex(value, empty);
}
+3 -3
View File
@@ -20,9 +20,9 @@
"./shim.cjs"
],
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/x-global": "10.0.2"
"@babel/runtime": "^7.19.0",
"@polkadot/x-global": "10.1.9"
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/x-bigint', path: 'auto', type: 'auto', version: '10.1.9' };
+3 -3
View File
@@ -17,11 +17,11 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/util": "10.0.2",
"@babel/runtime": "^7.19.0",
"@polkadot/util": "10.1.9",
"buffer-es6": "^4.9.3"
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/x-bundle', path: 'auto', type: 'auto', version: '10.1.9' };
+4 -4
View File
@@ -17,14 +17,14 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@polkadot/x-global": "10.0.2",
"@babel/runtime": "^7.19.0",
"@polkadot/x-global": "10.1.9",
"@types/node-fetch": "^2.6.2",
"node-fetch": "^3.2.6"
"node-fetch": "^3.2.10"
}
}
+5 -5
View File
@@ -12,11 +12,11 @@ export { packageInfo } from './packageInfo';
const importFetch = import('node-fetch').catch(() => null);
// keep track of the resolved import value
let resolvedFetch: typeof fetch | null = null;
let modFn: typeof fetch | null = null;
async function nodeFetch (...args: Parameters<typeof fetch>): Promise<Response> {
if (resolvedFetch) {
return resolvedFetch(...args);
if (modFn) {
return modFn(...args);
}
const mod = await importFetch;
@@ -25,9 +25,9 @@ async function nodeFetch (...args: Parameters<typeof fetch>): Promise<Response>
throw new Error('Unable to import node-fetch in this environment');
}
resolvedFetch = mod.default as unknown as typeof fetch;
modFn = mod.default as unknown as typeof fetch;
return resolvedFetch(...args);
return modFn(...args);
}
export const fetch = extractGlobal('fetch', nodeFetch);
+1 -1
View File
@@ -3,4 +3,4 @@
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '10.0.2' };
export const packageInfo = { name: '@polkadot/x-fetch', path: 'auto', type: 'auto', version: '10.1.9' };
+2 -2
View File
@@ -17,9 +17,9 @@
},
"sideEffects": false,
"type": "module",
"version": "10.0.2",
"version": "10.1.9",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.18.6"
"@babel/runtime": "^7.19.0"
}
}

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