or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

decoding.mdindex.mdpubkey.mdregistry.mdsigning.mdwallets.md
tile.json

wallets.mddocs/

Wallet Management

Comprehensive wallet management system providing both hierarchical deterministic (HD) wallets with BIP39 mnemonic support and simple single-key wallets for Cosmos SDK blockchain interactions.

Capabilities

DirectSecp256k1HdWallet

Hierarchical deterministic wallet supporting BIP39 mnemonics and multiple accounts derived from a single seed.

/**
 * A wallet implementation that supports hierarchical deterministic key derivation
 * using BIP39 mnemonics and secp256k1 elliptic curve cryptography
 */
class DirectSecp256k1HdWallet implements OfflineDirectSigner {
  /**
   * Creates a wallet from a BIP39 mnemonic
   * @param mnemonic - BIP39 mnemonic phrase (12, 15, 18, 21, or 24 words)
   * @param options - Optional configuration for the wallet
   * @returns Promise resolving to DirectSecp256k1HdWallet instance
   */
  static fromMnemonic(
    mnemonic: string,
    options?: Partial<DirectSecp256k1HdWalletOptions>
  ): Promise<DirectSecp256k1HdWallet>;

  /**
   * Generates a new wallet with a random mnemonic
   * @param length - Mnemonic length in words (12, 15, 18, 21, or 24). Defaults to 12
   * @param options - Optional configuration for the wallet
   * @returns Promise resolving to DirectSecp256k1HdWallet instance
   */
  static generate(
    length?: 12 | 15 | 18 | 21 | 24,
    options?: Partial<DirectSecp256k1HdWalletOptions>
  ): Promise<DirectSecp256k1HdWallet>;

  /**
   * Deserializes an encrypted wallet from string format
   * @param serialization - Encrypted wallet serialization string
   * @param password - Password used for decryption
   * @returns Promise resolving to DirectSecp256k1HdWallet instance
   */
  static deserialize(
    serialization: string,
    password: string
  ): Promise<DirectSecp256k1HdWallet>;

  /**
   * Deserializes an encrypted wallet using a specific encryption key
   * @param serialization - Encrypted wallet serialization string
   * @param encryptionKey - Encryption key for decryption
   * @returns Promise resolving to DirectSecp256k1HdWallet instance
   */
  static deserializeWithEncryptionKey(
    serialization: string,
    encryptionKey: Uint8Array
  ): Promise<DirectSecp256k1HdWallet>;

  /**
   * Gets the mnemonic phrase for this wallet
   * @returns The BIP39 mnemonic phrase
   */
  get mnemonic(): string;

  /**
   * Gets all accounts derived from the wallet's mnemonic
   * @returns Promise resolving to array of account data
   */
  getAccounts(): Promise<readonly AccountData[]>;

  /**
   * Signs a transaction using direct signing mode
   * @param signerAddress - The address of the signer
   * @param signDoc - The signing document to sign
   * @returns Promise resolving to the signing response
   */
  signDirect(signerAddress: string, signDoc: SignDoc): Promise<DirectSignResponse>;

  /**
   * Serializes the wallet with password encryption
   * @param password - Password for encryption
   * @returns Promise resolving to encrypted serialization string
   */
  serialize(password: string): Promise<string>;

  /**
   * Serializes the wallet with a specific encryption key
   * @param encryptionKey - Encryption key for serialization
   * @param kdfConfiguration - KDF configuration for encryption
   * @returns Promise resolving to encrypted serialization string
   */
  serializeWithEncryptionKey(
    encryptionKey: Uint8Array,
    kdfConfiguration: KdfConfiguration
  ): Promise<string>;
}

interface DirectSecp256k1HdWalletOptions {
  /** Optional BIP39 passphrase for additional security */
  bip39Password?: string;
  /** Custom HD derivation paths. Defaults to [makeCosmoshubPath(0)] */
  hdPaths?: readonly HdPath[];
  /** Address prefix for bech32 encoding. Defaults to "cosmos" */
  prefix?: string;
}

Usage Examples:

import { DirectSecp256k1HdWallet, makeCosmoshubPath } from "@cosmjs/proto-signing";

// Create from existing mnemonic
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(
  "surround miss nominee dream gap cross assault thank captain prosper drop duty group candy wealth weather scale put",
  {
    prefix: "cosmos",
    hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1)], // Multiple accounts
  }
);

// Generate new wallet
const newWallet = await DirectSecp256k1HdWallet.generate(12, { prefix: "osmo" });

// Get accounts
const accounts = await wallet.getAccounts();
console.log(accounts[0].address); // cosmos1...

// Serialize for storage
const serialized = await wallet.serialize("password123");
const restored = await DirectSecp256k1HdWallet.deserialize(serialized, "password123");

DirectSecp256k1Wallet

Simple wallet holding a single secp256k1 keypair, ideal for applications that need basic signing functionality.

/**
 * A wallet that holds a single secp256k1 keypair
 * If you want to work with BIP39 mnemonics and multiple accounts, use DirectSecp256k1HdWallet
 */
class DirectSecp256k1Wallet implements OfflineDirectSigner {
  /**
   * Creates a DirectSecp256k1Wallet from a private key
   * @param privkey - The private key as Uint8Array
   * @param prefix - The bech32 address prefix. Defaults to "cosmos"
   * @returns Promise resolving to DirectSecp256k1Wallet instance
   */
  static fromKey(privkey: Uint8Array, prefix?: string): Promise<DirectSecp256k1Wallet>;

  /**
   * Gets the single account for this wallet
   * @returns Promise resolving to array containing one account
   */
  getAccounts(): Promise<readonly AccountData[]>;

  /**
   * Signs a transaction using direct signing mode
   * @param address - The signer address (must match this wallet's address)
   * @param signDoc - The signing document to sign
   * @returns Promise resolving to the signing response
   */
  signDirect(address: string, signDoc: SignDoc): Promise<DirectSignResponse>;
}

Usage Examples:

import { DirectSecp256k1Wallet } from "@cosmjs/proto-signing";
import { Random } from "@cosmjs/crypto";

// Create from existing private key
const privateKey = new Uint8Array([
  // 32 bytes of private key data
]);
const wallet = await DirectSecp256k1Wallet.fromKey(privateKey, "cosmos");

// Generate random wallet
const randomPrivkey = Random.getBytes(32);
const randomWallet = await DirectSecp256k1Wallet.fromKey(randomPrivkey, "osmo");

// Get account
const accounts = await wallet.getAccounts();
const signerAddress = accounts[0].address;

Utility Functions

/**
 * Extracts KDF configuration from a serialized wallet
 * @param serialization - Serialized wallet string
 * @returns KDF configuration object
 */
function extractKdfConfiguration(serialization: string): KdfConfiguration;

/**
 * Creates a Cosmos Hub derivation path
 * @param accountIndex - Zero-based account index
 * @returns HD path in format m/44'/118'/0'/0/accountIndex
 */
function makeCosmoshubPath(accountIndex: number): HdPath;

/**
 * Type guard to check if a signer supports direct signing
 * @param signer - The signer to check
 * @returns True if signer is an OfflineDirectSigner
 */
function isOfflineDirectSigner(signer: OfflineSigner): signer is OfflineDirectSigner;

/**
 * Executes a key derivation function (KDF) to derive an encryption key from a password
 * @param password - The password to derive the key from
 * @param configuration - KDF configuration specifying algorithm and parameters
 * @returns Promise resolving to derived encryption key
 */
function executeKdf(password: string, configuration: KdfConfiguration): Promise<Uint8Array>;

Types

interface AccountData {
  /** A printable address (typically bech32 encoded) */
  readonly address: string;
  readonly algo: Algo;
  readonly pubkey: Uint8Array;
}

interface DirectSignResponse {
  /**
   * The sign doc that was signed.
   * This may be different from the input signDoc when the signer modifies it as part of the signing process.
   */
  readonly signed: SignDoc;
  readonly signature: StdSignature;
}

interface OfflineDirectSigner {
  readonly getAccounts: () => Promise<readonly AccountData[]>;
  readonly signDirect: (signerAddress: string, signDoc: SignDoc) => Promise<DirectSignResponse>;
}

type Algo = "secp256k1" | "ed25519" | "sr25519";
type OfflineSigner = OfflineAminoSigner | OfflineDirectSigner;

interface KdfConfiguration {
  /** An algorithm identifier, such as "argon2id" */
  readonly algorithm: string;
  /** A map of algorithm-specific parameters */
  readonly params: Record<string, unknown>;
}