Skip to main content
Generate mnemonics, derive seeds, and create hierarchical key trees.
import { HDWalletService } from 'voltaire-effect/crypto'
import { HDWalletLive } from 'voltaire-effect/native'
import { mnemonicToWords } from 'voltaire-effect/crypto/Bip39'
import { Effect } from 'effect'

const wallet = await Effect.runPromise(
  Effect.gen(function* () {
    const hdwallet = yield* HDWalletService
    const mnemonic = yield* hdwallet.generateMnemonic(256)  // 24 words
    const seed = yield* hdwallet.mnemonicToSeed(mnemonicToWords(mnemonic))
    const root = yield* hdwallet.fromSeed(seed)
    const account = yield* hdwallet.derive(root, "m/44'/60'/0'/0/0")
    const privateKey = yield* hdwallet.getPrivateKey(account)
    return { mnemonic, privateKey }
  }).pipe(Effect.provide(HDWalletLive))
)

Derivation Paths

Standard Ethereum: m/44'/60'/0'/0/{index}

Testing

import { HDWalletTest } from 'voltaire-effect/crypto'
myProgram.pipe(Effect.provide(HDWalletTest))
// Returns deterministic 'abandon abandon ... about' mnemonic

Interface

interface HDWalletServiceShape {
  readonly generateMnemonic: (strength?: MnemonicStrength) => Effect.Effect<string>
  readonly mnemonicToSeed: (mnemonic: string[]) => Effect.Effect<Uint8Array>
  readonly fromSeed: (seed: Uint8Array) => Effect.Effect<HDNode>
  readonly derive: (node: HDNode, path: string | HDPath) => Effect.Effect<HDNode>
  readonly getPrivateKey: (node: HDNode) => Effect.Effect<Uint8Array | null>
  readonly getPublicKey: (node: HDNode) => Effect.Effect<Uint8Array | null>
}