From 9fc57a23e898a52afda1ea21c077481bcafa5a49 Mon Sep 17 00:00:00 2001 From: Jaco Date: Wed, 8 Sep 2021 15:38:53 +0300 Subject: [PATCH] Adjust isHex with template return (#1103) * Adjust isHex with template return * Unneeded assignment * CHANGELOG * typo * Additional HexString types * Additional HexString inputs * Use U8aLike as applicable * typo * Unneeded type * HexString outputs * Export types --- CHANGELOG.md | 10 ++++- packages/keyring/src/keyring.ts | 10 ++--- packages/keyring/src/pair/decode.ts | 2 +- packages/keyring/src/pair/index.ts | 22 +++++----- packages/keyring/src/pairs.ts | 5 ++- packages/keyring/src/types.ts | 19 ++++----- .../util-crypto/src/address/addressToEvm.ts | 4 +- packages/util-crypto/src/address/check.ts | 3 +- packages/util-crypto/src/address/decode.ts | 5 ++- packages/util-crypto/src/address/derive.ts | 3 +- packages/util-crypto/src/address/encode.ts | 3 +- .../util-crypto/src/address/encodeDerived.ts | 3 +- .../util-crypto/src/address/encodeMulti.ts | 3 +- packages/util-crypto/src/address/eq.ts | 4 +- .../util-crypto/src/address/evmToAddress.ts | 3 +- packages/util-crypto/src/address/is.ts | 3 +- .../util-crypto/src/address/keyDerived.ts | 3 +- packages/util-crypto/src/address/keyMulti.ts | 3 +- packages/util-crypto/src/address/sort.ts | 3 +- packages/util-crypto/src/address/validate.ts | 3 +- packages/util-crypto/src/base32/encode.ts | 4 +- packages/util-crypto/src/base58/encode.ts | 4 +- packages/util-crypto/src/base64/encode.ts | 4 +- packages/util-crypto/src/blake2/asHex.ts | 4 +- packages/util-crypto/src/blake2/asU8a.ts | 4 +- packages/util-crypto/src/ethereum/encode.ts | 4 +- .../util-crypto/src/ethereum/isAddress.ts | 4 +- packages/util-crypto/src/json/types.ts | 4 +- packages/util-crypto/src/keccak/asHex.ts | 4 +- packages/util-crypto/src/keccak/asU8a.ts | 4 +- .../util-crypto/src/key/DeriveJunction.ts | 6 ++- packages/util-crypto/src/mnemonic/bip39.ts | 4 +- packages/util-crypto/src/nacl/sign.ts | 3 +- packages/util-crypto/src/nacl/verify.ts | 4 +- packages/util-crypto/src/pbkdf2/encode.ts | 4 +- packages/util-crypto/src/random/asHex.ts | 4 +- .../util-crypto/src/schnorrkel/agreement.ts | 4 +- .../util-crypto/src/schnorrkel/deriveHard.ts | 3 +- .../src/schnorrkel/derivePublic.ts | 4 +- .../util-crypto/src/schnorrkel/deriveSoft.ts | 3 +- .../src/schnorrkel/keypair/fromSeed.ts | 3 +- .../src/schnorrkel/keypair/fromU8a.ts | 3 +- packages/util-crypto/src/schnorrkel/sign.ts | 3 +- packages/util-crypto/src/schnorrkel/verify.ts | 4 +- .../util-crypto/src/schnorrkel/vrfSign.ts | 3 +- .../util-crypto/src/schnorrkel/vrfVerify.ts | 4 +- packages/util-crypto/src/scrypt/encode.ts | 3 +- packages/util-crypto/src/secp256k1/verify.ts | 3 +- packages/util-crypto/src/signature/verify.ts | 3 +- packages/util-crypto/src/types.ts | 3 ++ packages/util-crypto/src/xxhash/asHex.ts | 4 +- packages/util-crypto/src/xxhash/asU8a.ts | 4 +- packages/util/src/bn/toBn.ts | 4 +- packages/util/src/bn/toHex.ts | 8 ++-- packages/util/src/compact/fromU8a.ts | 4 +- packages/util/src/hex/addPrefix.ts | 4 +- packages/util/src/hex/fixLength.ts | 4 +- packages/util/src/hex/hasPrefix.ts | 4 +- packages/util/src/hex/toU8a.ts | 4 +- packages/util/src/is/ascii.ts | 4 +- packages/util/src/is/hex.ts | 4 +- packages/util/src/is/utf8.ts | 4 +- packages/util/src/number/toHex.ts | 4 +- packages/util/src/string/toHex.ts | 4 +- packages/util/src/types.ts | 7 ++++ packages/util/src/u8a/cmp.ts | 4 +- packages/util/src/u8a/concat.ts | 4 +- packages/util/src/u8a/eq.ts | 4 +- packages/util/src/u8a/fixLength.ts | 6 +-- packages/util/src/u8a/toHex.ts | 41 ++++++++++--------- packages/util/src/u8a/toU8a.ts | 4 +- 71 files changed, 233 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be1187ede..ccc1d06bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # CHANGELOG +## master + +Changes: + +- Adjust `isHex` return to `0x${string}` under TypeScript +- Adjust shared repo Jest config + + ## 7.3.1 Aug 28, 2021 Contributed: @@ -10,7 +18,7 @@ Contributed: Changes: -- Add support for `schnorrkelAgreement` (as exposed by new `wasm-crypto) +- Add support for `schnorrkelAgreement` (as exposed by new `wasm-crypto`) - Ensure `schnorrkel*` functions allows hex inputs - `@polkadot/wasm-crypto` 4.2.1 - Sync with upstream Substrate ss58 registry diff --git a/packages/keyring/src/keyring.ts b/packages/keyring/src/keyring.ts index e0155271a..abb35dedd 100644 --- a/packages/keyring/src/keyring.ts +++ b/packages/keyring/src/keyring.ts @@ -1,8 +1,7 @@ // Copyright 2017-2021 @polkadot/keyring authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/json/types'; -import type { Keypair, KeypairType } from '@polkadot/util-crypto/types'; +import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types'; import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types'; import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util'; @@ -206,17 +205,16 @@ export class Keyring implements KeyringInstance { if (isPhraseHex) { seed = hexToU8a(phrase); } else { - const str = phrase as string; - const parts = str.split(' '); + const parts = phrase.split(' '); if ([12, 15, 18, 21, 24].includes(parts.length)) { seed = type === 'ethereum' ? mnemonicToLegacySeed(phrase, '', false, 64) : mnemonicToMiniSecret(phrase, password); } else { - assert(str.length <= 32, 'specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes'); + assert(phrase.length <= 32, 'specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes'); - seed = stringToU8a(str.padEnd(32)); + seed = stringToU8a(phrase.padEnd(32)); } } diff --git a/packages/keyring/src/pair/decode.ts b/packages/keyring/src/pair/decode.ts index 184c3cb99..a9185e99f 100644 --- a/packages/keyring/src/pair/decode.ts +++ b/packages/keyring/src/pair/decode.ts @@ -1,7 +1,7 @@ // Copyright 2017-2021 @polkadot/keyring authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/json/types'; +import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types'; import type { PairInfo } from './types'; import { assert, isUndefined, u8aEq } from '@polkadot/util'; diff --git a/packages/keyring/src/pair/index.ts b/packages/keyring/src/pair/index.ts index f8a7ef5fd..e0ffaff8d 100644 --- a/packages/keyring/src/pair/index.ts +++ b/packages/keyring/src/pair/index.ts @@ -1,8 +1,8 @@ // Copyright 2017-2021 @polkadot/keyring authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/json/types'; -import type { Keypair, KeypairType } from '@polkadot/util-crypto/types'; +import type { HexString } from '@polkadot/util/types'; +import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types'; import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types'; import type { PairInfo } from './types'; @@ -145,13 +145,15 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P }, // eslint-disable-next-line sort-keys decodePkcs8, - decryptMessage: (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null => { + decryptMessage: (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null => { assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair'); assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet'); + const messageU8a = u8aToU8a(encryptedMessageWithNonce); + return naclOpen( - u8aToU8a(encryptedMessageWithNonce.slice(24, encryptedMessageWithNonce.length)), - u8aToU8a(encryptedMessageWithNonce.slice(0, 24)), + messageU8a.slice(24, messageU8a.length), + messageU8a.slice(0, 24), convertPublicKeyToCurve25519(u8aToU8a(senderPublicKey)), convertSecretKeyToCurve25519(secretKey) ); @@ -168,7 +170,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P encodePkcs8: (passphrase?: string): Uint8Array => { return recode(passphrase); }, - encryptMessage: (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => { + encryptMessage: (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => { assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair'); assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet'); @@ -182,7 +184,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P setMeta: (additional: KeyringPair$Meta): void => { meta = { ...meta, ...additional }; }, - sign: (message: string | Uint8Array, options: SignOptions = {}): Uint8Array => { + sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => { assert(!isLocked(secretKey), 'Cannot sign with a locked key pair'); return u8aConcat( @@ -207,10 +209,10 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P unlock: (passphrase?: string): void => { return decodePkcs8(passphrase); }, - verify: (message: string | Uint8Array, signature: Uint8Array, signerPublic: string | Uint8Array): boolean => { + verify: (message: HexString | string | Uint8Array, signature: HexString | string | Uint8Array, signerPublic: HexString | string | Uint8Array): boolean => { return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid; }, - vrfSign: (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array => { + vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => { assert(!isLocked(secretKey), 'Cannot sign with a locked key pair'); if (type === 'sr25519') { @@ -221,7 +223,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P return u8aConcat(vrfHash(proof, context, extra), proof); }, - vrfVerify: (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: Uint8Array | string, context?: string | Uint8Array, extra?: string | Uint8Array): boolean => { + vrfVerify: (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean => { if (type === 'sr25519') { return schnorrkelVrfVerify(message, vrfResult, publicKey, context, extra); } diff --git a/packages/keyring/src/pairs.ts b/packages/keyring/src/pairs.ts index 0e585aaa5..06afd0d37 100644 --- a/packages/keyring/src/pairs.ts +++ b/packages/keyring/src/pairs.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/keyring authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { KeyringPair, KeyringPairs } from './types'; import { assert, isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util'; @@ -21,7 +22,7 @@ export class Pairs implements KeyringPairs { return Object.values(this.#map); } - public get (address: string | Uint8Array): KeyringPair { + public get (address: HexString | string | Uint8Array): KeyringPair { const pair = this.#map[decodeAddress(address).toString()]; assert(pair, () => `Unable to retrieve keypair '${ @@ -33,7 +34,7 @@ export class Pairs implements KeyringPairs { return pair; } - public remove (address: string | Uint8Array): void { + public remove (address: HexString | string | Uint8Array): void { delete this.#map[decodeAddress(address).toString()]; } } diff --git a/packages/keyring/src/types.ts b/packages/keyring/src/types.ts index e9a4df608..a410f06d6 100644 --- a/packages/keyring/src/types.ts +++ b/packages/keyring/src/types.ts @@ -1,9 +1,8 @@ // Copyright 2017-2021 @polkadot/keyring authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { Prefix } from '@polkadot/util-crypto/address/types'; -import type { EncryptedJson } from '@polkadot/util-crypto/json/types'; -import type { Keypair, KeypairType } from '@polkadot/util-crypto/types'; +import type { HexString } from '@polkadot/util/types'; +import type { EncryptedJson, Keypair, KeypairType, Prefix } from '@polkadot/util-crypto/types'; export interface KeyringOptions { ss58Format?: Prefix; @@ -13,7 +12,7 @@ export interface KeyringOptions { export type KeyringPair$Meta = Record; export interface KeyringPair$Json extends EncryptedJson { - address: string; + address: string | HexString; meta: KeyringPair$Meta; } @@ -34,14 +33,14 @@ export interface KeyringPair { encodePkcs8 (passphrase?: string): Uint8Array; lock (): void; setMeta (meta: KeyringPair$Meta): void; - sign (message: string | Uint8Array, options?: SignOptions): Uint8Array; + sign (message: HexString | string | Uint8Array, options?: SignOptions): Uint8Array; toJson (passphrase?: string): KeyringPair$Json; unlock (passphrase?: string): void; - encryptMessage (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, nonce?: Uint8Array): Uint8Array; - decryptMessage (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null; - verify (message: string | Uint8Array, signature: Uint8Array, signerPublic: string | Uint8Array): boolean; - vrfSign (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array; - vrfVerify (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: Uint8Array | string, context?: string | Uint8Array, extra?: string | Uint8Array): boolean; + encryptMessage (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonce?: Uint8Array): Uint8Array; + decryptMessage (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null; + verify (message: HexString | string | Uint8Array, signature: Uint8Array, signerPublic: HexString | string | Uint8Array): boolean; + vrfSign (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): Uint8Array; + vrfVerify (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean; } export interface KeyringPairs { diff --git a/packages/util-crypto/src/address/addressToEvm.ts b/packages/util-crypto/src/address/addressToEvm.ts index 108256637..7ce06fa28 100644 --- a/packages/util-crypto/src/address/addressToEvm.ts +++ b/packages/util-crypto/src/address/addressToEvm.ts @@ -1,13 +1,15 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { decodeAddress } from './decode'; /** * @name addressToEvm * @summary Converts an SS58 address to its corresponding EVM address. */ -export function addressToEvm (address: string | Uint8Array, ignoreChecksum?: boolean): Uint8Array { +export function addressToEvm (address: HexString | string | Uint8Array, ignoreChecksum?: boolean): Uint8Array { const decoded = decodeAddress(address, ignoreChecksum); return decoded.subarray(0, 20); diff --git a/packages/util-crypto/src/address/check.ts b/packages/util-crypto/src/address/check.ts index 556649b34..f30327ade 100644 --- a/packages/util-crypto/src/address/check.ts +++ b/packages/util-crypto/src/address/check.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { base58Decode } from '../base58/decode'; @@ -13,7 +14,7 @@ import { defaults } from './defaults'; * @description * From the provided input, validate that the address is a valid input. */ -export function checkAddress (address: string, prefix: Prefix): [boolean, string | null] { +export function checkAddress (address: HexString | string, prefix: Prefix): [boolean, string | null] { let decoded; try { diff --git a/packages/util-crypto/src/address/decode.ts b/packages/util-crypto/src/address/decode.ts index fd2865dfe..281afb812 100644 --- a/packages/util-crypto/src/address/decode.ts +++ b/packages/util-crypto/src/address/decode.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; // Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L6 @@ -10,7 +11,7 @@ import { base58Decode } from '../base58/decode'; import { checkAddressChecksum } from './checksum'; import { defaults } from './defaults'; -export function decodeAddress (encoded?: string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array { +export function decodeAddress (encoded?: HexString | string | Uint8Array | null, ignoreChecksum?: boolean, ss58Format: Prefix = -1): Uint8Array { assert(encoded, 'Invalid empty address passed'); if (isU8a(encoded) || isHex(encoded)) { @@ -29,6 +30,6 @@ export function decodeAddress (encoded?: string | Uint8Array | null, ignoreCheck return decoded.slice(ss58Length, endPos); } catch (error) { - throw new Error(`Decoding ${encoded as string}: ${(error as Error).message}`); + throw new Error(`Decoding ${encoded}: ${(error as Error).message}`); } } diff --git a/packages/util-crypto/src/address/derive.ts b/packages/util-crypto/src/address/derive.ts index 8cdc57256..ee4fe27ee 100644 --- a/packages/util-crypto/src/address/derive.ts +++ b/packages/util-crypto/src/address/derive.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { assert } from '@polkadot/util'; @@ -17,7 +18,7 @@ import { encodeAddress } from './encode'; * @description * Creates a sr25519 derived address based on the input address/publicKey and the uri supplied. */ -export function deriveAddress (who: Uint8Array | string, suri: string, ss58Format?: Prefix): string { +export function deriveAddress (who: HexString | Uint8Array | string, suri: string, ss58Format?: Prefix): string { const { path } = keyExtractPath(suri); assert(path.length && !path.some((path) => path.isHard), 'Expected suri to contain a combination of non-hard paths'); diff --git a/packages/util-crypto/src/address/encode.ts b/packages/util-crypto/src/address/encode.ts index c35b5bf5b..1de4bd056 100644 --- a/packages/util-crypto/src/address/encode.ts +++ b/packages/util-crypto/src/address/encode.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; // Original implementation: https://github.com/paritytech/polka-ui/blob/4858c094684769080f5811f32b081dd7780b0880/src/polkadot.js#L34 @@ -11,7 +12,7 @@ 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: HexString | Uint8Array | string, ss58Format: Prefix = defaults.prefix): string { // decode it, this means we can re-encode an address const u8a = decodeAddress(key); diff --git a/packages/util-crypto/src/address/encodeDerived.ts b/packages/util-crypto/src/address/encodeDerived.ts index 33a00cf5f..253761302 100644 --- a/packages/util-crypto/src/address/encodeDerived.ts +++ b/packages/util-crypto/src/address/encodeDerived.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { BN } from '@polkadot/util'; +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { decodeAddress } from './decode'; @@ -14,6 +15,6 @@ import { createKeyDerived } from './keyDerived'; * @description * Creates a Substrate derived address based on the input address/publicKey and the index supplied. */ -export function encodeDerivedAddress (who: Uint8Array | string, index: bigint | BN | number, ss58Format?: Prefix): string { +export function encodeDerivedAddress (who: HexString | Uint8Array | string, index: bigint | BN | number, ss58Format?: Prefix): string { return encodeAddress(createKeyDerived(decodeAddress(who), index), ss58Format); } diff --git a/packages/util-crypto/src/address/encodeMulti.ts b/packages/util-crypto/src/address/encodeMulti.ts index 5d3998fd0..6a78c717d 100644 --- a/packages/util-crypto/src/address/encodeMulti.ts +++ b/packages/util-crypto/src/address/encodeMulti.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { BN } from '@polkadot/util'; +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { encodeAddress } from './encode'; @@ -13,6 +14,6 @@ import { createKeyMulti } from './keyMulti'; * @description * Creates a Substrate multisig address based on the input address and the required threshold. */ -export function encodeMultiAddress (who: (Uint8Array | string)[], threshold: bigint | BN | number, ss58Format?: Prefix): string { +export function encodeMultiAddress (who: (HexString | Uint8Array | string)[], threshold: bigint | BN | number, ss58Format?: Prefix): string { return encodeAddress(createKeyMulti(who, threshold), ss58Format); } diff --git a/packages/util-crypto/src/address/eq.ts b/packages/util-crypto/src/address/eq.ts index b3f619572..4862209a0 100644 --- a/packages/util-crypto/src/address/eq.ts +++ b/packages/util-crypto/src/address/eq.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aEq } from '@polkadot/util'; import { decodeAddress } from './decode'; @@ -19,6 +21,6 @@ import { decodeAddress } from './decode'; * u8aEq(new Uint8Array([0x68, 0x65]), new Uint8Array([0x68, 0x65])); // true * ``` */ -export function addressEq (a: string | Uint8Array, b: string | Uint8Array): boolean { +export function addressEq (a: HexString | string | Uint8Array, b: HexString | string | Uint8Array): boolean { return u8aEq(decodeAddress(a), decodeAddress(b)); } diff --git a/packages/util-crypto/src/address/evmToAddress.ts b/packages/util-crypto/src/address/evmToAddress.ts index 44ec41213..1fd25f112 100644 --- a/packages/util-crypto/src/address/evmToAddress.ts +++ b/packages/util-crypto/src/address/evmToAddress.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { HashType } from '../secp256k1/types'; import type { Prefix } from './types'; @@ -13,7 +14,7 @@ import { encodeAddress } from './encode'; * @name evmToAddress * @summary Converts an EVM address to its corresponding SS58 address. */ -export function evmToAddress (evmAddress: string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string { +export function evmToAddress (evmAddress: HexString | string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string { const wrapError = (message: string) => `Converting ${evmAddress as string}: ${message}`; const message = u8aConcat('evm:', evmAddress); diff --git a/packages/util-crypto/src/address/is.ts b/packages/util-crypto/src/address/is.ts index a1f38faa5..2cd08b4f0 100644 --- a/packages/util-crypto/src/address/is.ts +++ b/packages/util-crypto/src/address/is.ts @@ -1,11 +1,12 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { validateAddress } from './validate'; -export function isAddress (address?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): address is string { +export function isAddress (address?: HexString | string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): address is string { try { return validateAddress(address, ignoreChecksum, ss58Format); } catch (error) { diff --git a/packages/util-crypto/src/address/keyDerived.ts b/packages/util-crypto/src/address/keyDerived.ts index dc219e931..c3267a583 100644 --- a/packages/util-crypto/src/address/keyDerived.ts +++ b/packages/util-crypto/src/address/keyDerived.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { BN } from '@polkadot/util'; +import type { HexString } from '@polkadot/util/types'; import { bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util'; @@ -10,7 +11,7 @@ import { decodeAddress } from './decode'; const PREFIX = stringToU8a('modlpy/utilisuba'); -export function createKeyDerived (who: Uint8Array | string, index: bigint | BN | number): Uint8Array { +export function createKeyDerived (who: HexString | Uint8Array | string, index: bigint | BN | number): Uint8Array { return blake2AsU8a( u8aConcat( PREFIX, diff --git a/packages/util-crypto/src/address/keyMulti.ts b/packages/util-crypto/src/address/keyMulti.ts index 860dd172f..8741375ee 100644 --- a/packages/util-crypto/src/address/keyMulti.ts +++ b/packages/util-crypto/src/address/keyMulti.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { BN } from '@polkadot/util'; +import type { HexString } from '@polkadot/util/types'; import { bnToU8a, compactToU8a, stringToU8a, u8aConcat, u8aSorted } from '@polkadot/util'; @@ -10,7 +11,7 @@ import { decodeAddress } from './decode'; const PREFIX = stringToU8a('modlpy/utilisuba'); -export function createKeyMulti (who: (Uint8Array | string)[], threshold: bigint | BN | number): Uint8Array { +export function createKeyMulti (who: (HexString | Uint8Array | string)[], threshold: bigint | BN | number): Uint8Array { return blake2AsU8a( u8aConcat( PREFIX, diff --git a/packages/util-crypto/src/address/sort.ts b/packages/util-crypto/src/address/sort.ts index ccef03b98..0a051f787 100644 --- a/packages/util-crypto/src/address/sort.ts +++ b/packages/util-crypto/src/address/sort.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { u8aSorted } from '@polkadot/util'; @@ -8,7 +9,7 @@ import { u8aSorted } from '@polkadot/util'; import { decodeAddress } from './decode'; import { encodeAddress } from './encode'; -export function sortAddresses (addresses: (Uint8Array | string)[], ss58Format?: Prefix): string[] { +export function sortAddresses (addresses: (HexString | Uint8Array | string)[], ss58Format?: Prefix): string[] { return u8aSorted( addresses.map((who) => decodeAddress(who)) ).map((u8a) => encodeAddress(u8a, ss58Format)); diff --git a/packages/util-crypto/src/address/validate.ts b/packages/util-crypto/src/address/validate.ts index 0e3450bd7..7c5ce8702 100644 --- a/packages/util-crypto/src/address/validate.ts +++ b/packages/util-crypto/src/address/validate.ts @@ -1,10 +1,11 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Prefix } from './types'; import { decodeAddress } from './decode'; -export function validateAddress (encoded?: string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): encoded is string { +export function validateAddress (encoded?: HexString | string | null, ignoreChecksum?: boolean, ss58Format?: Prefix): encoded is string { return !!decodeAddress(encoded, ignoreChecksum, ss58Format); } diff --git a/packages/util-crypto/src/base32/encode.ts b/packages/util-crypto/src/base32/encode.ts index cee8c5ab9..453d4f2aa 100644 --- a/packages/util-crypto/src/base32/encode.ts +++ b/packages/util-crypto/src/base32/encode.ts @@ -3,6 +3,8 @@ // adapted from https://github.com/multiformats/js-multibase/blob/424709195b46ffb1d6f2f69a7707598ebe751e5e/src/rfc4648.js +import type { U8aLike } from '@polkadot/util/types'; + import { u8aToU8a } from '@polkadot/util'; import { BASE32_ALPHABET, BITS_PER_CHAR } from './bs32'; @@ -15,7 +17,7 @@ const MASK = (1 << BITS_PER_CHAR) - 1; * @description * From the provided input, create the base32 and return the result as a string. */ -export function base32Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat = false): string { +export function base32Encode (value: U8aLike, ipfsCompat = false): string { const u8a = u8aToU8a(value); let out = ''; let bits = 0; diff --git a/packages/util-crypto/src/base58/encode.ts b/packages/util-crypto/src/base58/encode.ts index 1dbc6a15e..f9ec2b823 100644 --- a/packages/util-crypto/src/base58/encode.ts +++ b/packages/util-crypto/src/base58/encode.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '@polkadot/util/types'; + import { u8aToU8a } from '@polkadot/util'; import { bs58 } from './bs58'; @@ -11,7 +13,7 @@ import { bs58 } from './bs58'; * @description * From the provided input, create the base58 and return the result as a string. */ -export function base58Encode (value: Uint8Array | string | Buffer | number[], ipfsCompat?: boolean): string { +export function base58Encode (value: U8aLike, ipfsCompat?: boolean): string { const out = bs58.encode(u8aToU8a(value)); return ipfsCompat diff --git a/packages/util-crypto/src/base64/encode.ts b/packages/util-crypto/src/base64/encode.ts index a69329b25..e7a91877f 100644 --- a/packages/util-crypto/src/base64/encode.ts +++ b/packages/util-crypto/src/base64/encode.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '@polkadot/util/types'; + import base64 from 'base64-js'; import { u8aToU8a } from '@polkadot/util'; @@ -11,6 +13,6 @@ import { u8aToU8a } from '@polkadot/util'; * @description * From the provided input, create the base64 and return the result as a string. */ -export function base64Encode (value: Uint8Array | string | Buffer | number[]): string { +export function base64Encode (value: U8aLike): string { return base64.fromByteArray(u8aToU8a(value)); } diff --git a/packages/util-crypto/src/blake2/asHex.ts b/packages/util-crypto/src/blake2/asHex.ts index 8d206544f..2ddfb1b34 100644 --- a/packages/util-crypto/src/blake2/asHex.ts +++ b/packages/util-crypto/src/blake2/asHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToHex } from '@polkadot/util'; import { blake2AsU8a } from './asU8a'; @@ -19,7 +21,7 @@ import { blake2AsU8a } from './asU8a'; * blake2AsHex('abc'); // => 0xba80a53f981c4d0d * ``` */ -export function blake2AsHex (data: Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): string { +export function blake2AsHex (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): HexString { return u8aToHex( blake2AsU8a(data, bitLength, key, onlyJs) ); diff --git a/packages/util-crypto/src/blake2/asU8a.ts b/packages/util-crypto/src/blake2/asU8a.ts index 1b5d896de..573b22cc9 100644 --- a/packages/util-crypto/src/blake2/asU8a.ts +++ b/packages/util-crypto/src/blake2/asU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import js from 'blakejs'; import { u8aToU8a } from '@polkadot/util'; @@ -20,7 +22,7 @@ import { blake2b, isReady } from '@polkadot/wasm-crypto'; * blake2AsU8a('abc'); // => [0xba, 0x80, 0xa53, 0xf98, 0x1c, 0x4d, 0x0d] * ``` */ -export function blake2AsU8a (data: Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): Uint8Array { +export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs = false): Uint8Array { const byteLength = Math.ceil(bitLength / 8); return isReady() && !onlyJs diff --git a/packages/util-crypto/src/ethereum/encode.ts b/packages/util-crypto/src/ethereum/encode.ts index ca25242ed..583575f64 100644 --- a/packages/util-crypto/src/ethereum/encode.ts +++ b/packages/util-crypto/src/ethereum/encode.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { assert, u8aToHex, u8aToU8a } from '@polkadot/util'; import { keccakAsU8a } from '../keccak'; @@ -14,7 +16,7 @@ function getH160 (u8a: Uint8Array): Uint8Array { return u8a.slice(-20); } -export function ethereumEncode (addressOrPublic?: string | Uint8Array): string { +export function ethereumEncode (addressOrPublic?: HexString | string | Uint8Array): HexString { if (!addressOrPublic) { return '0x'; } diff --git a/packages/util-crypto/src/ethereum/isAddress.ts b/packages/util-crypto/src/ethereum/isAddress.ts index ef82e767a..174bd7123 100644 --- a/packages/util-crypto/src/ethereum/isAddress.ts +++ b/packages/util-crypto/src/ethereum/isAddress.ts @@ -1,11 +1,13 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { isHex } from '@polkadot/util'; import { isEthereumChecksum } from './isChecksum'; -export function isEthereumAddress (address?: string): boolean { +export function isEthereumAddress (address?: HexString | string): boolean { if (!address || address.length !== 42 || !isHex(address)) { return false; } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { diff --git a/packages/util-crypto/src/json/types.ts b/packages/util-crypto/src/json/types.ts index a6a29a550..23624c6bb 100644 --- a/packages/util-crypto/src/json/types.ts +++ b/packages/util-crypto/src/json/types.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + export type EncryptedJsonVersion = '0' | '1' | '2' | '3'; export type EncryptedJsonEncoding = 'none' | 'scrypt' | 'xsalsa20-poly1305'; @@ -12,6 +14,6 @@ export interface EncryptedJsonDescriptor { } export interface EncryptedJson { - encoded: string; + encoded: HexString | string; encoding: EncryptedJsonDescriptor; } diff --git a/packages/util-crypto/src/keccak/asHex.ts b/packages/util-crypto/src/keccak/asHex.ts index 3c3d471f9..ccdc64074 100644 --- a/packages/util-crypto/src/keccak/asHex.ts +++ b/packages/util-crypto/src/keccak/asHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToHex } from '@polkadot/util'; import { keccakAsU8a } from './asU8a'; @@ -19,7 +21,7 @@ import { keccakAsU8a } from './asU8a'; * keccakAsHex('123'); // => 0x... * ``` */ -export function keccakAsHex (value: Buffer | Uint8Array | string, bitLength?: 256 | 512): string { +export function keccakAsHex (value: HexString | Buffer | Uint8Array | string, bitLength?: 256 | 512): HexString { return u8aToHex( keccakAsU8a(value, bitLength) ); diff --git a/packages/util-crypto/src/keccak/asU8a.ts b/packages/util-crypto/src/keccak/asU8a.ts index 92064ba86..a4f6ed7e9 100644 --- a/packages/util-crypto/src/keccak/asU8a.ts +++ b/packages/util-crypto/src/keccak/asU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import js from 'js-sha3'; import { u8aToU8a } from '@polkadot/util'; @@ -20,7 +22,7 @@ import { isReady, keccak256 } from '@polkadot/wasm-crypto'; * keccakAsU8a('123'); // => Uint8Array * ``` */ -export function keccakAsU8a (value: Buffer | Uint8Array | string, bitLength: 256 | 512 = 256, onlyJs = false): Uint8Array { +export function keccakAsU8a (value: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512 = 256, onlyJs = false): Uint8Array { const is256 = bitLength === 256; return isReady() && is256 && !onlyJs diff --git a/packages/util-crypto/src/key/DeriveJunction.ts b/packages/util-crypto/src/key/DeriveJunction.ts index eef445dd8..9634f0604 100644 --- a/packages/util-crypto/src/key/DeriveJunction.ts +++ b/packages/util-crypto/src/key/DeriveJunction.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { BN, bnToHex, compactAddLength, hexToU8a, isBigInt, isBn, isHex, isNumber, isString, stringToU8a } from '@polkadot/util'; import { blake2AsU8a } from '../blake2/asU8a'; @@ -47,7 +49,7 @@ export class DeriveJunction { return !this.#isHard; } - public hard (value: number | string | bigint | BN | Uint8Array): DeriveJunction { + public hard (value: HexString | number | string | bigint | BN | Uint8Array): DeriveJunction { return this.soft(value).harden(); } @@ -57,7 +59,7 @@ export class DeriveJunction { return this; } - public soft (value: number | string | bigint | BN | Uint8Array): DeriveJunction { + public soft (value: HexString | number | string | bigint | BN | Uint8Array): DeriveJunction { if (isNumber(value) || isBn(value) || isBigInt(value)) { return this.soft(bnToHex(value, BN_OPTIONS)); } else if (isHex(value)) { diff --git a/packages/util-crypto/src/mnemonic/bip39.ts b/packages/util-crypto/src/mnemonic/bip39.ts index 9a88dcc4c..685cfc380 100644 --- a/packages/util-crypto/src/mnemonic/bip39.ts +++ b/packages/util-crypto/src/mnemonic/bip39.ts @@ -10,7 +10,7 @@ // - Adjust formatting (just eslint differences) // - Only English wordlist (this aligns with the wasm-crypto implementation) // - Use util-crypto randomAsU8a (instead of randombytes) -// - Remove setting of wordlost passing of wordlist in functions +// - Remove setting of wordlist passing of wordlist in functions // - Remove mnemonicToSeed (we only use the sync variant) import hash from 'hash.js'; @@ -34,7 +34,7 @@ function binaryToByte (bin: string): number { } function bytesToBinary (bytes: number[]): string { - return bytes.map((x: number) => x.toString(2).padStart(8, '0')).join(''); + return bytes.map((x) => x.toString(2).padStart(8, '0')).join(''); } function deriveChecksumBits (entropyBuffer: Uint8Array): string { diff --git a/packages/util-crypto/src/nacl/sign.ts b/packages/util-crypto/src/nacl/sign.ts index 2ff1be0af..1ec26f1a9 100644 --- a/packages/util-crypto/src/nacl/sign.ts +++ b/packages/util-crypto/src/nacl/sign.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../types'; import nacl from 'tweetnacl'; @@ -22,7 +23,7 @@ import { ed25519Sign, isReady } from '@polkadot/wasm-crypto'; * naclSign([...], [...]); // => [...] * ``` */ -export function naclSign (message: Uint8Array | string, { publicKey, secretKey }: Partial, onlyJs = false): Uint8Array { +export function naclSign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial, onlyJs = false): Uint8Array { assert(secretKey, 'Expected a valid secretKey'); const messageU8a = u8aToU8a(message); diff --git a/packages/util-crypto/src/nacl/verify.ts b/packages/util-crypto/src/nacl/verify.ts index 271796af0..0cae6353e 100644 --- a/packages/util-crypto/src/nacl/verify.ts +++ b/packages/util-crypto/src/nacl/verify.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import nacl from 'tweetnacl'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -20,7 +22,7 @@ import { ed25519Verify, isReady } from '@polkadot/wasm-crypto'; * naclVerify([...], [...], [...]); // => true/false * ``` */ -export function naclVerify (message: Uint8Array | string, signature: Uint8Array | string, publicKey: Uint8Array | string, onlyJs = false): boolean { +export function naclVerify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, publicKey: HexString | Uint8Array | string, onlyJs = false): boolean { const messageU8a = u8aToU8a(message); const publicKeyU8a = u8aToU8a(publicKey); const signatureU8a = u8aToU8a(signature); diff --git a/packages/util-crypto/src/pbkdf2/encode.ts b/packages/util-crypto/src/pbkdf2/encode.ts index 71529e317..5bc9c94a6 100644 --- a/packages/util-crypto/src/pbkdf2/encode.ts +++ b/packages/util-crypto/src/pbkdf2/encode.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToU8a } from '@polkadot/util'; import { isReady, pbkdf2 } from '@polkadot/wasm-crypto'; @@ -13,7 +15,7 @@ interface Result { salt: Uint8Array; } -export function pbkdf2Encode (passphrase?: Buffer | Uint8Array | string, salt: Buffer | Uint8Array = randomAsU8a(), rounds = 2048, onlyJs = false): Result { +export function pbkdf2Encode (passphrase?: HexString | Buffer | Uint8Array | string, salt: Buffer | Uint8Array = randomAsU8a(), rounds = 2048, onlyJs = false): Result { const u8aPass = u8aToU8a(passphrase); const u8aSalt = u8aToU8a(salt); const password = isReady() && !onlyJs diff --git a/packages/util-crypto/src/random/asHex.ts b/packages/util-crypto/src/random/asHex.ts index 99501b254..11ca30b2e 100644 --- a/packages/util-crypto/src/random/asHex.ts +++ b/packages/util-crypto/src/random/asHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToHex } from '@polkadot/util'; import { randomAsU8a } from './asU8a'; @@ -19,7 +21,7 @@ import { randomAsU8a } from './asU8a'; * randomAsHex(); // => 0x... * ``` */ -export function randomAsHex (length = 32): string { +export function randomAsHex (length = 32): HexString { return u8aToHex( randomAsU8a(length) ); diff --git a/packages/util-crypto/src/schnorrkel/agreement.ts b/packages/util-crypto/src/schnorrkel/agreement.ts index 8a32fdb95..cc1977975 100644 --- a/packages/util-crypto/src/schnorrkel/agreement.ts +++ b/packages/util-crypto/src/schnorrkel/agreement.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { assert, u8aToU8a } from '@polkadot/util'; import { sr25519Agree } from '@polkadot/wasm-crypto'; @@ -8,7 +10,7 @@ import { sr25519Agree } from '@polkadot/wasm-crypto'; * @name schnorrkelAgreement * @description Key agreement between other's public key and self secret key */ -export function schnorrkelAgreement (secretKey: Uint8Array | string, publicKey: Uint8Array | string): Uint8Array { +export function schnorrkelAgreement (secretKey: HexString | Uint8Array | string, publicKey: HexString | Uint8Array | string): Uint8Array { const secretKeyU8a = u8aToU8a(secretKey); const publicKeyU8a = u8aToU8a(publicKey); diff --git a/packages/util-crypto/src/schnorrkel/deriveHard.ts b/packages/util-crypto/src/schnorrkel/deriveHard.ts index 3257515ad..0fbc0838a 100644 --- a/packages/util-crypto/src/schnorrkel/deriveHard.ts +++ b/packages/util-crypto/src/schnorrkel/deriveHard.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../types'; import { u8aToU8a } from '@polkadot/util'; @@ -9,7 +10,7 @@ import { sr25519DeriveKeypairHard } from '@polkadot/wasm-crypto'; import { schnorrkelKeypairFromU8a } from './keypair/fromU8a'; import { schnorrkelKeypairToU8a } from './keypair/toU8a'; -export function schnorrkelDeriveHard (keypair: Keypair, chainCode: Uint8Array | string): Keypair { +export function schnorrkelDeriveHard (keypair: Keypair, chainCode: HexString | Uint8Array | string): Keypair { return schnorrkelKeypairFromU8a( sr25519DeriveKeypairHard(schnorrkelKeypairToU8a(keypair), u8aToU8a(chainCode)) ); diff --git a/packages/util-crypto/src/schnorrkel/derivePublic.ts b/packages/util-crypto/src/schnorrkel/derivePublic.ts index d53ce15aa..f232e4f24 100644 --- a/packages/util-crypto/src/schnorrkel/derivePublic.ts +++ b/packages/util-crypto/src/schnorrkel/derivePublic.ts @@ -1,10 +1,12 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { assert, u8aToU8a } from '@polkadot/util'; import { sr25519DerivePublicSoft } from '@polkadot/wasm-crypto'; -export function schnorrkelDerivePublic (publicKey: Uint8Array | string, chainCode: Uint8Array | string): Uint8Array { +export function schnorrkelDerivePublic (publicKey: HexString | Uint8Array | string, chainCode: HexString | Uint8Array | string): Uint8Array { const publicKeyU8a = u8aToU8a(publicKey); assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`); diff --git a/packages/util-crypto/src/schnorrkel/deriveSoft.ts b/packages/util-crypto/src/schnorrkel/deriveSoft.ts index d69601b76..7be473853 100644 --- a/packages/util-crypto/src/schnorrkel/deriveSoft.ts +++ b/packages/util-crypto/src/schnorrkel/deriveSoft.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../types'; import { u8aToU8a } from '@polkadot/util'; @@ -9,7 +10,7 @@ import { sr25519DeriveKeypairSoft } from '@polkadot/wasm-crypto'; import { schnorrkelKeypairFromU8a } from './keypair/fromU8a'; import { schnorrkelKeypairToU8a } from './keypair/toU8a'; -export function schnorrkelDeriveSoft (keypair: Keypair, chainCode: Uint8Array | string): Keypair { +export function schnorrkelDeriveSoft (keypair: Keypair, chainCode: HexString | Uint8Array | string): Keypair { return schnorrkelKeypairFromU8a( sr25519DeriveKeypairSoft(schnorrkelKeypairToU8a(keypair), u8aToU8a(chainCode)) ); diff --git a/packages/util-crypto/src/schnorrkel/keypair/fromSeed.ts b/packages/util-crypto/src/schnorrkel/keypair/fromSeed.ts index dc8ef2388..48e9b9cdb 100644 --- a/packages/util-crypto/src/schnorrkel/keypair/fromSeed.ts +++ b/packages/util-crypto/src/schnorrkel/keypair/fromSeed.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../../types'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -12,7 +13,7 @@ import { schnorrkelKeypairFromU8a } from './fromU8a'; * @name schnorrkelKeypairFromSeed * @description Returns a object containing a `publicKey` & `secretKey` generated from the supplied seed. */ -export function schnorrkelKeypairFromSeed (seed: Uint8Array | string): Keypair { +export function schnorrkelKeypairFromSeed (seed: HexString | Uint8Array | string): Keypair { const seedU8a = u8aToU8a(seed); assert(seedU8a.length === 32, () => `Expected a seed matching 32 bytes, found ${seedU8a.length}`); diff --git a/packages/util-crypto/src/schnorrkel/keypair/fromU8a.ts b/packages/util-crypto/src/schnorrkel/keypair/fromU8a.ts index 2319f9e74..cec438970 100644 --- a/packages/util-crypto/src/schnorrkel/keypair/fromU8a.ts +++ b/packages/util-crypto/src/schnorrkel/keypair/fromU8a.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../../types'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -9,7 +10,7 @@ const SEC_LEN = 64; const PUB_LEN = 32; const TOT_LEN = SEC_LEN + PUB_LEN; -export function schnorrkelKeypairFromU8a (full: Uint8Array | string): Keypair { +export function schnorrkelKeypairFromU8a (full: HexString | Uint8Array | string): Keypair { const fullU8a = u8aToU8a(full); assert(fullU8a.length === TOT_LEN, () => `Expected keypair with ${TOT_LEN} bytes, found ${fullU8a.length}`); diff --git a/packages/util-crypto/src/schnorrkel/sign.ts b/packages/util-crypto/src/schnorrkel/sign.ts index 1e6c542b8..c5c657684 100644 --- a/packages/util-crypto/src/schnorrkel/sign.ts +++ b/packages/util-crypto/src/schnorrkel/sign.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../types'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -10,7 +11,7 @@ import { sr25519Sign } from '@polkadot/wasm-crypto'; * @name schnorrkelSign * @description Returns message signature of `message`, using the supplied pair */ -export function schnorrkelSign (message: Uint8Array | string, { publicKey, secretKey }: Partial): Uint8Array { +export function schnorrkelSign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial): Uint8Array { assert(publicKey?.length === 32, 'Expected a valid publicKey, 32-bytes'); assert(secretKey?.length === 64, 'Expected a valid secretKey, 64-bytes'); diff --git a/packages/util-crypto/src/schnorrkel/verify.ts b/packages/util-crypto/src/schnorrkel/verify.ts index dba2aeea0..a93491ab2 100644 --- a/packages/util-crypto/src/schnorrkel/verify.ts +++ b/packages/util-crypto/src/schnorrkel/verify.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { assert, u8aToU8a } from '@polkadot/util'; import { sr25519Verify } from '@polkadot/wasm-crypto'; @@ -8,7 +10,7 @@ import { sr25519Verify } from '@polkadot/wasm-crypto'; * @name schnorrkelVerify * @description Verifies the signature of `message`, using the supplied pair */ -export function schnorrkelVerify (message: Uint8Array | string, signature: Uint8Array | string, publicKey: Uint8Array | string): boolean { +export function schnorrkelVerify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, publicKey: HexString | Uint8Array | string): boolean { const publicKeyU8a = u8aToU8a(publicKey); const signatureU8a = u8aToU8a(signature); diff --git a/packages/util-crypto/src/schnorrkel/vrfSign.ts b/packages/util-crypto/src/schnorrkel/vrfSign.ts index 1ee124ef5..00013bfdc 100644 --- a/packages/util-crypto/src/schnorrkel/vrfSign.ts +++ b/packages/util-crypto/src/schnorrkel/vrfSign.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Keypair } from '../types'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -12,7 +13,7 @@ const EMPTY_U8A = new Uint8Array(); * @name schnorrkelVrfSign * @description Sign with sr25519 vrf signing (deterministic) */ -export function schnorrkelVrfSign (message: Uint8Array | string, { secretKey }: Partial, context: string | Uint8Array = EMPTY_U8A, extra: string | Uint8Array = EMPTY_U8A): Uint8Array { +export function schnorrkelVrfSign (message: HexString | Uint8Array | string, { secretKey }: Partial, context: HexString | string | Uint8Array = EMPTY_U8A, extra: HexString | string | Uint8Array = EMPTY_U8A): Uint8Array { assert(secretKey?.length === 64, 'Invalid secretKey, expected 64-bytes'); return vrfSign(secretKey, u8aToU8a(context), u8aToU8a(message), u8aToU8a(extra)); diff --git a/packages/util-crypto/src/schnorrkel/vrfVerify.ts b/packages/util-crypto/src/schnorrkel/vrfVerify.ts index a171c2ca9..86d7c30bc 100644 --- a/packages/util-crypto/src/schnorrkel/vrfVerify.ts +++ b/packages/util-crypto/src/schnorrkel/vrfVerify.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { assert, u8aToU8a } from '@polkadot/util'; import { vrfVerify } from '@polkadot/wasm-crypto'; @@ -10,7 +12,7 @@ const EMPTY_U8A = new Uint8Array(); * @name schnorrkelVrfVerify * @description Verify with sr25519 vrf verification */ -export function schnorrkelVrfVerify (message: Uint8Array | string, signOutput: string | Uint8Array, publicKey: Uint8Array | string, context: string | Uint8Array = EMPTY_U8A, extra: string | Uint8Array = EMPTY_U8A): boolean { +export function schnorrkelVrfVerify (message: HexString | Uint8Array | string, signOutput: HexString | string | Uint8Array, publicKey: HexString | Uint8Array | string, context: HexString | string | Uint8Array = EMPTY_U8A, extra: HexString | string | Uint8Array = EMPTY_U8A): boolean { const publicKeyU8a = u8aToU8a(publicKey); const proofU8a = u8aToU8a(signOutput); diff --git a/packages/util-crypto/src/scrypt/encode.ts b/packages/util-crypto/src/scrypt/encode.ts index f76373b01..77ad28495 100644 --- a/packages/util-crypto/src/scrypt/encode.ts +++ b/packages/util-crypto/src/scrypt/encode.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { Params } from './types'; import scryptsy from 'scryptsy'; @@ -17,7 +18,7 @@ interface Result { salt: Uint8Array; } -export function scryptEncode (passphrase?: Uint8Array | string, salt = randomAsU8a(), params = DEFAULT_PARAMS): Result { +export function scryptEncode (passphrase?: HexString | Uint8Array | string, salt = randomAsU8a(), params = DEFAULT_PARAMS): Result { const password = isReady() ? scrypt(u8aToU8a(passphrase), salt, Math.log2(params.N), params.r, params.p) : bufferToU8a( diff --git a/packages/util-crypto/src/secp256k1/verify.ts b/packages/util-crypto/src/secp256k1/verify.ts index b596ef80f..6f4fb3428 100644 --- a/packages/util-crypto/src/secp256k1/verify.ts +++ b/packages/util-crypto/src/secp256k1/verify.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { HashType } from './types'; import { assert, u8aEq, u8aToU8a } from '@polkadot/util'; @@ -13,7 +14,7 @@ import { secp256k1 } from './secp256k1'; * @name secp256k1Verify * @description Verifies the signature of `message`, using the supplied pair */ -export function secp256k1Verify (message: Uint8Array | string, signature: Uint8Array | string, address: Uint8Array | string, hashType: HashType = 'blake2'): boolean { +export function secp256k1Verify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, address: HexString | Uint8Array | string, hashType: HashType = 'blake2'): boolean { const isEthereum = hashType === 'keccak'; const u8a = u8aToU8a(signature); diff --git a/packages/util-crypto/src/signature/verify.ts b/packages/util-crypto/src/signature/verify.ts index 78be0f3a3..5c541fa4e 100644 --- a/packages/util-crypto/src/signature/verify.ts +++ b/packages/util-crypto/src/signature/verify.ts @@ -1,6 +1,7 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; import type { KeypairType, VerifyResult } from '../types'; import { assert, u8aToU8a } from '@polkadot/util'; @@ -74,7 +75,7 @@ function verifyMultisig (result: VerifyResult, { message, publicKey, signature } return result; } -export function signatureVerify (message: Uint8Array | string, signature: Uint8Array | string, addressOrPublicKey: Uint8Array | string): VerifyResult { +export function signatureVerify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, addressOrPublicKey: HexString | Uint8Array | string): VerifyResult { const signatureU8a = u8aToU8a(signature); assert([64, 65, 66].includes(signatureU8a.length), () => `Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`); diff --git a/packages/util-crypto/src/types.ts b/packages/util-crypto/src/types.ts index 8c6ff7994..ba7c3bb16 100644 --- a/packages/util-crypto/src/types.ts +++ b/packages/util-crypto/src/types.ts @@ -1,6 +1,9 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +export * from './address/types'; +export * from './json/types'; + export interface Keypair { publicKey: Uint8Array; secretKey: Uint8Array; diff --git a/packages/util-crypto/src/xxhash/asHex.ts b/packages/util-crypto/src/xxhash/asHex.ts index badba9bfe..a374e1c13 100644 --- a/packages/util-crypto/src/xxhash/asHex.ts +++ b/packages/util-crypto/src/xxhash/asHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToHex } from '@polkadot/util'; import { xxhashAsU8a } from './asU8a'; @@ -19,7 +21,7 @@ import { xxhashAsU8a } from './asU8a'; * xxhashAsHex('abc'); // => 0x44bc2cf5ad770999 * ``` */ -export function xxhashAsHex (data: Buffer | Uint8Array | string, bitLength = 64): string { +export function xxhashAsHex (data: HexString | Buffer | Uint8Array | string, bitLength = 64): HexString { return u8aToHex( xxhashAsU8a(data, bitLength) ); diff --git a/packages/util-crypto/src/xxhash/asU8a.ts b/packages/util-crypto/src/xxhash/asU8a.ts index 445738961..ed550c290 100644 --- a/packages/util-crypto/src/xxhash/asU8a.ts +++ b/packages/util-crypto/src/xxhash/asU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '@polkadot/util/types'; + import { u8aToU8a } from '@polkadot/util'; import { isReady, twox } from '@polkadot/wasm-crypto'; @@ -20,7 +22,7 @@ import xxhash64AsBn from './xxhash64/asBn'; * xxhashAsU8a('abc'); // => 0x44bc2cf5ad770999 * ``` */ -export function xxhashAsU8a (data: Buffer | Uint8Array | string, bitLength = 64, onlyJs = false): Uint8Array { +export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bitLength = 64, onlyJs = false): Uint8Array { const iterations = Math.ceil(bitLength / 64); if (isReady() && !onlyJs) { diff --git a/packages/util/src/bn/toBn.ts b/packages/util/src/bn/toBn.ts index c4da4166a..f497877aa 100644 --- a/packages/util/src/bn/toBn.ts +++ b/packages/util/src/bn/toBn.ts @@ -1,7 +1,7 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { ToBn } from '../types'; +import type { HexString, ToBn } from '../types'; import { hexToBn } from '../hex/toBn'; import { isBigInt } from '../is/bigInt'; @@ -25,7 +25,7 @@ import { BN } from './bn'; * bnToBn(new BN(0x1234)); // => BN(0x1234) * ``` */ -export function bnToBn (value?: ExtToBn | BN | bigint | string | number | null): BN { +export function bnToBn (value?: HexString | ExtToBn | BN | bigint | string | number | null): BN { if (!value) { return new BN(0); } else if (isHex(value)) { diff --git a/packages/util/src/bn/toHex.ts b/packages/util/src/bn/toHex.ts index 1af0ebebc..6b59ec0ad 100644 --- a/packages/util/src/bn/toHex.ts +++ b/packages/util/src/bn/toHex.ts @@ -1,7 +1,7 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { ToBn, ToBnOptions } from '../types'; +import type { HexString, ToBn, ToBnOptions } from '../types'; import type { BN } from './bn'; import { isNumber } from '../is/number'; @@ -29,9 +29,9 @@ interface Options extends ToBnOptions { * bnToHex(new BN(0x123456)); // => '0x123456' * ``` */ -function bnToHex (value?: ExtToBn | BN | bigint | number | null, options?: Options): string; -function bnToHex (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): string; -function bnToHex (value?: ExtToBn | BN | bigint | number | null, arg1: number | Options = { bitLength: -1, isLe: false, isNegative: false }, arg2?: boolean): string { +function bnToHex (value?: ExtToBn | BN | bigint | number | null, options?: Options): HexString; +function bnToHex (value?: ExtToBn | BN | bigint | number | null, bitLength?: number, isLe?: boolean): HexString; +function bnToHex (value?: ExtToBn | BN | bigint | number | null, arg1: number | Options = { bitLength: -1, isLe: false, isNegative: false }, arg2?: boolean): HexString { if (!value) { return ZERO_STR; } diff --git a/packages/util/src/compact/fromU8a.ts b/packages/util/src/compact/fromU8a.ts index fee93669d..460530845 100644 --- a/packages/util/src/compact/fromU8a.ts +++ b/packages/util/src/compact/fromU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '../types'; + import { BN, BN_FOUR } from '../bn'; import { u8aToBn, u8aToU8a } from '../u8a'; @@ -18,7 +20,7 @@ import { u8aToBn, u8aToU8a } from '../u8a'; * console.log('value offset=', offset, 'length=', length); // 4, 0xffff * ``` */ -export function compactFromU8a (_input: Buffer | Uint8Array | string | number[]): [number, BN] { +export function compactFromU8a (_input: U8aLike): [number, BN] { const input = u8aToU8a(_input); const flag = input[0] & 0b11; diff --git a/packages/util/src/hex/addPrefix.ts b/packages/util/src/hex/addPrefix.ts index 1907c8468..575fbd4a6 100644 --- a/packages/util/src/hex/addPrefix.ts +++ b/packages/util/src/hex/addPrefix.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { hexHasPrefix } from './hasPrefix'; /** @@ -17,7 +19,7 @@ import { hexHasPrefix } from './hasPrefix'; * console.log('With prefix', hexAddPrefix('0a0b12')); // => 0x0a0b12 * ``` */ -export function hexAddPrefix (value?: string | null): string { +export function hexAddPrefix (value?: string | null): HexString { if (value && hexHasPrefix(value)) { return value; } diff --git a/packages/util/src/hex/fixLength.ts b/packages/util/src/hex/fixLength.ts index 2bcde3841..14d363455 100644 --- a/packages/util/src/hex/fixLength.ts +++ b/packages/util/src/hex/fixLength.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { hexAddPrefix } from './addPrefix'; import { hexStripPrefix } from './stripPrefix'; @@ -20,7 +22,7 @@ import { hexStripPrefix } from './stripPrefix'; * console.log('fixed', hexFixLength('0x0012', 8)); // => 0x12 * ``` */ -export function hexFixLength (value: string, bitLength = -1, withPadding = false): string { +export function hexFixLength (value: string, bitLength = -1, withPadding = false): HexString { const strLength = Math.ceil(bitLength / 4); const hexLength = strLength + 2; diff --git a/packages/util/src/hex/hasPrefix.ts b/packages/util/src/hex/hasPrefix.ts index a8fc07fd6..185cf724c 100644 --- a/packages/util/src/hex/hasPrefix.ts +++ b/packages/util/src/hex/hasPrefix.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { isHex } from '../is/hex'; /** @@ -17,6 +19,6 @@ import { isHex } from '../is/hex'; * console.log('has prefix', hexHasPrefix('0x1234')); // => true * ``` */ -export function hexHasPrefix (value?: string | null): boolean { +export function hexHasPrefix (value?: string | null): value is HexString { return !!(value && isHex(value, -1, true) && value.substr(0, 2) === '0x'); } diff --git a/packages/util/src/hex/toU8a.ts b/packages/util/src/hex/toU8a.ts index 37ded48f5..98584a92f 100644 --- a/packages/util/src/hex/toU8a.ts +++ b/packages/util/src/hex/toU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { assert } from '../assert'; import { isHex } from '../is/hex'; import { hexStripPrefix } from './stripPrefix'; @@ -20,7 +22,7 @@ import { hexStripPrefix } from './stripPrefix'; * hexToU8a('0x80001f', 32); // Uint8Array([0x00, 0x80, 0x00, 0x1f]) * ``` */ -export function hexToU8a (_value?: string | null, bitLength = -1): Uint8Array { +export function hexToU8a (_value?: HexString | string | null, bitLength = -1): Uint8Array { if (!_value) { return new Uint8Array(); } diff --git a/packages/util/src/is/ascii.ts b/packages/util/src/is/ascii.ts index f97ae90d0..cc2de916c 100644 --- a/packages/util/src/is/ascii.ts +++ b/packages/util/src/is/ascii.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '../types'; + import { u8aToU8a } from '../u8a/toU8a'; import { isString } from './string'; @@ -12,7 +14,7 @@ const FORMAT = [9, 10, 13]; * @description * Checks to see if the input string or Uint8Array is printable ASCII, 32-127 + formatters */ -export function isAscii (value?: number[] | Buffer | Uint8Array | string | null): boolean { +export function isAscii (value?: U8aLike | null): boolean { return value ? !u8aToU8a(value).some((byte) => (byte >= 127) || (byte < 32 && !FORMAT.includes(byte))) : isString(value); diff --git a/packages/util/src/is/hex.ts b/packages/util/src/is/hex.ts index d46b8d0ee..719a66a59 100644 --- a/packages/util/src/is/hex.ts +++ b/packages/util/src/is/hex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + const HEX_REGEX = /^0x[a-fA-F0-9]+$/; /** @@ -18,7 +20,7 @@ const HEX_REGEX = /^0x[a-fA-F0-9]+$/; * isHex('0x1234', 8); // => false * ``` */ -export function isHex (value: unknown, bitLength = -1, ignoreLength = false): value is string { +export function isHex (value: unknown, bitLength = -1, ignoreLength = false): value is HexString { return (typeof value === 'string' && (value === '0x' || HEX_REGEX.test(value))) ? bitLength === -1 ? ((value.length % 2 === 0) || ignoreLength) diff --git a/packages/util/src/is/utf8.ts b/packages/util/src/is/utf8.ts index 9fbed8533..f1eb51bae 100644 --- a/packages/util/src/is/utf8.ts +++ b/packages/util/src/is/utf8.ts @@ -3,6 +3,8 @@ // Adapted from https://github.com/JulienPalard/is_utf8/blob/master/is_utf8.c +import type { HexString } from '../types'; + import { u8aToU8a } from '../u8a/toU8a'; import { isString } from './string'; @@ -12,7 +14,7 @@ import { isString } from './string'; * @description * Checks to see if the input string or Uint8Array is valid Utf8 */ -export function isUtf8 (value?: number[] | Buffer | Uint8Array | string | null): boolean { +export function isUtf8 (value?: HexString | number[] | Buffer | Uint8Array | string | null): boolean { if (!value) { return isString(value); } diff --git a/packages/util/src/number/toHex.ts b/packages/util/src/number/toHex.ts index c039f3988..43125b464 100644 --- a/packages/util/src/number/toHex.ts +++ b/packages/util/src/number/toHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { hexFixLength } from '../hex/fixLength'; import { isNull } from '../is/null'; import { isUndefined } from '../is/undefined'; @@ -20,7 +22,7 @@ import { isUndefined } from '../is/undefined'; * numberToHex(0x1234, 32); // => 0x00001234 * ``` */ -export function numberToHex (value?: number | null, bitLength = -1): string { +export function numberToHex (value?: number | null, bitLength = -1): HexString { if (isUndefined(value) || isNull(value) || isNaN(value)) { return '0x'; } diff --git a/packages/util/src/string/toHex.ts b/packages/util/src/string/toHex.ts index 53d9afecc..acfd895d2 100644 --- a/packages/util/src/string/toHex.ts +++ b/packages/util/src/string/toHex.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { u8aToHex } from '../u8a/toHex'; import { stringToU8a } from './toU8a'; @@ -19,7 +21,7 @@ import { stringToU8a } from './toU8a'; * ``` */ // eslint-disable-next-line @typescript-eslint/ban-types -export function stringToHex (value?: String | string): string { +export function stringToHex (value?: String | string): HexString { return u8aToHex( stringToU8a(value) ); diff --git a/packages/util/src/types.ts b/packages/util/src/types.ts index 603dbe9a6..4c04ec313 100644 --- a/packages/util/src/types.ts +++ b/packages/util/src/types.ts @@ -51,3 +51,10 @@ export interface Time { export type Memoized = F & { unmemoize: (...args: unknown[]) => void; } + +export type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f'; + +// One day when template strings support regex, we can improve this +export type HexString = `0x${string}`; + +export type U8aLike = HexString | number[] | Buffer | Uint8Array | string; diff --git a/packages/util/src/u8a/cmp.ts b/packages/util/src/u8a/cmp.ts index 93cf0992b..8b968e787 100644 --- a/packages/util/src/u8a/cmp.ts +++ b/packages/util/src/u8a/cmp.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { u8aToU8a } from './toU8a'; function compare (a: Uint8Array, b: Uint8Array): number { @@ -46,6 +48,6 @@ function compare (a: Uint8Array, b: Uint8Array): number { * u8aCmp(new Uint8Array([0x69, 0x65]), new Uint8Array([0x68, 0x65])); // +1 * ``` */ -export function u8aCmp (a: Uint8Array | string, b: Uint8Array | string): number { +export function u8aCmp (a: HexString | Uint8Array | string, b: HexString | Uint8Array | string): number { return compare(u8aToU8a(a), u8aToU8a(b)); } diff --git a/packages/util/src/u8a/concat.ts b/packages/util/src/u8a/concat.ts index bd01a15dd..58412096c 100644 --- a/packages/util/src/u8a/concat.ts +++ b/packages/util/src/u8a/concat.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '../types'; + import { u8aToU8a } from './toU8a'; /** @@ -20,7 +22,7 @@ import { u8aToU8a } from './toU8a'; * ); // [1, 2, 3, 4, 5, 6] * ``` */ -export function u8aConcat (...list: (Buffer | Uint8Array | number[] | string)[]): Uint8Array { +export function u8aConcat (...list: U8aLike[]): Uint8Array { let length = 0; let offset = 0; const u8as = new Array(list.length); diff --git a/packages/util/src/u8a/eq.ts b/packages/util/src/u8a/eq.ts index 16c11731a..0ac7e05eb 100644 --- a/packages/util/src/u8a/eq.ts +++ b/packages/util/src/u8a/eq.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexString } from '../types'; + import { u8aCmp } from './cmp'; import { u8aToU8a } from './toU8a'; @@ -22,6 +24,6 @@ function equals (a: Uint8Array, b: Uint8Array): boolean { * u8aEq(new Uint8Array([0x68, 0x65]), new Uint8Array([0x68, 0x65])); // true * ``` */ -export function u8aEq (a: Uint8Array | string, b: Uint8Array | string): boolean { +export function u8aEq (a: HexString | Uint8Array | string, b: HexString | Uint8Array | string): boolean { return equals(u8aToU8a(a), u8aToU8a(b)); } diff --git a/packages/util/src/u8a/fixLength.ts b/packages/util/src/u8a/fixLength.ts index 6eaf2ca1f..b7429bb9f 100644 --- a/packages/util/src/u8a/fixLength.ts +++ b/packages/util/src/u8a/fixLength.ts @@ -28,11 +28,7 @@ export function u8aFixLength (value: Uint8Array, bitLength = -1, atStart = false const result = new Uint8Array(byteLength); - if (atStart) { - result.set(value, 0); - } else { - result.set(value, byteLength - value.length); - } + result.set(value, atStart ? 0 : (byteLength - value.length)); return result; } diff --git a/packages/util/src/u8a/toHex.ts b/packages/util/src/u8a/toHex.ts index e34ceff3f..34b4a66ae 100644 --- a/packages/util/src/u8a/toHex.ts +++ b/packages/util/src/u8a/toHex.ts @@ -1,13 +1,17 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { HexDigit, HexString } from '../types'; + import { arrayRange } from '../array'; -const ALPHABET = arrayRange(256).map((n) => n.toString(16).padStart(2, '0')); +type HexByte = `${HexDigit}${HexDigit}`; + +const ALPHABET = arrayRange(256).map((n) => n.toString(16).padStart(2, '0') as HexByte); /** @internal */ function extract (value: Uint8Array): string { - const result = new Array(value.length); + const result = new Array(value.length); for (let i = 0; i < value.length; i++) { result[i] = ALPHABET[value[i]]; @@ -16,9 +20,18 @@ function extract (value: Uint8Array): string { return result.join(''); } +/** @internal */ +function unprefixed (value: Uint8Array, bitLength = -1): string { + const byteLength = Math.ceil(bitLength / 8); + + return (byteLength > 0 && value.length > byteLength) + ? trim(value, Math.ceil(byteLength / 2)) + : extract(value); +} + /** @internal */ function trim (value: Uint8Array, halfLength: number): string { - return `${u8aToHex(value.subarray(0, halfLength), -1, false)}…${u8aToHex(value.subarray(value.length - halfLength), -1, false)}`; + return `${unprefixed(value.subarray(0, halfLength))}…${unprefixed(value.subarray(value.length - halfLength))}`; } /** @@ -35,20 +48,10 @@ function trim (value: Uint8Array, halfLength: number): string { * u8aToHex(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0xf])); // 0x68656c0f * ``` */ -export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed = true): string { - const prefix = isPrefixed - ? '0x' - : ''; - - if (!value?.length) { - return prefix; - } - - const byteLength = Math.ceil(bitLength / 8); - - return prefix + ( - (byteLength > 0 && value.length > byteLength) - ? trim(value, Math.ceil(byteLength / 2)) - : extract(value) - ); +export function u8aToHex (value?: Uint8Array | null, bitLength = -1, isPrefixed = true): HexString { + return `${isPrefixed ? '0x' : ''}${ + !value || !value.length + ? '' + : unprefixed(value, bitLength) + }` as HexString; } diff --git a/packages/util/src/u8a/toU8a.ts b/packages/util/src/u8a/toU8a.ts index 8b8fd8894..1a9be8e46 100644 --- a/packages/util/src/u8a/toU8a.ts +++ b/packages/util/src/u8a/toU8a.ts @@ -1,6 +1,8 @@ // Copyright 2017-2021 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { U8aLike } from '../types'; + import { assert } from '../assert'; import { hexToU8a } from '../hex/toU8a'; import { isBuffer } from '../is/buffer'; @@ -24,7 +26,7 @@ import { stringToU8a } from '../string/toU8a'; * u8aToU8a(0x1234); // => Uint8Array([0x12, 0x34]) * ``` */ -export function u8aToU8a (value?: number[] | Buffer | Uint8Array | string | null): Uint8Array { +export function u8aToU8a (value?: U8aLike | null): Uint8Array { if (!value) { return new Uint8Array(); } else if (isHex(value)) {