{
  "version": 3,
  "sources": ["../../src/HDWallet.ts"],
  "sourcesContent": ["import { generateMnemonic } from '@scure/bip39'\nimport { wordlist as englishWordlist } from '@scure/bip39/wordlists/english.js'\nimport type { Hex } from '@xylabs/sdk-js'\nimport {\n  asAddress, assertEx, globallyUnique, hexFromHexString, staticImplements, toUint8Array,\n} from '@xylabs/sdk-js'\nimport { Account, PrivateKey } from '@xyo-network/account'\nimport type { AccountConfig } from '@xyo-network/account-model'\nimport {\n  isMnemonicInitializationConfig,\n  isPhraseInitializationConfig,\n  isPrivateKeyInitializationConfig,\n} from '@xyo-network/account-model'\nimport type { XyoAddress } from '@xyo-network/address'\nimport type { PrivateKeyInstance } from '@xyo-network/key-model'\nimport type { WalletInstance, WalletStatic } from '@xyo-network/wallet-model'\nimport {\n  defaultPath, HDNodeWallet, Mnemonic,\n} from 'ethers'\n\n@staticImplements<WalletStatic>()\nexport class HDWallet extends Account implements WalletInstance {\n  static override readonly uniqueName = globallyUnique('HDWallet', HDWallet, 'xyo')\n  protected static override _addressMap: Record<XyoAddress, WeakRef<WalletInstance>> = {}\n\n  protected readonly node: HDNodeWallet\n\n  neuter: () => HDWallet = () => {\n    this.node.neuter()\n    return this\n  }\n\n  constructor(\n    key: symbol,\n    node: HDNodeWallet,\n    privateKey: PrivateKeyInstance,\n  ) {\n    super(key, privateKey)\n    this.node = node\n  }\n\n  protected static async createFromNodeInternal(node: HDNodeWallet, previousHash?: string): Promise<WalletInstance> {\n    const privateKey = toUint8Array(node.privateKey.replace('0x', ''))\n    assertEx(privateKey.length === 32, () => `Private key must be 32 bytes [${privateKey?.length}]`)\n    const key = await PrivateKey.create(privateKey.buffer)\n    const wallet = new HDWallet(super._protectedConstructorKey, node, key)\n    const newWallet = await wallet.loadPreviousHash(previousHash)\n    return this._addressMap[newWallet.address]?.deref() ?? newWallet\n  }\n\n  protected static getCachedWalletOrCacheNewWallet(createdWallet: WalletInstance): WalletInstance {\n    const existingWallet = this._addressMap[createdWallet.address]?.deref()\n    if (existingWallet) {\n      return existingWallet\n    }\n    const ref = new WeakRef(createdWallet)\n    this._addressMap[createdWallet.address] = ref\n    return createdWallet\n  }\n\n  static override async create(opts?: AccountConfig): Promise<WalletInstance> {\n    if (isPhraseInitializationConfig(opts)) {\n      return await this.fromPhrase(opts.phrase)\n    }\n    if (isMnemonicInitializationConfig(opts)) {\n      return await this.fromPhrase(opts.mnemonic, opts.path)\n    }\n    if (isPrivateKeyInitializationConfig(opts)) {\n      throw new Error('Invalid initialization config. from privateKey not supported.  Use Account.fromPrivateKey instead.')\n    }\n    throw new Error('Invalid initialization config')\n  }\n\n  static async createFromNode(node: HDNodeWallet, previousHash?: string): Promise<WalletInstance> {\n    return await this.createFromNodeInternal(node, previousHash)\n  }\n\n  static async fromExtendedKey(key: string): Promise<WalletInstance> {\n    const node = HDNodeWallet.fromExtendedKey(key)\n    /* TODO: Handle HDNodeVoidWallet */\n    return await this.createFromNode(node as HDNodeWallet)\n  }\n\n  static async fromMnemonic(mnemonic: Mnemonic, path: string = defaultPath): Promise<WalletInstance> {\n    const node = HDNodeWallet.fromMnemonic(mnemonic, path)\n    const createdWallet = await this.createFromNodeInternal(node)\n    return this.getCachedWalletOrCacheNewWallet(createdWallet)\n  }\n\n  static async fromPhrase(phrase: string, path: string = defaultPath): Promise<WalletInstance> {\n    return await this.fromMnemonic(Mnemonic.fromPhrase(phrase), path)\n  }\n\n  static async fromSeed(seed: string | ArrayBufferLike): Promise<WalletInstance> {\n    const node = HDNodeWallet.fromSeed(toUint8Array(seed))\n    const createdWallet = await this.createFromNodeInternal(node)\n    return this.getCachedWalletOrCacheNewWallet(createdWallet)\n  }\n\n  static generateMnemonic(wordlist: string[] = englishWordlist, strength = 256): string {\n    return generateMnemonic(wordlist, strength)\n  }\n\n  static override async random(): Promise<WalletInstance> {\n    return await this.fromMnemonic(Mnemonic.fromPhrase(this.generateMnemonic()))\n  }\n\n  override get address(): XyoAddress {\n    return asAddress(hexFromHexString(this.node.address, { prefix: false }), true)\n  }\n\n  override get addressBytes(): ArrayBufferLike {\n    return toUint8Array(this.address, undefined, 16).buffer\n  }\n\n  get chainCode(): string {\n    return this.node.chainCode\n  }\n\n  get depth(): number {\n    return this.node.depth\n  }\n\n  get extendedKey(): string {\n    return this.node.extendedKey\n  }\n\n  get fingerprint(): string {\n    return this.node.fingerprint\n  }\n\n  get index(): number {\n    return this.node.index\n  }\n\n  get mnemonic(): Mnemonic | null {\n    return this.node.mnemonic\n  }\n\n  get parentFingerprint(): string {\n    return this.node.parentFingerprint\n  }\n\n  get path(): string | null {\n    return this.node.path\n  }\n\n  get privateKey(): Hex {\n    return this.node.privateKey.toLowerCase() as Hex\n  }\n\n  get publicKey(): Hex {\n    return this.node.publicKey.toLowerCase() as Hex\n  }\n\n  async derivePath(path: string): Promise<WalletInstance> {\n    // if an absolute path, check if it matches the parent root and work with it\n    if (path.startsWith('m/')) {\n      const parentPath = this.path\n      if (parentPath !== null && path.startsWith(parentPath)) {\n        const childPath = path.slice(parentPath.length + 1)\n        return await HDWallet.createFromNode(this.node.derivePath(childPath))\n      }\n      throw new Error(`Invalid absolute path ${path} for wallet with path ${parentPath}`)\n    }\n    return await HDWallet.createFromNode(this.node.derivePath(path))\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
