A collection of useful crypto utilities for Polkadot ecosystem projects
npx @tessl/cli install tessl/npm-polkadot--util-crypto@13.5.0@polkadot/util-crypto is a comprehensive cryptographic utilities library designed specifically for the Polkadot ecosystem. It provides a wide range of cryptographic functions including key management, digital signatures, hashing algorithms, address encoding/decoding, and hierarchical deterministic key derivation across multiple cryptographic schemes.
npm install @polkadot/util-cryptoimport {
cryptoWaitReady,
mnemonicGenerate,
encodeAddress,
decodeAddress,
sr25519PairFromSeed,
ed25519Sign
} from "@polkadot/util-crypto";For CommonJS:
const {
cryptoWaitReady,
mnemonicGenerate,
encodeAddress,
decodeAddress,
sr25519PairFromSeed,
ed25519Sign
} = require("@polkadot/util-crypto");import {
cryptoWaitReady,
mnemonicGenerate,
mnemonicValidate,
mnemonicToMiniSecret,
sr25519PairFromSeed,
encodeAddress,
signatureVerify
} from "@polkadot/util-crypto";
// Initialize crypto before usage
await cryptoWaitReady();
// Generate and validate mnemonic
const mnemonic = mnemonicGenerate();
const isValid = mnemonicValidate(mnemonic);
// Create key pair from mnemonic
const seed = mnemonicToMiniSecret(mnemonic);
const pair = sr25519PairFromSeed(seed);
// Encode address with Polkadot prefix (0)
const address = encodeAddress(pair.publicKey, 0);
// Sign and verify message
const message = new TextEncoder().encode("Hello Polkadot");
const signature = sr25519Sign(message, pair);
const verified = signatureVerify(message, signature, address);@polkadot/util-crypto is organized around several key functional areas:
Core initialization functions to prepare the WebAssembly crypto backend.
function cryptoWaitReady(): Promise<boolean>;
function cryptoIsReady(): boolean;SS58 address encoding, decoding, and validation with support for multi-signature and derived addresses.
function encodeAddress(publicKey: Uint8Array, prefix?: number): string;
function decodeAddress(address: string, ignoreChecksum?: boolean, prefix?: number): Uint8Array;
function checkAddress(address: string, prefix?: number): [boolean, string | null];
function addressEq(a: string, b: string): boolean;Key pair generation and management for sr25519, ed25519, and secp256k1 cryptographic schemes.
interface Keypair {
publicKey: Uint8Array;
secretKey: Uint8Array;
}
interface Seedpair {
publicKey: Uint8Array;
seed: Uint8Array;
}
type KeypairType = 'ed25519' | 'sr25519' | 'ecdsa' | 'ethereum';
function sr25519PairFromSeed(seed: Uint8Array): Keypair;
function ed25519PairFromSeed(seed: Uint8Array): Keypair;
function secp256k1PairFromSeed(seed: Uint8Array): Keypair;Signing and verification functions for multiple cryptographic schemes with signature format detection.
interface VerifyResult {
crypto: 'none' | KeypairType;
isValid: boolean;
isWrapped: boolean;
publicKey: Uint8Array;
}
function sr25519Sign(message: string | Uint8Array, keypair: Partial<Keypair>): Uint8Array;
function ed25519Sign(publicKey: Uint8Array, secretKey: Uint8Array, message: Uint8Array): Uint8Array;
function signatureVerify(message: Uint8Array, signature: Uint8Array, addressOrPublicKey: string | Uint8Array): VerifyResult;BIP39-compatible mnemonic generation, validation, and seed derivation.
function mnemonicGenerate(numWords?: 12 | 15 | 18 | 21 | 24, wordlist?: string[]): string;
function mnemonicValidate(mnemonic: string, wordlist?: string[]): boolean;
function mnemonicToMiniSecret(mnemonic: string, password?: string): Uint8Array;
function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): Uint8Array;Hierarchical deterministic key derivation supporting both hard and soft derivation paths.
function keyFromPath(pair: Keypair, path: string, type: KeypairType): Keypair;
function keyExtractPath(path: string): { path: string; password?: string };
function hdEthereum(seed: Uint8Array, path?: string): Keypair;
function hdLedger(mnemonic: string, path: string, rounds?: number): Keypair;Comprehensive hashing functions including Blake2, Keccak, SHA, and xxHash.
function blake2AsU8a(data: Uint8Array, bitLength?: 64 | 128 | 256 | 512, key?: Uint8Array): Uint8Array;
function keccakAsU8a(value: Uint8Array, bitLength?: 256 | 512): Uint8Array;
function sha256AsU8a(value: Uint8Array): Uint8Array;
function xxhashAsU8a(data: Uint8Array, bitLength?: 64 | 128 | 256): Uint8Array;Encoding and decoding utilities for Base32, Base58, and Base64 formats.
function base58Encode(value: Uint8Array, ipfsCompat?: boolean): string;
function base58Decode(value: string, ipfsCompat?: boolean): Uint8Array;
function base64Encode(value: Uint8Array): string;
function base64Decode(value: string): Uint8Array;PBKDF2 and Scrypt implementations for password-based key derivation.
function pbkdf2Encode(passphrase: string, salt?: Uint8Array, rounds?: number, length?: number): Uint8Array;
function scryptEncode(passphrase: string, salt?: Uint8Array, N?: number, r?: number, p?: number, dkLen?: number): Uint8Array;Secure JSON encryption and decryption with password protection.
interface EncryptedJson {
encoded: string;
encoding: EncryptedJsonDescriptor;
}
interface EncryptedJsonDescriptor {
content: string[];
type: EncryptedJsonEncoding | EncryptedJsonEncoding[];
version: EncryptedJsonVersion;
}
function jsonEncrypt(data: Uint8Array, contentType: string[], passphrase: string): EncryptedJson;
function jsonDecrypt(json: EncryptedJson, passphrase: string): Uint8Array;Cryptographically secure random number generation in various formats.
function randomAsU8a(bitLength?: number): Uint8Array;
function randomAsHex(bitLength?: number): string;
function randomAsNumber(bitLength?: number): number;Ethereum address handling and compatibility utilities.
function ethereumEncode(addressOrPublic: string | Uint8Array): string;
function isEthereumAddress(address: string): boolean;
function addressToEvm(address: string): Uint8Array;
function evmToAddress(evmAddress: Uint8Array, prefix?: number, hashType?: 'blake2' | 'keccak'): string;NaCl secretbox encryption and decryption for authenticated symmetric encryption.
interface NaclEncrypted {
encrypted: Uint8Array;
nonce: Uint8Array;
}
function naclEncrypt(message: Uint8Array, secret: Uint8Array, nonce?: Uint8Array): NaclEncrypted;
function naclDecrypt(encrypted: Uint8Array, nonce: Uint8Array, secret: Uint8Array): Uint8Array | null;Network configuration constants for multi-chain support across Polkadot ecosystem.
const allNetworks: Network[];
const availableNetworks: Network[];
const selectableNetworks: Network[];interface Keypair {
/** The publicKey for this pair */
publicKey: Uint8Array;
/** The secretKey for this pair */
secretKey: Uint8Array;
}
interface Seedpair {
/** The publicKey for this pair */
publicKey: Uint8Array;
/** The seed used to construct the pair */
seed: Uint8Array;
}
/** The supported types of pairs */
type KeypairType = 'ed25519' | 'sr25519' | 'ecdsa' | 'ethereum';
interface VerifyResult {
/** The detected crypto interface, or 'none' if not detected */
crypto: 'none' | KeypairType;
/** The validity for this result, false if invalid */
isValid: boolean;
/** Flag to indicate if the passed data was wrapped in <Bytes>...</Bytes> */
isWrapped: boolean;
/** The extracted publicKey */
publicKey: Uint8Array;
}
interface DeriveJunction {
/** Chain code for derivation */
readonly chainCode: Uint8Array;
/** Whether this is a hard derivation */
readonly isHard: boolean;
/** Whether this is a soft derivation */
readonly isSoft: boolean;
}
interface ExtractResult {
derivePath: string;
password?: string;
path: DeriveJunction[];
phrase: string;
}
interface NaclEncrypted {
encrypted: Uint8Array;
nonce: Uint8Array;
}
type EncryptedJsonVersion = '0' | '1' | '2' | '3';
type EncryptedJsonEncoding = 'none' | 'scrypt' | 'xsalsa20-poly1305';
type Prefix = number;