Compare commits

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

* added equilibrium app in ledger-polkadot package

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

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

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

* allow adding 20 address in createPair

* lint

* move logic to eth specific function

* fix typo

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

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

* re establish right encoding

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

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

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

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

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

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

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

* stringify space param

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

* Remove extra assignment

* CHANGELOG

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

* trigger

* Additional

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

Re-genesis hash of HydraDX

* Update packages/networks/src/defaults.ts

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

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

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

* Rename ledgerApps

* Bump dev

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

* Extract all extensions

* build networks from upstream registry

* Build list

* Cleanups

* Extra tests against overrides

* Simplify all expansion

* Cleanups

* Updates

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

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

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

* Bump deps

* Apply suggestions from code review
2021-03-05 23:11:54 +01:00
113 changed files with 3389 additions and 2643 deletions
+5 -3
View File
@@ -1,4 +1,4 @@
6
7
2.6.2
2.12.2
@@ -11,5 +11,7 @@
5.6.2
5.6.3
5.9.2
6.0.2
6.0.2
6.0.3
6.0.4
6.0.5
+1 -1
View File
@@ -1,5 +1,5 @@
exclude_patterns:
- "**/*.spec.js"
- "**/*.spec.ts"
- "packages/networks/src/index.ts"
- "packages/networks/src/substrate.ts"
- "packages/util/src/is/utf8.ts"
+2 -2
View File
@@ -5,6 +5,6 @@ labels: ['ci', '@networks']
cc @polkadot-js/notifications
Discrepancies detected between https://github.com/paritytech/substrate/blob/master/ss58-registry.json and https://github.com/polkadot-js/common/blob/master/packages/networks/src/index.ts
Discrepancies detected between https://github.com/paritytech/substrate/blob/master/ss58-registry.json and https://github.com/polkadot-js/common/blob/master/packages/networks/src/substrate.ts
Check the nightly cron output or run `yarn networks:crosscheck` locally. The output as found from the test includes:
Check the nightly cron output (or via `yarn networks:crosscheck` locally) and run `yarn networks:sync` to update. The output as found from the test includes:
+17
View File
@@ -0,0 +1,17 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '15 2 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GH_PAT }}
stale-issue-message: 'This issue has been open for 21 days with no activity and is not labelled as an enhancement. It will be closed in 7 days.'
stale-issue-label: 'stale'
exempt-issue-labels: '-size-l,-size-m,-size-s,-size-xl,-size-xs,[bug]'
days-before-stale: 21
days-before-close: 7
+94
View File
@@ -1,5 +1,99 @@
# CHANGELOG
## 6.6.1 May 29, 2021
Changes:
- Adjust HD path validation & replacement
- Sync with Substrate ss58 registry
## 6.5.1 May 22, 2021
Changes:
- Allow hdLedger derivation with optional 25th word password
- Sync with Substrate ss58 registry
## 6.4.1 May 15, 2021
Contributed:
- Update genesis for HydraDx gen-3 (Thanks to https://github.com/jak-pan)
- Allow Ethereum pair in keyring addAddress (Thanks to https://github.com/joelamouche)
Changes:
- Added additional double-byte ss58 tests
- Aligned ss58 registry with Substrate
- Add explicit log for deprecation of `setSS58Format`
## 6.3.1 Apr 25, 2021
Changes:
- Added `stringify` util to correctly handle `JSON.stringify` with `BigInt` values
- Additional input asserts for non-convertible values in `u8aToU8a`
- Adapt `@polkadot/x-global` to return `globalThis` as available
- Minor readability cleanups
- BN manipulation via in-place shifts (as applicable)
- Add explicit `engines` config to `package.json`
## 6.2.1 Apr 18, 2021
Contributed:
- Added HydraDx genesis (Thanks to https://github.com/jak-pan)
Changes:
- Add `isAddress` and `validateAddress` functions (the latter will throw if invalid)
- Check `@polkadot/hw-ledger` against `@polkadot/networks` for discrepancies (test-only)
- Align ss58 registry with upstream Substrate
## 6.1.1 Apr 11, 2021
Contributed:
- Adjust Polymath genesis in `@polkadot/networks` (Thanks to https://github.com/adamdossa)
- Adjust `@polkadot/util` logger for +/-/* compat (Thanks to https://github.com/Lezek123)
- Fix typo in `@polkadot/util` detect messaging (Thanks to https://github.com/amphineko)
Changes:
- Remove `@polkadot/networks` code duplication, manages data via script from upstream
- Align ss58 registry with upstream Substrate
## 6.0.5 Mar 8, 2021
Changes:
- Fix for `@polkadot/x-rxjs` in Node CJS environments (no Node-specific import)
## 6.0.4 Mar 7, 2021
Contributed:
- Enhance check for global process existence (Thanks to https://github.com/Yuripetusko)
Changes:
- Dedupe & optimize logger process.env checks
## 6.0.3 Mar 5, 2021
Changes:
- Add import indirection for both CJS & ESM (where generated source file is commonjs)
## 6.0.2 Mar 5, 2021
Changes:
+7 -6
View File
@@ -7,7 +7,7 @@
"packages/*"
],
"resolutions": {
"typescript": "^4.2.2"
"typescript": "^4.2.4"
},
"scripts": {
"build": "polkadot-dev-build-ts",
@@ -15,15 +15,16 @@
"lint": "polkadot-dev-run-lint",
"clean": "polkadot-dev-clean-build",
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
"networks:sync": "node packages/networks/scripts/fromSubstrate.mjs",
"postinstall": "polkadot-dev-yarn-only",
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck",
"test:one": "polkadot-dev-run-test"
},
"devDependencies": {
"@babel/core": "^7.13.8",
"@polkadot/dev": "^0.62.5",
"@polkadot/ts": "^0.3.61",
"@types/jest": "^26.0.20"
"@babel/core": "^7.14.3",
"@polkadot/dev": "^0.62.20",
"@polkadot/ts": "^0.3.69",
"@types/jest": "^26.0.23"
},
"version": "6.0.2"
"version": "6.6.1"
}
+7 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/hw-ledger-transports",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -11,15 +11,18 @@
"browser": "browser.js",
"react-native": "react-native.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"dependencies": {
"@babel/runtime": "^7.13.9",
"@ledgerhq/hw-transport-webusb": "^5.45.0"
"@babel/runtime": "^7.14.0",
"@ledgerhq/hw-transport-webusb": "^5.51.1"
},
"devDependencies": {
"@types/ledgerhq__hw-transport-node-hid": "^4.22.2",
"@types/ledgerhq__hw-transport-webusb": "^4.70.1"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid-singleton": "^5.45.0"
"@ledgerhq/hw-transport-node-hid-singleton": "^5.51.1"
}
}
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '6.6.1' };
+8 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/hw-ledger",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -12,10 +12,13 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/hw-ledger-transports": "6.0.2",
"@polkadot/util": "^6.0.2",
"@zondax/ledger-polkadot": "^0.13.4"
"@babel/runtime": "^7.14.0",
"@polkadot/hw-ledger-transports": "6.6.1",
"@polkadot/util": "^6.6.1",
"@zondax/ledger-polkadot": "^0.14.0"
}
}
+10
View File
@@ -0,0 +1,10 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
export const LEDGER_DEFAULT_CHANGE = 0x80000000;
export const LEDGER_DEFAULT_INDEX = 0x80000000;
export const LEDGER_SUCCESS_CODE = 0x9000;
+24
View File
@@ -0,0 +1,24 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { knownLedger } from '@polkadot/networks/defaults';
import { ledgerApps } from './defaults';
describe('defaults', (): void => {
it('has entries for each of the apps (hwledger -> networks)', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!ledgerApps[network]
)
).toEqual([]);
});
it('has entries for each of the apps (networks -> hwledger)', (): void => {
expect(
Object.keys(ledgerApps).filter((network) =>
!knownLedger[network]
)
).toEqual([]);
});
});
+18
View File
@@ -0,0 +1,18 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type Transport from '@ledgerhq/hw-transport';
import type { SubstrateApp } from '@zondax/ledger-polkadot';
import { newDockApp, newEquilibriumApp, newKusamaApp, newPolkadotApp, newPolymeshApp } from '@zondax/ledger-polkadot';
// These match up with the network keys in the @polkadot/networks package
// (which is turn aligns with the substrate/ss58-registry.json as the single
// source of truth)
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
'dock-mainnet': newDockApp,
equilibrium: newEquilibriumApp,
kusama: newKusamaApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp
};
+10 -27
View File
@@ -3,35 +3,18 @@
import './detectPackage';
import type Transport from '@ledgerhq/hw-transport';
import type { ResponseBase, SubstrateApp } from '@zondax/ledger-polkadot';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
import { newDockApp, newKusamaApp, newPolkadotApp, newPolymeshApp, ResponseBase, SubstrateApp } from '@zondax/ledger-polkadot';
import { transports } from '@polkadot/hw-ledger-transports';
import { assert, u8aToBuffer } from '@polkadot/util';
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants';
import { ledgerApps } from './defaults';
export { packageInfo } from './packageInfo';
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
export const LEDGER_DEFAULT_CHANGE = 0x80000000;
export const LEDGER_DEFAULT_INDEX = 0x80000000;
const SUCCESS_CODE = 0x9000;
// These match up with the network keys in the @polkadot/networks package
// (which is turn aligns with the substrate/ss58-registry.json as the single
// source of truth)
const APPS: Record<string, (transport: Transport) => SubstrateApp> = {
dock: newDockApp,
kusama: newKusamaApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp
};
type Chain = keyof typeof APPS;
type Chain = keyof typeof ledgerApps;
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
@@ -45,8 +28,8 @@ export class Ledger {
constructor (transport: LedgerTypes, chain: Chain) {
// u2f is deprecated
assert(['hid', 'webusb'].includes(transport), `Unsupported transport ${transport}`);
assert(Object.keys(APPS).includes(chain), `Unsupported chain ${chain}`);
assert(['hid', 'webusb'].includes(transport), () => `Unsupported transport ${transport}`);
assert(Object.keys(ledgerApps).includes(chain), () => `Unsupported chain ${chain}`);
this.#chain = chain;
this.#transport = transport;
@@ -90,11 +73,11 @@ export class Ledger {
if (!this.#app) {
const def = transports.find(({ type }) => type === this.#transport);
assert(def, `Unable to find a transport for ${this.#transport}`);
assert(def, () => `Unable to find a transport for ${this.#transport}`);
const transport = await def.create();
this.#app = APPS[this.#chain](transport);
this.#app = ledgerApps[this.#chain](transport);
}
return this.#app;
@@ -115,7 +98,7 @@ export class Ledger {
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
const result = await promise;
assert(result.return_code === SUCCESS_CODE, result.error_message);
assert(result.return_code === LEDGER_SUCCESS_CODE, () => result.error_message);
return result;
};
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/hw-ledger', version: '6.6.1' };
+9 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/keyring",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "Keyring management",
"author": "Jaco Greeff <jacogr@gmail.com>",
@@ -12,16 +12,19 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"repository": "github:polkadot-js/common",
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/util": "6.0.2",
"@polkadot/util-crypto": "6.0.2"
"@babel/runtime": "^7.14.0",
"@polkadot/util": "6.6.1",
"@polkadot/util-crypto": "6.6.1"
},
"peerDependencies": {
"@polkadot/util": "6.0.2",
"@polkadot/util-crypto": "6.0.2"
"@polkadot/util": "6.6.1",
"@polkadot/util-crypto": "6.6.1"
}
}
+11 -2
View File
@@ -121,6 +121,14 @@ describe('keypair', (): void => {
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
});
it('creates via dev seed (2-byte encoding)', (): void => {
keyring.setSS58Format(252);
expect(
keyring.addFromUri('//Alice').address
).toEqual('xw8P6urbSAronL3zZFB7dg8p7LLSgKCUFDUgjohnf1iP434ic');
});
it('adds the pair', (): void => {
expect(
keyring.addFromSeed(seedTwo, {}).publicKey
@@ -311,6 +319,7 @@ describe('keypair', (): void => {
const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy' + '/m/44\'/60\'/0\'/0/0';
const PRIV_KEY_ONE = '0x070dc3117300011918e26b02176945cc15c3d548cf49fd8418d97f93af699e46';
const ETH_ADDRESS_ONE = '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d';
const ETH_ADDRESS_TWO = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
let keyring: Keyring;
@@ -388,13 +397,13 @@ describe('keypair', (): void => {
);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.address).toEqual(ETH_ADDRESS_TWO);
pair.decodePkcs8('password');
expect(pair.isLocked).toBe(false);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toBe('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.address).toBe(ETH_ADDRESS_TWO);
});
it('allows for signing/verification', (): void => {
+3 -3
View File
@@ -47,7 +47,7 @@ export class Keyring implements KeyringInstance {
constructor (options: KeyringOptions = {}) {
options.type = options.type || 'ed25519';
assert(options && ['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type}`);
assert(['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), () => `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
this.#pairs = new Pairs();
this.#ss58 = options.ss58Format;
@@ -86,7 +86,7 @@ export class Keyring implements KeyringInstance {
/**
* @name addFromAddress
* @summary Stores an account, given an account address, as a Key/Value (public key, pair) in Keyring Pair Dictionary
* @description Allows user to explicitely provide separate inputs including account address or public key, and optionally
* @description Allows user to explicitly provide separate inputs including account address or public key, and optionally
* the associated account metadata, and the default encoded value as arguments (that may be obtained from the json file
* of an account backup), and then generates a keyring pair from them that it passes to
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
@@ -168,7 +168,7 @@ export class Keyring implements KeyringInstance {
? [type]
: type;
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), `Unknown crypto type ${cryptoType}`);
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), () => `Unknown crypto type ${cryptoType}`);
// Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs
const publicKey = isHex(address)
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/keyring', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/keyring', version: '6.6.1' };
+11 -2
View File
@@ -10,6 +10,8 @@ import { createPair } from '.';
const keyring = createTestPairs({ type: 'ed25519' }, false);
const TEST_ADDRESS = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
describe('pair', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
@@ -159,8 +161,15 @@ describe('pair', (): void => {
it('has a valid address from a known public', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') });
expect(pair.address).toEqual('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887');
expect(pair.addressRaw).toEqual(hexToU8a('0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887'));
expect(pair.address).toEqual(TEST_ADDRESS);
expect(pair.addressRaw).toEqual(hexToU8a(TEST_ADDRESS));
});
it('has a valid address from a known ethereum address (20 length)', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: new Uint8Array([75, 32, 205, 127, 248, 119, 52, 31, 46, 171, 170, 23, 158, 23, 46, 108, 95, 180, 186, 168]), secretKey: new Uint8Array([]) });
expect(pair.address.toLowerCase()).toEqual('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8');
expect(pair.addressRaw).toEqual(hexToU8a('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8'));
});
it('converts to json', (): void => {
+1 -1
View File
@@ -44,7 +44,7 @@ const TYPE_SIGNATURE = {
const TYPE_ADDRESS = {
ecdsa: (p: Uint8Array) => p.length > 32 ? blake2AsU8a(p) : p,
ed25519: (p: Uint8Array) => p,
ethereum: (p: Uint8Array) => keccakAsU8a(secp256k1Expand(p)),
ethereum: (p: Uint8Array) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),
sr25519: (p: Uint8Array) => p
};
+4 -6
View File
@@ -24,13 +24,11 @@ export class Pairs implements KeyringPairs {
public get (address: string | Uint8Array): KeyringPair {
const pair = this.#map[decodeAddress(address).toString()];
assert(pair, (): string => {
const formatted: string = isU8a(address) || isHex(address)
assert(pair, () => `Unable to retrieve keypair '${
isU8a(address) || isHex(address)
? u8aToHex(u8aToU8a(address))
: address;
return `Unable to retrieve keypair '${formatted}'`;
});
: address
}'`);
return pair;
}
+4 -2
View File
@@ -7,6 +7,8 @@ import { cryptoWaitReady } from '@polkadot/util-crypto';
import { createTestPairs } from './testingPairs';
import Keyring from '.';
const TEST_ADD = '0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac';
describe('testingPairs', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
@@ -33,7 +35,7 @@ describe('testingPairs', (): void => {
it('has the correct address for Alith (Eth)', (): void => {
expect(
createTestPairs({ type: 'ethereum' }).Alith.address
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
).toEqual(TEST_ADD);
});
it('has the correct address for Alith (Eth), same as obtained by createFromUri', (): void => {
@@ -42,7 +44,7 @@ describe('testingPairs', (): void => {
expect(
pair && pair.address
).toEqual('0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac');
).toEqual(TEST_ADD);
});
it('checks eth test addresses', (): void => {
+7 -4
View File
@@ -1,10 +1,13 @@
{
"name": "@polkadot/networks",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A list of all available Substrate networks and their applicable prefixes",
"main": "index.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"repository": "github:polkadot-js/common",
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
@@ -13,10 +16,10 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
"dependencies": {
"@babel/runtime": "^7.13.9"
"@babel/runtime": "^7.14.0"
},
"devDependencies": {
"@polkadot/util": "6.0.2",
"@polkadot/x-fetch": "6.0.2"
"@polkadot/util": "6.6.1",
"@polkadot/x-fetch": "6.6.1"
}
}
@@ -0,0 +1,59 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import fs from 'fs';
import fetch from 'node-fetch';
const SUBSTRATE_REGISTRY = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
function outputField (v) {
if (typeof v === 'string') {
return `'${v}'`;
} else if (Array.isArray(v)) {
return `[${v.map((v) => outputField(v)).join(', ')}]`;
}
return v;
}
async function getSubstrateRegistry () {
const original = await fetch(SUBSTRATE_REGISTRY);
const json = await original.json();
return json.registry
.map((e) =>
` {\n${Object
.entries(e)
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => ` ${k}: ${outputField(v)}`)
.join(',\n')}\n }`
)
.join(',\n');
}
getSubstrateRegistry()
.then((entries) => {
fs.writeFileSync('packages/networks/src/substrate.ts', `// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Auto-generated by yarn networks:sync (via scripts/fromSubstrate.mjs)
//
// Do not edit, rather
// - make a PR to the upstream registry as per ${SUBSTRATE_REGISTRY}
// - yarn networks:sync
//
import type { KnownSubstrate } from './types';
export const knownSubstrate: KnownSubstrate[] = [\n${entries}\n];
`);
console.log('Completed.');
process.exit(0);
})
.catch((error) => {
console.error('Error:', error.message);
process.exit(-1);
});
+9 -10
View File
@@ -1,16 +1,17 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Ss58Registry } from './types';
import type { KnownSubstrate, Ss58Registry } from './types';
import fs from 'fs';
import { stringify } from '@polkadot/util';
import { fetch } from '@polkadot/x-fetch';
import { all } from './';
const ORIGINAL = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
const OUTPUT = './.github/ss58-check.md';
const SUBSTRATE_REGISTRY = 'https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json';
function assertAndLog (check: boolean, error: string): void {
if (!check) {
@@ -27,7 +28,7 @@ describe('check latest Substrate ss58 registry', (): void => {
let original: Ss58Registry;
beforeAll(async (): Promise<void> => {
original = (await (await fetch(ORIGINAL)).json()) as Ss58Registry;
original = (await (await fetch(SUBSTRATE_REGISTRY)).json()) as Ss58Registry;
});
it('has the same number as the original', (): void => {
@@ -39,7 +40,7 @@ describe('check latest Substrate ss58 registry', (): void => {
.filter(({ prefix }) => !all.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Missing entries found: ${JSON.stringify(missing, null, 2)}`);
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
});
it('has no extra entries', (): void => {
@@ -47,11 +48,11 @@ describe('check latest Substrate ss58 registry', (): void => {
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Extra entries found: ${JSON.stringify(missing, null, 2)}`);
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
});
it('has the same values as the original', (): void => {
const fields = Object.keys(original.schema);
const fields = Object.keys(original.schema) as (keyof KnownSubstrate)[];
const errors = original.registry
.map((n): [string, string[]] => {
const other = all.find(({ prefix }) => prefix === n.prefix);
@@ -59,14 +60,12 @@ describe('check latest Substrate ss58 registry', (): void => {
return [
`${n.displayName} (${n.prefix})`,
other
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
? fields.filter((f) => JSON.stringify(n[f]) !== JSON.stringify(other[f]))
? fields.filter((f) => stringify(n[f]) !== stringify(other[f]))
: []
];
})
.filter(([, fields]) => fields.length);
assertAndLog(!errors.length, `Mismatches found: ${JSON.stringify(errors.map(([name, m]) => `${name}:: ${m.join(', ')}`), null, 2)}`);
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
});
});
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { knownGenesis, knownLedger } from './defaults';
describe('defaults', (): void => {
it('has genesis for all Ledger chains', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!knownGenesis[network]
)
).toEqual([]);
});
});
+69
View File
@@ -0,0 +1,69 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KnownGenesis, KnownIcon, KnownLedger, KnownTestnet } from './types';
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
// last. This make lookups for the current a simple genesisHash[0]
// (See Kusama as an example)
export const knownGenesis: KnownGenesis = {
'dock-mainnet': [
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
],
edgeware: [
'0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
],
equilibrium: [
'0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
],
hydradx: [
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
],
kulupu: [
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
],
kusama: [
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
plasm: [
'0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'
],
polkadot: [
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
],
polymesh: [
'0x9deeb940c92ae02111c3bd5baca89970384f4c9849f02a1b2e53e66414d30f9f'
],
subsocial: [
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
]
};
// these are icon overrides
export const knownIcon: KnownIcon = {
kusama: 'polkadot',
polkadot: 'polkadot'
};
// support for ledger
export const knownLedger: KnownLedger = {
'dock-mainnet': 0x00000252,
equilibrium: 0x05f5e0fd,
kusama: 0x000001b2,
polkadot: 0x00000162,
polymesh: 0x00000253
};
// testnets should not allow selection
export const knownTestnet: KnownTestnet = {
'dock-testnet': true,
jupiter: true,
'mathchain-testnet': true,
'zero-alphaville': true
};
+67 -1
View File
@@ -1,7 +1,10 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import filtered, { available } from '.';
import type { SubstrateNetwork } from './types';
import { knownGenesis, knownIcon, knownLedger, knownTestnet } from './defaults';
import filtered, { all, available } from '.';
describe('filtered', (): void => {
it('has the correct starting order', (): void => {
@@ -11,4 +14,67 @@ describe('filtered', (): void => {
it('has no ignored networks', (): void => {
expect(available.some(({ isIgnored }) => isIgnored)).toEqual(false);
});
it('has no reserved networks', (): void => {
expect(available.some(({ prefix }) => prefix === 47)).toEqual(false);
});
it('has all genesis information', (): void => {
expect(
Object.entries(knownGenesis).filter(([network, genesisHash]) =>
available.some((a) =>
a.network === network &&
genesisHash.some((g, index) => a.genesisHash[index] !== g)
)
)
).toEqual([]);
});
it('has all ledger details', (): void => {
expect(
Object.entries(knownLedger).filter(([network, slip44]) =>
available.some((a) =>
a.network === network && (
a.slip44 !== slip44 ||
!a.hasLedgerSupport ||
!a.genesisHash.length
)
)
)
).toEqual([]);
});
it('has no testnets exposed', (): void => {
expect(
Object.keys(knownTestnet).filter((network) =>
available.some((a) =>
a.network === network
)
)
).toEqual([]);
});
it('has all icons, except for overrides', (): void => {
expect(
available.filter(({ icon, network }) =>
icon !== 'substrate' &&
knownIcon[network] !== icon
)
).toEqual([]);
});
it('has no ss58 duplicates', (): void => {
const dupes: SubstrateNetwork[] = [];
const uniques: SubstrateNetwork[] = [];
all.forEach((a): void => {
if (uniques.some((u) => u.prefix === a.prefix)) {
dupes.push(a);
} else {
uniques.push(a);
}
});
expect(dupes).toEqual([]);
});
});
+17 -480
View File
@@ -1,502 +1,39 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// This contains exactly the same information as available in (with some extensions)
// https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json
//
// Once the above is published as a package, the duplication here can be removed
import type { Network, SubstrateNetwork } from './types';
import type { Network, NetworkFromSubstrate, NetworkFromSubstrateNamed } from './types';
import { knownGenesis, knownIcon, knownLedger, knownTestnet } from './defaults';
import { knownSubstrate } from './substrate';
export { packageInfo } from './packageInfo';
// These are known prefixes that are not sorted
const UNSORTED = [0, 2, 42];
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
// last. This make lookups for the current a simple genesisHash[0]
// (See Kusama as an example)
export const all = knownSubstrate.map((o): SubstrateNetwork => {
const network = o.network || '';
const n = o as SubstrateNetwork;
const createReserved = (prefix: number, displayName: string, network: string | null = null): NetworkFromSubstrate => ({
decimals: null,
displayName,
isIgnored: true,
network,
prefix,
standardAccount: null,
symbols: null,
website: null
n.slip44 = knownLedger[network];
n.hasLedgerSupport = !!n.slip44;
n.genesisHash = knownGenesis[network] || [];
n.icon = knownIcon[network] || 'substrate';
n.isIgnored = !network || !!knownTestnet[network] || network.startsWith('reserved');
return n;
});
export const all: NetworkFromSubstrate[] = [
{
decimals: [10],
displayName: 'Polkadot Relay Chain',
genesisHash: ['0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'],
hasLedgerSupport: true,
icon: 'polkadot',
network: 'polkadot',
prefix: 0,
slip44: 0x00000162,
standardAccount: '*25519',
symbols: ['DOT'],
website: 'https://polkadot.network'
},
createReserved(1, 'Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.'),
{
decimals: [12],
displayName: 'Kusama Relay Chain',
genesisHash: [
'0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', // Kusama CC3,
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
hasLedgerSupport: true,
icon: 'polkadot',
network: 'kusama',
prefix: 2,
slip44: 0x000001b2,
standardAccount: '*25519',
symbols: ['KSM'],
website: 'https://kusama.network'
},
createReserved(3, 'Bare 32-bit Ed25519 public key.'),
{
decimals: null,
displayName: 'Katal Chain',
network: 'katalchain',
prefix: 4,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Plasm Network',
genesisHash: ['0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'],
network: 'plasm',
prefix: 5,
standardAccount: '*25519',
symbols: ['PLM'],
website: null
},
{
decimals: [12],
displayName: 'Bifrost',
network: 'bifrost',
prefix: 6,
standardAccount: '*25519',
symbols: ['BNC'],
website: 'https://bifrost.finance/'
},
{
decimals: [18],
displayName: 'Edgeware',
genesisHash: ['0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'],
network: 'edgeware',
prefix: 7,
standardAccount: '*25519',
symbols: ['EDG'],
website: 'https://edgewa.re'
},
{
decimals: [18],
displayName: 'Acala Karura Canary',
network: 'karura',
prefix: 8,
standardAccount: '*25519',
symbols: ['KAR'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar Reynolds Canary',
network: 'reynolds',
prefix: 9,
standardAccount: '*25519',
symbols: ['REY'],
website: 'http://laminar.network/'
},
{
decimals: [18],
displayName: 'Acala',
network: 'acala',
prefix: 10,
standardAccount: '*25519',
symbols: ['ACA'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar',
network: 'laminar',
prefix: 11,
standardAccount: '*25519',
symbols: ['LAMI'],
website: 'http://laminar.network/'
},
{
decimals: [6],
displayName: 'Polymesh',
genesisHash: ['0x12fddc9e2128b3fe571e4e5427addcb87fcaf08493867a68dd6ae44b406b39c7'],
hasLedgerSupport: true,
network: 'polymesh',
prefix: 12,
slip44: 0x00000253,
standardAccount: '*25519',
symbols: ['POLYX'],
website: 'https://polymath.network/'
},
{
decimals: null,
displayName: 'SubstraTEE',
network: 'substratee',
prefix: 13,
standardAccount: '*25519',
symbols: null,
website: 'https://www.substratee.com'
},
{
decimals: [0],
displayName: 'Totem',
network: 'totem',
prefix: 14,
standardAccount: '*25519',
symbols: ['XTX'],
website: 'https://totemaccounting.com'
},
{
decimals: [12],
displayName: 'Synesthesia',
network: 'synesthesia',
prefix: 15,
standardAccount: '*25519',
symbols: ['SYN'],
website: 'https://synesthesia.network/'
},
{
decimals: [12],
displayName: 'Kulupu',
genesisHash: ['0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'],
network: 'kulupu',
prefix: 16,
standardAccount: '*25519',
symbols: ['KLP'],
website: 'https://kulupu.network/'
},
{
decimals: null,
displayName: 'Dark Mainnet',
network: 'dark',
prefix: 17,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [9, 9],
displayName: 'Darwinia Network',
network: 'darwinia',
prefix: 18,
standardAccount: '*25519',
symbols: ['RING', 'KTON'],
website: 'https://darwinia.network/'
},
{
decimals: [12],
displayName: 'GeekCash',
network: 'geek',
prefix: 19,
standardAccount: '*25519',
symbols: ['GEEK'],
website: 'https://geekcash.org'
},
{
decimals: [12],
displayName: 'Stafi',
genesisHash: ['0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'],
network: 'stafi',
prefix: 20,
standardAccount: '*25519',
symbols: ['FIS'],
website: 'https://stafi.io'
},
{
decimals: [6],
displayName: 'Dock Testnet',
isIgnored: true, // testnet
network: 'dock-testnet',
prefix: 21,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: [6],
displayName: 'Dock Mainnet',
genesisHash: ['0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'],
hasLedgerSupport: true,
network: 'dock-mainnet',
prefix: 22,
slip44: 0x00000252,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: null,
displayName: 'ShiftNrg',
network: 'shift',
prefix: 23,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'ZERO',
network: 'zero',
prefix: 24,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [18],
displayName: 'ZERO Alphaville',
isIgnored: true, // testnet
network: 'zero-alphaville',
prefix: 25,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [10],
displayName: 'Jupiter',
isIgnored: true, // testnet
network: 'jupiter',
prefix: 26,
standardAccount: '*25519',
symbols: ['jDOT'],
website: 'https://jupiter.patract.io'
},
{
decimals: [10, 12],
displayName: 'Patract',
network: 'patract',
prefix: 27,
standardAccount: '*25519',
symbols: ['pDOT', 'pKSM'],
website: 'https://patract.network'
},
{
decimals: null,
displayName: 'Subsocial',
genesisHash: ['0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'],
network: 'subsocial',
prefix: 28,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'Dhiway CORD Network',
network: 'cord',
prefix: 29,
standardAccount: '*25519',
symbols: ['DCU'],
website: 'https://dhiway.com/'
},
{
decimals: [12],
displayName: 'Phala Network',
network: 'phala',
prefix: 30,
standardAccount: '*25519',
symbols: ['PHA'],
website: 'https://phala.network'
},
{
decimals: [12],
displayName: 'Litentry Network',
network: 'litentry',
prefix: 31,
standardAccount: '*25519',
symbols: ['LIT'],
website: 'https://litentry.com/'
},
{
decimals: [9],
displayName: 'Robonomics',
network: 'robonomics',
prefix: 32,
standardAccount: '*25519',
symbols: ['XRT'],
website: 'https://robonomics.network'
},
{
decimals: null,
displayName: 'DataHighway',
network: 'datahighway',
prefix: 33,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Ares Protocol',
network: 'ares',
prefix: 34,
standardAccount: '*25519',
symbols: ['ARES'],
website: 'https://www.aresprotocol.com/'
},
{
decimals: [15],
displayName: 'Valiu Liquidity Network',
network: 'vln',
prefix: 35,
standardAccount: '*25519',
symbols: ['USDv'],
website: 'https://valiu.com/'
},
{
decimals: [18],
displayName: 'Centrifuge Chain',
network: 'centrifuge',
prefix: 36,
standardAccount: '*25519',
symbols: ['RAD'],
website: 'https://centrifuge.io/'
},
{
decimals: [18],
displayName: 'Nodle Chain',
network: 'nodle',
prefix: 37,
standardAccount: '*25519',
symbols: ['NODL'],
website: 'https://nodle.io/'
},
{
decimals: [18],
displayName: 'KILT Chain',
network: 'kilt',
prefix: 38,
standardAccount: '*25519',
symbols: ['KILT'],
website: 'https://kilt.io/'
},
{
decimals: [18],
displayName: 'MathChain mainnet',
network: 'mathchain',
prefix: 39,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: [18],
displayName: 'MathChain testnet',
isIgnored: true, // testnet
network: 'mathchain-testnet',
prefix: 40,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: null,
displayName: 'Polimec Chain',
network: 'poli',
prefix: 41,
standardAccount: '*25519',
symbols: null,
website: 'https://polimec.io/'
},
{
decimals: null,
displayName: 'Substrate',
network: 'substrate',
prefix: 42,
standardAccount: '*25519',
symbols: null,
website: 'https://substrate.dev/'
},
createReserved(43, 'Bare 32-bit ECDSA SECP-256k1 public key.'),
{
decimals: [8],
displayName: 'ChainX',
network: 'chainx',
prefix: 44,
standardAccount: '*25519',
symbols: ['PCX'],
website: 'https://chainx.org/'
},
{
decimals: [12, 12],
displayName: 'UniArts Network',
network: 'uniarts',
prefix: 45,
standardAccount: '*25519',
symbols: ['UART', 'UINK'],
website: 'https://uniarts.me'
},
createReserved(46, 'This prefix is reserved.', 'reserved46'),
createReserved(47, 'This prefix is reserved.', 'reserved47'),
{
decimals: [12],
displayName: 'Neatcoin Mainnet',
network: 'neatcoin',
prefix: 48,
standardAccount: '*25519',
symbols: ['NEAT'],
website: 'https://neatcoin.org'
},
{
decimals: [12],
displayName: 'HydraDX',
network: 'hydradx',
prefix: 63,
standardAccount: '*25519',
symbols: ['HDX'],
website: 'https://hydradx.io'
},
{
decimals: [18],
displayName: 'AvN Mainnet',
network: 'aventus',
prefix: 65,
standardAccount: '*25519',
symbols: ['AVT'],
website: 'https://aventus.io'
},
{
decimals: [12],
displayName: 'Crust Network',
network: 'crust',
prefix: 66,
standardAccount: '*25519',
symbols: ['CRU'],
website: 'https://crust.network'
}
];
// The list of available/claimed prefixes
// - no testnets
// - we only include those where we have a standardAccount
// - when no icon has been specified, default to substrate
// - sort by name, however we keep 0, 2, 42 first in the list
export const available: Network[] = all
.filter((n): n is NetworkFromSubstrateNamed => !n.isIgnored && !!n.network)
.map((n) => ({ ...n, genesisHash: n.genesisHash || [], icon: n.icon || 'substrate' }))
export const available = all
.filter((n): n is Network => !n.isIgnored && !!n.network)
.sort((a, b) =>
UNSORTED.includes(a.prefix) && UNSORTED.includes(b.prefix)
UNSORTED.includes(a.prefix) === UNSORTED.includes(b.prefix)
? 0
: UNSORTED.includes(a.prefix)
? -1
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/networks', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/networks', version: '6.6.1' };
+527
View File
@@ -0,0 +1,527 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Auto-generated by yarn networks:sync (via scripts/fromSubstrate.mjs)
//
// Do not edit, rather
// - make a PR to the upstream registry as per https://raw.githubusercontent.com/paritytech/substrate/master/ss58-registry.json
// - yarn networks:sync
//
import type { KnownSubstrate } from './types';
export const knownSubstrate: KnownSubstrate[] = [
{
decimals: [10],
displayName: 'Polkadot Relay Chain',
network: 'polkadot',
prefix: 0,
standardAccount: '*25519',
symbols: ['DOT'],
website: 'https://polkadot.network'
},
{
decimals: null,
displayName: 'Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.',
network: null,
prefix: 1,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Kusama Relay Chain',
network: 'kusama',
prefix: 2,
standardAccount: '*25519',
symbols: ['KSM'],
website: 'https://kusama.network'
},
{
decimals: null,
displayName: 'Bare 32-bit Ed25519 public key.',
network: null,
prefix: 3,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: null,
displayName: 'Katal Chain',
network: 'katalchain',
prefix: 4,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [15],
displayName: 'Plasm Network',
network: 'plasm',
prefix: 5,
standardAccount: '*25519',
symbols: ['PLM'],
website: 'https://plasmnet.io'
},
{
decimals: [12],
displayName: 'Bifrost',
network: 'bifrost',
prefix: 6,
standardAccount: '*25519',
symbols: ['BNC'],
website: 'https://bifrost.finance/'
},
{
decimals: [18],
displayName: 'Edgeware',
network: 'edgeware',
prefix: 7,
standardAccount: '*25519',
symbols: ['EDG'],
website: 'https://edgewa.re'
},
{
decimals: [12],
displayName: 'Karura',
network: 'karura',
prefix: 8,
standardAccount: '*25519',
symbols: ['KAR'],
website: 'https://karura.network/'
},
{
decimals: [18],
displayName: 'Laminar Reynolds Canary',
network: 'reynolds',
prefix: 9,
standardAccount: '*25519',
symbols: ['REY'],
website: 'http://laminar.network/'
},
{
decimals: [12],
displayName: 'Acala',
network: 'acala',
prefix: 10,
standardAccount: '*25519',
symbols: ['ACA'],
website: 'https://acala.network/'
},
{
decimals: [18],
displayName: 'Laminar',
network: 'laminar',
prefix: 11,
standardAccount: '*25519',
symbols: ['LAMI'],
website: 'http://laminar.network/'
},
{
decimals: [6],
displayName: 'Polymesh',
network: 'polymesh',
prefix: 12,
standardAccount: '*25519',
symbols: ['POLYX'],
website: 'https://polymath.network/'
},
{
decimals: null,
displayName: 'SubstraTEE',
network: 'substratee',
prefix: 13,
standardAccount: '*25519',
symbols: null,
website: 'https://www.substratee.com'
},
{
decimals: [0],
displayName: 'Totem',
network: 'totem',
prefix: 14,
standardAccount: '*25519',
symbols: ['XTX'],
website: 'https://totemaccounting.com'
},
{
decimals: [12],
displayName: 'Synesthesia',
network: 'synesthesia',
prefix: 15,
standardAccount: '*25519',
symbols: ['SYN'],
website: 'https://synesthesia.network/'
},
{
decimals: [12],
displayName: 'Kulupu',
network: 'kulupu',
prefix: 16,
standardAccount: '*25519',
symbols: ['KLP'],
website: 'https://kulupu.network/'
},
{
decimals: null,
displayName: 'Dark Mainnet',
network: 'dark',
prefix: 17,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [9, 9],
displayName: 'Darwinia Network',
network: 'darwinia',
prefix: 18,
standardAccount: '*25519',
symbols: ['RING', 'KTON'],
website: 'https://darwinia.network/'
},
{
decimals: [12],
displayName: 'GeekCash',
network: 'geek',
prefix: 19,
standardAccount: '*25519',
symbols: ['GEEK'],
website: 'https://geekcash.org'
},
{
decimals: [12],
displayName: 'Stafi',
network: 'stafi',
prefix: 20,
standardAccount: '*25519',
symbols: ['FIS'],
website: 'https://stafi.io'
},
{
decimals: [6],
displayName: 'Dock Testnet',
network: 'dock-testnet',
prefix: 21,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: [6],
displayName: 'Dock Mainnet',
network: 'dock-mainnet',
prefix: 22,
standardAccount: '*25519',
symbols: ['DCK'],
website: 'https://dock.io'
},
{
decimals: null,
displayName: 'ShiftNrg',
network: 'shift',
prefix: 23,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'ZERO',
network: 'zero',
prefix: 24,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [18],
displayName: 'ZERO Alphaville',
network: 'zero-alphaville',
prefix: 25,
standardAccount: '*25519',
symbols: ['PLAY'],
website: 'https://zero.io'
},
{
decimals: [10],
displayName: 'Jupiter',
network: 'jupiter',
prefix: 26,
standardAccount: '*25519',
symbols: ['jDOT'],
website: 'https://jupiter.patract.io'
},
{
decimals: null,
displayName: 'Subsocial',
network: 'subsocial',
prefix: 28,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [18],
displayName: 'Dhiway CORD Network',
network: 'cord',
prefix: 29,
standardAccount: '*25519',
symbols: ['DCU'],
website: 'https://dhiway.com/'
},
{
decimals: [12],
displayName: 'Phala Network',
network: 'phala',
prefix: 30,
standardAccount: '*25519',
symbols: ['PHA'],
website: 'https://phala.network'
},
{
decimals: [12],
displayName: 'Litentry Network',
network: 'litentry',
prefix: 31,
standardAccount: '*25519',
symbols: ['LIT'],
website: 'https://litentry.com/'
},
{
decimals: [9],
displayName: 'Robonomics',
network: 'robonomics',
prefix: 32,
standardAccount: '*25519',
symbols: ['XRT'],
website: 'https://robonomics.network'
},
{
decimals: null,
displayName: 'DataHighway',
network: 'datahighway',
prefix: 33,
standardAccount: '*25519',
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Ares Protocol',
network: 'ares',
prefix: 34,
standardAccount: '*25519',
symbols: ['ARES'],
website: 'https://www.aresprotocol.com/'
},
{
decimals: [15],
displayName: 'Valiu Liquidity Network',
network: 'vln',
prefix: 35,
standardAccount: '*25519',
symbols: ['USDv'],
website: 'https://valiu.com/'
},
{
decimals: [18],
displayName: 'Centrifuge Chain',
network: 'centrifuge',
prefix: 36,
standardAccount: '*25519',
symbols: ['RAD'],
website: 'https://centrifuge.io/'
},
{
decimals: [18],
displayName: 'Nodle Chain',
network: 'nodle',
prefix: 37,
standardAccount: '*25519',
symbols: ['NODL'],
website: 'https://nodle.io/'
},
{
decimals: [18],
displayName: 'KILT Chain',
network: 'kilt',
prefix: 38,
standardAccount: '*25519',
symbols: ['KILT'],
website: 'https://kilt.io/'
},
{
decimals: [18],
displayName: 'MathChain mainnet',
network: 'mathchain',
prefix: 39,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: [18],
displayName: 'MathChain testnet',
network: 'mathchain-testnet',
prefix: 40,
standardAccount: '*25519',
symbols: ['MATH'],
website: 'https://mathwallet.org'
},
{
decimals: null,
displayName: 'Polimec Chain',
network: 'poli',
prefix: 41,
standardAccount: '*25519',
symbols: null,
website: 'https://polimec.io/'
},
{
decimals: null,
displayName: 'Substrate',
network: 'substrate',
prefix: 42,
standardAccount: '*25519',
symbols: null,
website: 'https://substrate.dev/'
},
{
decimals: null,
displayName: 'Bare 32-bit ECDSA SECP-256k1 public key.',
network: null,
prefix: 43,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [8],
displayName: 'ChainX',
network: 'chainx',
prefix: 44,
standardAccount: '*25519',
symbols: ['PCX'],
website: 'https://chainx.org/'
},
{
decimals: [12, 12],
displayName: 'UniArts Network',
network: 'uniarts',
prefix: 45,
standardAccount: '*25519',
symbols: ['UART', 'UINK'],
website: 'https://uniarts.me'
},
{
decimals: null,
displayName: 'This prefix is reserved.',
network: 'reserved46',
prefix: 46,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: null,
displayName: 'This prefix is reserved.',
network: 'reserved47',
prefix: 47,
standardAccount: null,
symbols: null,
website: null
},
{
decimals: [12],
displayName: 'Neatcoin Mainnet',
network: 'neatcoin',
prefix: 48,
standardAccount: '*25519',
symbols: ['NEAT'],
website: 'https://neatcoin.org'
},
{
decimals: [12],
displayName: 'HydraDX',
network: 'hydradx',
prefix: 63,
standardAccount: '*25519',
symbols: ['HDX'],
website: 'https://hydradx.io'
},
{
decimals: [18],
displayName: 'AvN Mainnet',
network: 'aventus',
prefix: 65,
standardAccount: '*25519',
symbols: ['AVT'],
website: 'https://aventus.io'
},
{
decimals: [12],
displayName: 'Crust Network',
network: 'crust',
prefix: 66,
standardAccount: '*25519',
symbols: ['CRU'],
website: 'https://crust.network'
},
{
decimals: [0, 9, 9, 9, 9, 9, 9, 9],
displayName: 'Equilibrium Network',
network: 'equilibrium',
prefix: 67,
standardAccount: '*25519',
symbols: ['Unknown', 'USD', 'EQ', 'ETH', 'BTC', 'EOS', 'DOT', 'CRV'],
website: 'https://equilibrium.io'
},
{
decimals: [18],
displayName: 'SORA Network',
network: 'sora',
prefix: 69,
standardAccount: '*25519',
symbols: ['XOR'],
website: 'https://sora.org'
},
{
decimals: [12],
displayName: 'Manta network',
network: 'manta',
prefix: 77,
standardAccount: '*25519',
symbols: ['MA'],
website: 'https://manta.network'
},
{
decimals: [12],
displayName: 'Calamari: Manta Canary Network',
network: 'calamari',
prefix: 78,
standardAccount: '*25519',
symbols: ['KMA'],
website: 'https://manta.network'
},
{
decimals: [18],
displayName: 'Social Network',
network: 'social-network',
prefix: 252,
standardAccount: '*25519',
symbols: ['NET'],
website: 'https://social.network'
},
{
decimals: [12],
displayName: 'Basilisk',
network: 'basilisk',
prefix: 10041,
standardAccount: '*25519',
symbols: ['BSX'],
website: 'https://bsx.fi'
}
];
+19 -13
View File
@@ -3,32 +3,38 @@
export type Icon = 'beachball' | 'empty' | 'jdenticon' | 'polkadot' | 'substrate';
export interface NetworkFromSubstrate {
export interface KnownSubstrate {
decimals: number[] | null,
displayName: string;
network: string | null;
prefix: number;
genesisHash?: string[] | null;
hasLedgerSupport?: boolean;
icon?: Icon | null;
isIgnored?: boolean;
slip44?: number;
standardAccount: '*25519' | null;
symbols: string[] | null;
website: string | null;
}
export interface NetworkFromSubstrateNamed extends NetworkFromSubstrate {
export type KnownIcon = Record<string, Icon>;
export type KnownLedger = Record<string, number>;
export type KnownGenesis = Record<string, string[]>;
export type KnownTestnet = Record<string, true>;
export interface SubstrateNetwork extends KnownSubstrate {
genesisHash: string[];
hasLedgerSupport: boolean;
icon: Icon;
isIgnored: boolean;
slip44?: number | null;
}
export interface Network extends SubstrateNetwork {
network: string;
}
export interface Network extends NetworkFromSubstrateNamed {
genesisHash: string[];
icon: Icon;
}
export interface Ss58Registry {
registry: NetworkFromSubstrate[];
registry: KnownSubstrate[];
specification: string;
schema: Record<string, string>;
}
+10 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/util-crypto",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A collection of useful crypto utilities for @polkadot",
"main": "index.js",
@@ -8,6 +8,9 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -16,11 +19,11 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util-crypto#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/networks": "6.0.2",
"@polkadot/util": "6.0.2",
"@polkadot/wasm-crypto": "^4.0.1",
"@polkadot/x-randomvalues": "6.0.2",
"@babel/runtime": "^7.14.0",
"@polkadot/networks": "6.6.1",
"@polkadot/util": "6.6.1",
"@polkadot/wasm-crypto": "^4.0.2",
"@polkadot/x-randomvalues": "6.6.1",
"base-x": "^3.0.8",
"base64-js": "^1.5.1",
"blakejs": "^1.1.0",
@@ -41,6 +44,6 @@
"@types/xxhashjs": "^0.2.2"
},
"peerDependencies": {
"@polkadot/util": "6.0.2"
"@polkadot/util": "6.6.1"
}
}
@@ -17,6 +17,18 @@ describe('checkAddressChecksum', (): void => {
).toEqual([true, 34, 2, 66]);
});
it('correctly extracts the info from a 2-byte-prefix address (69)', (): void => {
expect(
checkAddressChecksum(base58Decode('cnVvyMzRdqjwejTFuByQQ4w2yu78V2hpFixjHQz5zr6NSYsxA'))
).toEqual([true, 34, 2, 69]);
});
it('correctly extracts the info from a 2-byte-prefix address (252)', (): void => {
expect(
checkAddressChecksum(base58Decode('xw8Ffc2SZtDqUJKd9Ky4vc7PRz2D2asuVkEEzf3WGAbw9cnfq'))
).toEqual([true, 34, 2, 252]);
});
it('correctly extracts the info from a 2-byte-prefix address (255)', (): void => {
expect(
checkAddressChecksum(base58Decode('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k'))
@@ -89,6 +89,22 @@ describe('decodeAddress', (): void => {
);
});
it('decodes a 2-byte prefix (69)', (): void => {
expect(
decodeAddress('cnUaoo5wodnTVA4bnr4woSweto8hWZADUvLFXkR9Q6U7BRsbF')
).toEqual(
hexToU8a('0x88eafe0305d460d1695cf34c2f786050df8e40d215e488790cc70929c9e8316d')
);
});
it('decodes a 2-byte prefix (252)', (): void => {
expect(
decodeAddress('xw9Hca4RJTmBRgzJT4ieJBh7XCK9gE3NXBDSEmgGHd4TCrbnG')
).toEqual(
hexToU8a('0xfc422da6c3bc6dfa2a436a506428072941662f816987baaa8914e02ff5947f4b')
);
});
it('decodes a 2-byte prefix (255)', (): void => {
expect(
decodeAddress('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k')
@@ -103,12 +119,6 @@ describe('decodeAddress', (): void => {
).toEqual('0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9');
});
it.skip('allows invalid prefix (in list)', (): void => {
expect(
(): Uint8Array => decodeAddress('6GfvWUvHvU8otbZ7sFhXH4eYeMcKdUkL61P3nFy52efEPVUx')
).toThrow(/address prefix/);
});
it('fails when length is invalid', (): void => {
expect(
(): Uint8Array => decodeAddress('y9EMHt34JJo4rWLSaxoLGdYXvjgSXEd4zHUnQgfNzwES8b')
+4 -2
View File
@@ -10,7 +10,9 @@ import { base58Decode } from '../base58/decode';
import { checkAddressChecksum } from './checksum';
import { defaults } from './defaults';
export function decodeAddress (encoded: string | Uint8Array, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
export function decodeAddress (encoded?: string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array {
assert(encoded, 'Invalid empty address passed');
if (isU8a(encoded) || isHex(encoded)) {
return u8aToU8a(encoded);
}
@@ -23,7 +25,7 @@ export function decodeAddress (encoded: string | Uint8Array, ignoreChecksum?: bo
const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
assert(ignoreChecksum || isValid, 'Invalid decoded address checksum');
assert([-1, ss58Decoded].includes(ss58Format), `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
assert([-1, ss58Decoded].includes(ss58Format), () => `Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
return decoded.slice(ss58Length, endPos);
} catch (error) {
@@ -26,12 +26,24 @@ const SUBKEY = [
publicKey: '0x04a047d52fe542484c69bc528990cfeaf3a663dded0638ee1b51cf78bacd1072',
ss58Format: 66
},
{
// sora
address: 'cnVRwXfAnz3RSVQyBUC8f8McrK3YBX2QYd4WoctpeSC6VTJYm',
publicKey: '0xae640d53cfa815f4a6a50ae70235cd7d9d134d0f1c3a4ccd118e321dfb6ab51f',
ss58Format: 69
},
{
// ecdsa
address: '4pbsSkWcBaYoFHrKJZp5fDVUKbqSYD9dhZZGvpp3vQ5ysVs5ybV',
publicKey: '0x035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9',
ss58Format: 200
},
{
// social-network
address: 'xw5g1Eec8LT99pZLZMaTWwrwvNtfM6vrSuZeVbtEszCDUwByg',
publicKey: '0x5c64f1151f0ce4358c27238fb20c88e7c899825436f565410724c8c2c5add869',
ss58Format: 252
},
{
address: 'yGF4JP7q5AK46d1FPCEm9sYQ4KooSjHMpyVAjLnsCSWVafPnf',
publicKey: '0x66cd6cf085627d6c85af1aaf2bd10cf843033e929b4e3b1c2ba8e4aa46fe111b',
+14 -14
View File
@@ -11,27 +11,27 @@ import { decodeAddress } from './decode';
import { defaults } from './defaults';
import { sshash } from './sshash';
export function encodeAddress (_key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
export function encodeAddress (key: Uint8Array | string, ss58Format: Prefix = defaults.prefix): string {
// decode it, this means we can re-encode an address
const key = decodeAddress(_key);
const u8a = decodeAddress(key);
assert(ss58Format >= 0 && ss58Format <= 16383 && ![46, 47].includes(ss58Format), 'Out of range ss58Format specified');
assert(defaults.allowedDecodedLengths.includes(key.length), `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
assert(defaults.allowedDecodedLengths.includes(u8a.length), () => `Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
const isPublicKey = [32, 33].includes(key.length);
const input = u8aConcat(
new Uint8Array(
ss58Format < 64
? [ss58Format]
: [
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
]
),
key
ss58Format < 64
? [ss58Format]
: [
((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
(ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
],
u8a
);
return base58Encode(
u8aConcat(input, sshash(input).subarray(0, isPublicKey ? 2 : 1))
u8aConcat(
input,
sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)
)
);
}
@@ -13,5 +13,7 @@ export { encodeDerivedAddress } from './encodeDerived';
export { encodeMultiAddress } from './encodeMulti';
export { evmToAddress } from './evmToAddress';
export { addressEq } from './eq';
export { isAddress } from './is';
export { setSS58Format } from './setSS58Format';
export { sortAddresses } from './sort';
export { validateAddress } from './validate';
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Prefix } from './types';
import { validateAddress } from './validate';
export function isAddress (address?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): address is string {
try {
return validateAddress(address, ignoreChecksum, ss58Format);
} catch (error) {
return false;
}
}
@@ -3,12 +3,18 @@
import type { Prefix } from './types';
import { logger } from '@polkadot/util';
import { defaults } from './defaults';
const l = logger('setSS58Format');
/**
* @description Sets the global SS58 format to use for address encoding
* @deprecated Use keyring.setSS58Format
*/
export function setSS58Format (prefix: Prefix): void {
l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as pat of the address encode function');
defaults.prefix = prefix;
}
@@ -0,0 +1,10 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Prefix } from './types';
import { decodeAddress } from './decode';
export function validateAddress (encoded?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): encoded is string {
return !!decodeAddress(encoded, ignoreChecksum, ss58Format);
}
+1 -1
View File
@@ -11,6 +11,6 @@ export function testValidator (validate: (value?: string | null, ipfsCompat?: bo
}
}
export function isBase32 (value?: string | null, ipfsCompat?: boolean): boolean {
export function isBase32 (value?: string | null, ipfsCompat?: boolean): value is string {
return testValidator(base32Validate, value, ipfsCompat);
}
+2 -2
View File
@@ -10,8 +10,8 @@ const BASE_CONFIG = { alphabet: BASE32_ALPHABET, ipfsChar: 'b', type: 'base32' }
* @name base32Validate
* @summary Validates a base32 value.
* @description
* Validates the the supplied value is valid base32
* Validates that the supplied value is valid base32
*/
export function base32Validate (value?: string | null, ipfsCompat?: boolean): true {
export function base32Validate (value?: string | null, ipfsCompat?: boolean): value is string {
return validateChars(BASE_CONFIG, value, ipfsCompat);
}
+1 -1
View File
@@ -4,6 +4,6 @@
import { testValidator } from '../base32/is';
import { base58Validate } from './validate';
export function isBase58 (value?: string | null, ipfsCompat?: boolean): boolean {
export function isBase58 (value?: string | null, ipfsCompat?: boolean): value is string {
return testValidator(base58Validate, value, ipfsCompat);
}
+5 -5
View File
@@ -14,11 +14,11 @@ interface CheckConfig {
const BASE_CONFIG = { alphabet: BASE58_ALPHABET, ipfsChar: 'z', type: 'base58' };
export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?: string | null, ipfsCompat?: boolean): true {
assert(value, `Expected non-null, non-empty ${type} input`);
assert(!ipfsCompat || value[0] === ipfsChar, `Expected ${type} to start with '${ipfsChar}'`);
assert(value, () => `Expected non-null, non-empty ${type} input`);
assert(!ipfsCompat || value[0] === ipfsChar, () => `Expected ${type} to start with '${ipfsChar}'`);
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
assert(alphabet.includes(value[i]), `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
assert(alphabet.includes(value[i]), () => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
}
return true;
@@ -28,8 +28,8 @@ export function validateChars ({ alphabet, ipfsChar, type }: CheckConfig, value?
* @name base58Validate
* @summary Validates a base58 value.
* @description
* Validates the the supplied value is valid base58
* Validates that the supplied value is valid base58
*/
export function base58Validate (value?: string | null, ipfsCompat?: boolean): true {
export function base58Validate (value?: string | null, ipfsCompat?: boolean): value is string {
return validateChars(BASE_CONFIG, value, ipfsCompat);
}
+1 -1
View File
@@ -3,7 +3,7 @@
import { base64Validate } from './validate';
export function isBase64 (value?: string | null): boolean {
export function isBase64 (value?: string | null): value is string {
try {
return base64Validate(value);
} catch (error) {
+2 -2
View File
@@ -7,9 +7,9 @@ import { assert } from '@polkadot/util';
* @name base64Validate
* @summary Validates a base64 value.
* @description
* Validates the the supplied value is valid base64
* Validates that the supplied value is valid base64
*/
export function base64Validate (value?: string | null): true {
export function base64Validate (value?: string | null): value is string {
assert(value, 'Expected non-null, non-empty base64 input');
assert(/^(?:[A-Za-z0-9+/]{2}[A-Za-z0-9+/]{2})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value), 'Invalid base64 encoding');
@@ -7,6 +7,7 @@ import { hdLedger } from '..';
const MNE_0 = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
const MNE_1 = 'open jelly jeans corn ketchup supreme brief element armed lens vault weather original scissors rug priority vicious lesson raven spot gossip powder person volcano';
const MNE_P = `${MNE_1} testing`;
const TESTS = {
Kusama: {
@@ -36,6 +37,11 @@ const TESTS = {
ed25519: '0xe8c68348586d53e4e8d1a864b0e4e17c75e4eb06e0c63c1432bef2ba29e69d41',
index: [0, 0],
mnemonic: MNE_0
},
{
ed25519: '0x3890e8db837eba3f8f25215c753e1091062298ce671a51441e7ef89a7adc4f48',
index: [0, 0],
mnemonic: MNE_P
}
]
}
+14 -3
View File
@@ -11,7 +11,18 @@ import { HARDENED, hdValidatePath } from '../validatePath';
import { ledgerDerivePrivate } from './derivePrivate';
import { ledgerMaster } from './master';
export function hdLedger (mnemonic: string, path: string): Keypair {
export function hdLedger (_mnemonic: string, path: string): Keypair {
const parts = _mnemonic
.split(' ')
.map((s) => s.trim())
.filter((s) => s);
assert([12, 24, 25].includes(parts.length), 'Expected a mnemonic with 24 words (or 25 including a password)');
const [mnemonic, password] = parts.length === 25
? [parts.slice(0, 24).join(' '), parts[24]]
: [parts.join(' '), ''];
assert(mnemonicValidate(mnemonic), 'Invalid mnemonic passed to ledger derivation');
assert(hdValidatePath(path), 'Invalid derivation path');
@@ -19,9 +30,9 @@ export function hdLedger (mnemonic: string, path: string): Keypair {
path
.split('/')
.slice(1)
.map((n) => parseInt(n.replace("'", ''), 10))
.map((n) => parseInt(n.replace(/'$/, ''), 10))
.map((n) => (n < HARDENED) ? (n + HARDENED) : n)
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic))
.reduce((x, n) => ledgerDerivePrivate(x, n), ledgerMaster(mnemonic, password))
.slice(0, 32)
);
}
+2 -2
View File
@@ -9,8 +9,8 @@ import { mnemonicToSeedSync } from '../../mnemonic/bip39';
const ED25519_CRYPTO = 'ed25519 seed';
// gets an xprv from a mnemonic
export function ledgerMaster (mnemonic: string): Uint8Array {
const seed = mnemonicToSeedSync(mnemonic);
export function ledgerMaster (mnemonic: string, password?: string): Uint8Array {
const seed = mnemonicToSeedSync(mnemonic, password);
const chainCode = hmacSha256(ED25519_CRYPTO, new Uint8Array([1, ...seed]));
let priv;
+1 -1
View File
@@ -12,7 +12,7 @@ export function hdValidatePath (path: string): boolean {
return parts.every((n) => /^\d+'?$/.test(n)) && (
!parts
.map((n) => parseInt(n.replace("'", ''), 10))
.map((n) => parseInt(n.replace(/'$/, ''), 10))
.some((n) => isNaN(n) || (n >= HARDENED) || (n < 0))
);
}
+1 -1
View File
@@ -11,7 +11,7 @@ import { ENCODING, NONCE_LENGTH, SCRYPT_LENGTH } from './constants';
export function jsonDecryptData (encrypted?: Uint8Array | null, passphrase?: string | null, encType: EncryptedJsonEncoding[] = ENCODING): Uint8Array {
assert(encrypted, 'No encrypted data available to decode');
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encypted data');
assert(passphrase || !encType.includes('xsalsa20-poly1305'), 'Password required to decode encrypted data');
let encoded: Uint8Array | null = encrypted;
+1 -1
View File
@@ -28,7 +28,7 @@ export function keyExtractPath (derivePath: string): ExtractResult {
});
}
assert(constructed === derivePath, `Re-constructed path "${constructed}" does not match input`);
assert(constructed === derivePath, () => `Re-constructed path "${constructed}" does not match input`);
return {
parts,
@@ -26,7 +26,7 @@ import { mnemonicValidate } from './validate';
*/
export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs = false, byteLength: 32 | 64 = 32): Uint8Array {
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
assert([32, 64].includes(byteLength), `Invalid seed length ${byteLength}, expected 32 or 64`);
assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`);
if (byteLength && byteLength === 32) {
return isReady() && !onlyJs
+2 -2
View File
@@ -25,8 +25,8 @@ export function naclVerify (message: Uint8Array | string, signature: Uint8Array
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`);
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
return isReady() && !onlyJs
? ed25519Verify(signatureU8a, messageU8a, publicKeyU8a)
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/util-crypto', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/util-crypto', version: '6.6.1' };
@@ -12,8 +12,8 @@ export function schnorrkelVerify (message: Uint8Array | string, signature: Uint8
const publicKeyU8a = u8aToU8a(publicKey);
const signatureU8a = u8aToU8a(signature);
assert(publicKeyU8a.length === 32, `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
assert(signatureU8a.length === 64, `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
return sr25519Verify(signatureU8a, u8aToU8a(message), publicKeyU8a);
}
+2 -2
View File
@@ -54,7 +54,7 @@ function verifyDetect (result: VerifyResult, { message, publicKey, signature }:
}
function verifyMultisig (result: VerifyResult, { message, publicKey, signature }: VerifyInput): VerifyResult {
assert([0, 1, 2].includes(signature[0]), `Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
assert([0, 1, 2].includes(signature[0]), () => `Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
const type = CRYPTO_TYPES[signature[0]] || 'none';
@@ -77,7 +77,7 @@ function verifyMultisig (result: VerifyResult, { message, publicKey, signature }
export function signatureVerify (message: Uint8Array | string, signature: Uint8Array | string, addressOrPublicKey: Uint8Array | string): VerifyResult {
const signatureU8a = u8aToU8a(signature);
assert([64, 65, 66].includes(signatureU8a.length), `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
assert([64, 65, 66].includes(signatureU8a.length), () => `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
const publicKey = decodeAddress(addressOrPublicKey);
const input = { message, publicKey, signature: signatureU8a };
+7 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/util",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A collection of useful utilities for @polkadot",
"main": "index.js",
@@ -8,6 +8,9 @@
"./detectPackage.js",
"./detectPackage.cjs"
],
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -16,9 +19,9 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/util#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/x-textdecoder": "6.0.2",
"@polkadot/x-textencoder": "6.0.2",
"@babel/runtime": "^7.14.0",
"@polkadot/x-textdecoder": "6.6.1",
"@polkadot/x-textencoder": "6.6.1",
"@types/bn.js": "^4.11.6",
"bn.js": "^4.11.9",
"camelcase": "^5.3.1",
+2 -1
View File
@@ -22,6 +22,7 @@ import { isUndefined } from '../is/undefined';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function arrayFilter <T = any> (array: T[], allowNulls = true): T[] {
return array.filter((value) =>
!isUndefined(value) && (allowNulls || !isNull(value))
!isUndefined(value) &&
(allowNulls || !isNull(value))
);
}
+3 -1
View File
@@ -9,6 +9,8 @@ import { assert } from '../assert';
import { BN_MAX_INTEGER, BN_ONE, BN_ZERO } from '../bn';
import { bnToBn } from './toBn';
const SQRT_MAX_SAFE_INTEGER = new BN(94906265);
/**
* @name bnSqrt
* @summary Calculates the integer square root of a BN
@@ -35,7 +37,7 @@ export function bnSqrt <ExtToBn extends ToBn> (value: ExtToBn | BN | BigInt | st
// Use sqrt(MAX_SAFE_INTEGER) as starting point. since we already know the
// output will be larger than this, we expect this to be a safe start
let x0 = new BN(94906265);
let x0 = SQRT_MAX_SAFE_INTEGER.clone();
while (true) {
const x1 = n.div(x0).iadd(x0).ishrn(1);
+5 -9
View File
@@ -10,14 +10,6 @@ import { isBigInt } from '../is/bigInt';
import { isHex } from '../is/hex';
import { isToBn } from '../is/toBn';
function numberToBn <ExtToBn extends ToBn> (value: number | ExtToBn | BN): BN {
return BN.isBN(value)
? value
: isToBn(value)
? value.toBn()
: new BN(value);
}
/**
* @name bnToBn
* @summary Creates a BN value from a BN, BigInt, string (base 10 or hex) or number input.
@@ -43,5 +35,9 @@ export function bnToBn <ExtToBn extends ToBn> (value?: ExtToBn | BN | BigInt | s
return new BN(value.toString());
}
return numberToBn(value);
return BN.isBN(value)
? value
: isToBn(value)
? value.toBn()
: new BN(value);
}
+1 -1
View File
@@ -8,5 +8,5 @@ import { assert } from '../assert';
export function checkMaxMin (type: 'max' | 'min', items: BN[]): BN {
assert(items.length >= 1, 'Must provide one or more BN arguments');
return items.reduce((acc: BN, val: BN) => BN[type](acc, val), items[0]);
return items.reduce<BN>((a, v) => BN[type](a, v), items[0]);
}
+16 -5
View File
@@ -15,25 +15,28 @@ describe('compactFromU8a', (): void => {
it('decodes from same u16 encoded value', (): void => {
expect(
compactFromU8a(new Uint8Array([0b11111101, 0b00000111]), 32)
compactFromU8a(new Uint8Array([0b11111101, 0b00000111]))
).toEqual([2, new BN(511)]);
});
it('decodes from same u32 encoded value (short)', (): void => {
expect(
compactFromU8a(new Uint8Array([254, 255, 3, 0]), 32)
).toEqual([4, new BN(0xffff)]);
compactFromU8a(new Uint8Array([254, 255, 3, 0]))
).toEqual(
// since we use in-place, the words are different... HACK it
[4, new BN(0xffff).ishln(16).ishrn(16)]
);
});
it('decodes from same u32 encoded value (full)', (): void => {
expect(
compactFromU8a(new Uint8Array([3, 249, 255, 255, 255]), 32)
compactFromU8a(new Uint8Array([3, 249, 255, 255, 255]))
).toEqual([5, new BN(0xfffffff9)]);
});
it('decodes from same u32 as u64 encoded value (full, default)', (): void => {
expect(
compactFromU8a(new Uint8Array([3 + ((4 - 4) << 2), 249, 255, 255, 255]), 64)
compactFromU8a(new Uint8Array([3 + ((4 - 4) << 2), 249, 255, 255, 255]))
).toEqual([5, new BN(0xfffffff9)]);
});
@@ -44,4 +47,12 @@ describe('compactFromU8a', (): void => {
)
).toEqual([7, new BN('5af3107a4000', 16)]);
});
it('decodes an actual value', (): void => {
expect(
compactFromU8a(
hexToU8a('0x0284d717')
)[1].toString()
).toEqual('100000000');
});
});
+12 -14
View File
@@ -1,12 +1,10 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { BitLength } from './types';
import BN from 'bn.js';
import { BN_FOUR } from '../bn';
import { u8aToBn, u8aToU8a } from '../u8a';
import { DEFAULT_BITLENGTH } from './defaults';
/**
* @name compactFromU8a
@@ -17,29 +15,29 @@ import { DEFAULT_BITLENGTH } from './defaults';
* ```javascript
* import { compactFromU8a } from '@polkadot/util';
*
* const [offset, length] = compactFromU8a(new Uint8Array([254, 255, 3, 0]), 32));
* const [offset, length] = compactFromU8a(new Uint8Array([254, 255, 3, 0]));
*
* console.log('value offset=', offset, 'length=', length); // 4, 0xffff
* ```
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export function compactFromU8a (_input: Uint8Array | string, bitLength: BitLength = DEFAULT_BITLENGTH): [number, BN] {
export function compactFromU8a (_input: Buffer | Uint8Array | string | number[]): [number, BN] {
const input = u8aToU8a(_input);
const flag = input[0] & 0b11;
if (flag === 0b00) {
return [1, new BN(input[0]).shrn(2)];
return [1, new BN(input[0]).ishrn(2)];
} else if (flag === 0b01) {
return [2, u8aToBn(input.slice(0, 2), true).shrn(2)];
return [2, u8aToBn(input.slice(0, 2), true).ishrn(2)];
} else if (flag === 0b10) {
return [4, u8aToBn(input.slice(0, 4), true).shrn(2)];
return [4, u8aToBn(input.slice(0, 4), true).ishrn(2)];
}
const length = new BN(input[0])
.shrn(2) // clear flag
.addn(4) // add 4 for base length
.toNumber();
const offset = 1 + length;
const offset = 1 + (
new BN(input[0])
.ishrn(2) // clear flag
.iadd(BN_FOUR) // add 4 for base length
.toNumber()
);
return [offset, u8aToBn(input.subarray(1, offset), true)];
}
+2 -5
View File
@@ -1,9 +1,6 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { BitLength } from './types';
import { DEFAULT_BITLENGTH } from './defaults';
import { compactFromU8a } from './fromU8a';
/**
@@ -18,8 +15,8 @@ import { compactFromU8a } from './fromU8a';
* console.log(compactStripLength(new Uint8Array([2 << 2, 0xde, 0xad]))); // [2, Uint8Array[0xde, 0xad]]
* ```
*/
export function compactStripLength (input: Uint8Array, bitLength: BitLength = DEFAULT_BITLENGTH): [number, Uint8Array] {
const [offset, length] = compactFromU8a(input, bitLength);
export function compactStripLength (input: Uint8Array): [number, Uint8Array] {
const [offset, length] = compactFromU8a(input);
const total = offset + length.toNumber();
return [
+7
View File
@@ -72,6 +72,13 @@ describe('encode', (): void => {
);
});
it('does not modify the original', (): void => {
const original = new BN(123456);
expect(compactToU8a(original)).toEqual(new Uint8Array([2, 137, 7, 0]));
expect(original.toString()).toEqual('123456');
});
describe('from Rust', (): void => {
// Copied from https://github.com/paritytech/parity-codec/blob/master/src/codec.rs
const testCases = [
+6 -8
View File
@@ -4,7 +4,7 @@
import BN from 'bn.js';
import { assert } from '../assert';
import { bnToBn, bnToU8a } from '../bn';
import { BN_ONE, BN_TWO, bnToBn, bnToU8a } from '../bn';
import { u8aConcat } from '../u8a';
const MAX_U8 = new BN(2).pow(new BN(8 - 2)).subn(1);
@@ -29,9 +29,9 @@ export function compactToU8a (_value: BN | BigInt | number): Uint8Array {
if (value.lte(MAX_U8)) {
return new Uint8Array([value.toNumber() << 2]);
} else if (value.lte(MAX_U16)) {
return bnToU8a(value.shln(2).addn(0b01), 16, true);
return bnToU8a(value.shln(2).iadd(BN_ONE), 16, true);
} else if (value.lte(MAX_U32)) {
return bnToU8a(value.shln(2).addn(0b10), 32, true);
return bnToU8a(value.shln(2).iadd(BN_TWO), 32, true);
}
const u8a = bnToU8a(value);
@@ -42,13 +42,11 @@ export function compactToU8a (_value: BN | BigInt | number): Uint8Array {
length--;
}
assert(length >= 4, 'Previous tests match anyting less than 2^30; qed');
assert(length >= 4, 'Invalid length, previous checks match anything less than 2^30');
return u8aConcat(
new Uint8Array([
// substract 4 as minimum (also catered for in decoding)
((length - 4) << 2) + 0b11
]),
// subtract 4 as minimum (also catered for in decoding)
[((length - 4) << 2) + 0b11],
u8a.subarray(0, length)
);
}
+1 -5
View File
@@ -22,9 +22,5 @@ export function hexAddPrefix (value?: string | null): string {
return value;
}
const prefix = value && value.length % 2 === 1
? '0'
: '';
return `0x${prefix}${value || ''}`;
return `0x${value && value.length % 2 === 1 ? '0' : ''}${value || ''}`;
}
+2 -6
View File
@@ -22,13 +22,9 @@ const UNPREFIX_HEX_REGEX = /^[a-fA-F0-9]+$/;
export function hexStripPrefix (value?: string | null): string {
if (!value) {
return '';
}
if (hexHasPrefix(value)) {
} else if (hexHasPrefix(value)) {
return value.substr(2);
}
if (UNPREFIX_HEX_REGEX.test(value)) {
} else if (UNPREFIX_HEX_REGEX.test(value)) {
return value;
}
+1 -2
View File
@@ -16,7 +16,7 @@ function reverse (value: string): string {
/**
* @name hexToBn
* @summary Creates a BN.js bignumber object from a hex string.
* @summary Creates a BN.js object from a hex string.
* @description
* `null` inputs returns a `BN(0)` result. Hex input values return the actual value converted to a BN. Anything that is not a hex string (including the `0x` prefix) throws an error.
* @param _value The value to convert
@@ -43,7 +43,6 @@ export function hexToBn (value?: string | number | null, options: ToBnOptions |
// Backwards-compatibility
...(isBoolean(options) ? { isLe: options } : options)
};
const _value = hexStripPrefix(value as string);
// FIXME: Use BN's 3rd argument `isLe` once this issue is fixed
+1 -1
View File
@@ -25,7 +25,7 @@ export function hexToU8a (_value?: string | null, bitLength = -1): Uint8Array {
return new Uint8Array();
}
assert(isHex(_value), `Expected hex value to convert, found '${_value}'`);
assert(isHex(_value), () => `Expected hex value to convert, found '${_value}'`);
const value = hexStripPrefix(_value);
const valLength = value.length / 2;
+1
View File
@@ -22,5 +22,6 @@ export * from './memoize';
export * from './number';
export * from './promisify';
export * from './string';
export * from './stringify';
export * from './u8a';
export * from './versionDetect';
+4 -2
View File
@@ -1,6 +1,8 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { stringify } from '../stringify';
interface ObjectIndexed {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[index: string]: any;
@@ -32,13 +34,13 @@ interface ObjectIndexed {
*/
export function isJsonObject (value: unknown): value is ObjectIndexed {
const str = typeof value !== 'string'
? JSON.stringify(value)
? stringify(value)
: value;
try {
const obj = JSON.parse(str) as unknown;
return (typeof obj === 'object' && obj !== null);
return typeof obj === 'object' && obj !== null;
} catch (e) {
return false;
}
+29
View File
@@ -118,6 +118,8 @@ describe('logger', (): void => {
});
it('does debug log when DEBUG partial specified', (): void => {
process.env.DEBUG = 'test*';
l = logger('testing');
l.debug('test');
@@ -160,4 +162,31 @@ describe('logger', (): void => {
expect(spy.log).not.toHaveBeenCalled();
});
it('does not debug log when explicitly excluded', (): void => {
process.env.DEBUG = '*,-test';
l = logger('test');
l.debug('test');
expect(spy.log).not.toHaveBeenCalled();
});
it('does not debug log when part of exclusion group', (): void => {
process.env.DEBUG = '*,-test:*';
l = logger('test:sub');
l.debug('test');
expect(spy.log).not.toHaveBeenCalled();
});
it('does debug log when not part of exclusion groups', (): void => {
process.env.DEBUG = '*,-test:*,-tes,-a:*';
l = logger('test');
l.debug('test');
expect(spy.log).toHaveBeenCalled();
});
});
+21 -3
View File
@@ -77,11 +77,29 @@ function noop (): void {
}
function parseEnv (type: string): [boolean, number] {
const maxSize = parseInt(process?.env?.DEBUG_MAX || '-1', 10);
const env = (typeof process === 'object' ? process : {}).env || {};
const maxSize = parseInt(env.DEBUG_MAX || '-1', 10);
let isDebugOn = false;
(env.DEBUG || '')
.toLowerCase()
.split(',')
.forEach((e) => {
if (!!e && (e === '*' || type === e || (e.endsWith('*') && type.startsWith(e.slice(0, -1))))) {
isDebugOn = true;
}
if (!!e && e.startsWith('-') && (type === e.slice(1) || (e.endsWith('*') && type.startsWith(e.slice(1, -1))))) {
isDebugOn = false;
}
});
return [
(process?.env?.DEBUG || '').toLowerCase().split(',').some((e) => !!e && (e === '*' || type.startsWith(e))),
isNaN(maxSize) ? -1 : maxSize
isDebugOn,
isNaN(maxSize)
? -1
: maxSize
];
}
+3 -11
View File
@@ -3,8 +3,8 @@
import type { Memoized } from './types';
import { isBigInt } from './is/bigInt';
import { isUndefined } from './is/undefined';
import { stringify } from './stringify';
interface Options {
getInstanceId?: () => string;
@@ -14,20 +14,12 @@ function defaultGetId (): string {
return 'none';
}
function normalize (args: unknown[]): string {
return JSON.stringify(args, (_, value: unknown) =>
isBigInt(value)
? value.toString()
: value
);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function memoize <T, F extends (...args: any[]) => T> (fn: F, { getInstanceId = defaultGetId }: Options = {}): Memoized<F> {
const cache: Record<string, Record<string, T>> = {};
const memoized = (...args: unknown[]): T => {
const stringParams = normalize(args);
const stringParams = stringify(args);
const instanceId = getInstanceId();
if (!cache[instanceId]) {
@@ -42,7 +34,7 @@ export function memoize <T, F extends (...args: any[]) => T> (fn: F, { getInstan
};
memoized.unmemoize = (...args: unknown[]): void => {
const stringParams = normalize(args);
const stringParams = stringify(args);
const instanceId = getInstanceId();
if (cache[instanceId] && !isUndefined(cache[instanceId][stringParams])) {
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/util', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/util', version: '6.6.1' };
+32
View File
@@ -0,0 +1,32 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import BN from 'bn.js';
import { stringify } from './stringify';
describe('stringify', (): void => {
it('stringifies a BigInt', (): void => {
expect(
stringify(1234n)
).toEqual('"1234"');
});
it('stringifies an array of values', (): void => {
expect(
stringify(['a', 1, 2n, new BN(3)])
).toEqual('["a",1,"2","3"]');
});
it('stringifies an array of values (with spaces)', (): void => {
expect(
stringify(['a', 1, 2n, new BN(3)], 2)
).toEqual('[\n "a",\n 1,\n "2",\n "3"\n]');
});
it('stringifies a nested object', (): void => {
expect(
stringify({ a: 'a', b: 1, c: { d: 2n, e: new BN(3) } })
).toEqual('{"a":"a","b":1,"c":{"d":"2","e":"3"}}');
});
});
+15
View File
@@ -0,0 +1,15 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { isBigInt } from './is/bigInt';
export function stringify (args: unknown, space?: string | number): string {
return JSON.stringify(
args,
(_, value: unknown) =>
isBigInt(value)
? value.toString()
: value,
space
);
}
+1 -2
View File
@@ -23,11 +23,10 @@ import { u8aToU8a } from './toU8a';
export function u8aConcat (...list: (Buffer | Uint8Array | number[] | string)[]): Uint8Array {
let length = 0;
let offset = 0;
const u8as = new Array(list.length) as Uint8Array[];
const u8as = new Array<Uint8Array>(list.length);
for (let i = 0; i < list.length; i++) {
u8as[i] = u8aToU8a(list[i]);
length += u8as[i].length;
}
+1 -3
View File
@@ -16,7 +16,5 @@
* ```
*/
export function u8aToBuffer (value?: Uint8Array | null): Buffer {
return !value
? Buffer.from([])
: Buffer.from(value);
return Buffer.from(value || []);
}
+5 -4
View File
@@ -5,7 +5,7 @@ const ALPHABET = new Array(256).fill(0).map((_, n) => n.toString(16).padStart(2,
/** @internal */
function extract (value: Uint8Array): string {
const result = new Array(value.length) as string[];
const result = new Array<string>(value.length);
for (let i = 0; i < value.length; i++) {
result[i] = ALPHABET[value[i]];
@@ -44,8 +44,9 @@ export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed
const byteLength = Math.ceil(bitLength / 8);
return prefix + ((byteLength > 0 && value.length > byteLength)
? trim(value, Math.ceil(byteLength / 2))
: extract(value)
return prefix + (
(byteLength > 0 && value.length > byteLength)
? trim(value, Math.ceil(byteLength / 2))
: extract(value)
);
}
+15
View File
@@ -40,6 +40,14 @@ describe('u8aToU8a', (): void => {
);
});
it('creates from a Buffer', (): void => {
expect(
u8aToU8a(Buffer.from([1, 2, 3, 128, 0, 10, 11, 12]))
).toEqual(
new Uint8Array([1, 2, 3, 128, 0, 10, 11, 12])
);
});
it('returns a Uint8Array as-is (u8a input)', (): void => {
expect(
u8aToU8a(new Uint8Array([128, 0, 10]))
@@ -47,4 +55,11 @@ describe('u8aToU8a', (): void => {
new Uint8Array([128, 0, 10])
);
});
it('fails to create from unknown typed values', (): void => {
expect(
// this is where completely invalid data is being passed
() => u8aToU8a(123 as unknown as Uint8Array)
).toThrow('Unable to convert 123 (typeof number) to a Uint8Array');
});
});
+11 -18
View File
@@ -1,25 +1,14 @@
// Copyright 2017-2021 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { bufferToU8a } from '../buffer/toU8a';
import { assert } from '../assert';
import { hexToU8a } from '../hex/toU8a';
import { isBuffer } from '../is/buffer';
import { isHex } from '../is/hex';
import { isString } from '../is/string';
import { isU8a } from '../is/u8a';
import { stringToU8a } from '../string/toU8a';
function convertArray (value: number[] | Uint8Array): Uint8Array {
return Array.isArray(value)
? Uint8Array.from(value)
: value;
}
function convertString (value: string): Uint8Array {
return isHex(value)
? hexToU8a(value)
: stringToU8a(value);
}
/**
* @name u8aToU8a
* @summary Creates a Uint8Array value from a Uint8Array, Buffer, string or hex input.
@@ -29,7 +18,7 @@ function convertString (value: string): Uint8Array {
* <BR>
*
* ```javascript
* import { { u8aToU8a } from '@polkadot/util';
* import { u8aToU8a } from '@polkadot/util';
*
* u8aToU8a(new Uint8Array([0x12, 0x34]); // => Uint8Array([0x12, 0x34])
* u8aToU8a(0x1234); // => Uint8Array([0x12, 0x34])
@@ -38,11 +27,15 @@ function convertString (value: string): Uint8Array {
export function u8aToU8a (value?: number[] | Buffer | Uint8Array | string | null): Uint8Array {
if (!value) {
return new Uint8Array();
} else if (isBuffer(value)) {
return bufferToU8a(value);
} else if (isString(value)) {
return convertString(value);
return isHex(value)
? hexToU8a(value)
: stringToU8a(value);
} else if (Array.isArray(value) || isBuffer(value)) {
return new Uint8Array(value);
}
return convertArray(value);
assert(isU8a(value), () => `Unable to convert ${value.toString()} (typeof ${typeof value}) to a Uint8Array`);
return value;
}
+2 -2
View File
@@ -11,7 +11,7 @@ describe('detectPackage', (): void => {
const PATH = '/Users/jaco/Projects/polkadot-js/api/node_modules/@polkadot/util';
const MISMATCH = `@polkadot/util has multiple versions, ensure that there is only one installed.
Either remove and explicitly install matching versions or deupe using your package manager.
Either remove and explicitly install matching versions or dedupe using your package manager.
The following conflicting packages were found:
\t${VER1}\t${PATH}/01
\t${VER2} \t${PATH}/02`;
@@ -61,7 +61,7 @@ describe('detectPackageDeps', (): void => {
detectPackage({ name: '@polkadot/two', version: '1.1.1' }, false, [DEP0, DEP1, DEP2, DEP3]);
expect(spy).toHaveBeenCalledWith(`@polkadot/two requires direct dependencies exactly matching version 1.1.1.
Either remove and explicitly install matching versions or deupe using your package manager.
Either remove and explicitly install matching versions or dedupe using your package manager.
The following conflicting packages were found:
\t1.1.2\t@polkadot/util
\t1.1.3\t@polkadot/util-crypto`);
+2 -2
View File
@@ -26,7 +26,7 @@ interface PjsChecks extends This {
type PjsWindow = (Window & This) & PjsChecks;
type FnString = () => string | undefined;
const DEDUPE = 'Either remove and explicitly install matching versions or deupe using your package manager.\nThe following conflicting packages were found:';
const DEDUPE = 'Either remove and explicitly install matching versions or dedupe using your package manager.\nThe following conflicting packages were found:';
/** @internal */
function getEntry (name: string): VersionPath[] {
@@ -88,7 +88,7 @@ function getPath (pathOrFn?: FnString | string | false): string {
* @summary Checks that a specific package is only imported once
*/
export function detectPackage ({ name, version }: PackageJson, pathOrFn?: FnString | string | false, deps: PackageJson[] = []): void {
assert(name.startsWith('@polkadot'), `Invalid package descriptor ${name}`);
assert(name.startsWith('@polkadot'), () => `Invalid package descriptor ${name}`);
const entry = getEntry(name);
+7 -4
View File
@@ -1,12 +1,15 @@
{
"name": "@polkadot/x-fetch",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A cross-environment fetch replacement",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -15,9 +18,9 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-fetch#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/x-global": "6.0.2",
"@types/node-fetch": "^2.5.8",
"@babel/runtime": "^7.14.0",
"@polkadot/x-global": "6.6.1",
"@types/node-fetch": "^2.5.10",
"node-fetch": "^2.6.1"
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/x-fetch', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/x-fetch', version: '6.6.1' };
+6 -3
View File
@@ -1,10 +1,13 @@
{
"name": "@polkadot/x-global",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A cross-environment global replacement",
"main": "index.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -13,8 +16,8 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-global#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@types/node-fetch": "^2.5.8",
"@babel/runtime": "^7.14.0",
"@types/node-fetch": "^2.5.10",
"node-fetch": "^2.6.1"
}
}
+9 -7
View File
@@ -4,11 +4,13 @@
export { packageInfo } from './packageInfo';
export const xglobal = (
typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: this as unknown as (Window & typeof globalThis)
typeof globalThis !== 'undefined'
? globalThis
: typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: this as unknown as (Window & typeof globalThis)
);
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/x-global', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/x-global', version: '6.6.1' };
+7 -4
View File
@@ -1,12 +1,15 @@
{
"name": "@polkadot/x-randomvalues",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A cross-environment window.crypto.getRandomValues replacement",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"sideEffects": false,
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
"contributors": [],
@@ -15,10 +18,10 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-randomvalues#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"@polkadot/x-global": "6.0.2"
"@babel/runtime": "^7.14.0",
"@polkadot/x-global": "6.6.1"
},
"devDependencies": {
"@types/react-native": "^0.63.50"
"@types/react-native": "^0.64.7"
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/x-randomvalues', version: '6.0.2' };
export const packageInfo = { name: '@polkadot/x-randomvalues', version: '6.6.1' };
+5 -10
View File
@@ -1,17 +1,12 @@
{
"name": "@polkadot/x-rxjs",
"version": "6.0.2",
"version": "6.6.1",
"type": "module",
"description": "A pass-through interface for RxJs (allowing node + mjs usage)",
"main": "index.js",
"sideEffects": false,
"exports": {
".": {
"node": "./index.js"
},
"./operators": {
"node": "./operators.js"
}
"engines": {
"node": ">=14.0.0"
},
"author": "Jaco Greeff <jacogr@gmail.com>",
"maintainers": [],
@@ -21,7 +16,7 @@
"bugs": "https://github.com/polkadot-js/common/issues",
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/x-rxjs#readme",
"dependencies": {
"@babel/runtime": "^7.13.9",
"rxjs": "^6.6.6"
"@babel/runtime": "^7.14.0",
"rxjs": "^6.6.7"
}
}
@@ -2,9 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
// This is not great, but while having esm files, rxjs doesn't quite play nicely with
// Node.js mjs files. (Hopefully this improves in 7.0, although no exports map as of yet)
//
// Generated via s/export \{ (.*) \} from .*/exports.$1 = rxjs.$1;/ on rxjs/_esm
// Node.js esm files. (Hopefully this improves in 7.0, although no exports map as of yet)
const rxjs = require('rxjs');
@@ -2,9 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
// This is not great, but while having esm files, rxjs doesn't quite play nicely with
// Node.js mjs files. (Hopefully this improves in 7.0, although no exports map as of yet)
//
// Generated via s/export \{ (.*) \} from .*/exports.$1 = rxjs.$1;/ on rxjs/_esm
// Node.js esm files. (Hopefully this improves in 7.0, although no exports map as of yet)
const operators = require('rxjs/operators');

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