{"version":3,"file":"ledger.module.cjs","sources":["../../src/modules/ledger.module.ts"],"sourcesContent":["import Str from '@ledgerhq/hw-app-str';\nimport Transport from '@ledgerhq/hw-transport';\nimport TransportWebUSB from '@ledgerhq/hw-transport-webusb';\nimport { Buffer } from 'buffer';\nimport { firstValueFrom } from 'rxjs';\nimport { StellarSelectorModal } from '../components/selector-modal/stellar-selector-modal';\nimport {\n  hardwareWalletPaths$,\n  mnemonicPath$,\n  removeHardwareWalletPaths,\n  removeMnemonicPath,\n  selectedNetwork$,\n  setHardwareWalletPaths,\n  setMnemonicPath,\n} from '../state/store';\nimport { ModuleInterface, ModuleType } from '../types';\nimport { StrKey } from '@stellar/stellar-base';\nimport { parseError } from '../utils';\nimport { Transaction } from '@stellar/stellar-base';\n\nexport const LEDGER_ID = 'LEDGER';\n\nexport class LedgerModule implements ModuleInterface {\n  moduleType: ModuleType = ModuleType.HW_WALLET;\n\n  productId: string = LEDGER_ID;\n  productName: string = 'Ledger';\n  productUrl: string = 'https://www.ledger.com/';\n  productIcon: string = 'https://stellar.creit.tech/wallet-icons/ledger.png';\n\n  private _transport?: Transport;\n  async transport() {\n    if (!(await TransportWebUSB.isSupported())) throw new Error('Ledger can not be used with this device.');\n\n    if (!this._transport) {\n      this._transport = await TransportWebUSB.create();\n    }\n\n    return this._transport;\n  }\n\n  async disconnect(): Promise<void> {\n    removeMnemonicPath();\n    removeHardwareWalletPaths();\n    this._transport?.close();\n    this._transport = undefined;\n  }\n\n  /**\n   * This always return true because in theory ledgers aren't supposed\n   * to be connected at all time\n   */\n  async isAvailable(): Promise<boolean> {\n    return TransportWebUSB.isSupported();\n  }\n\n  async runChecks(): Promise<void> {\n    if (!(await this.isAvailable())) {\n      throw new Error('Ledger wallets can not be used');\n    }\n  }\n\n  async getAddress(opts?: { path?: string }): Promise<{ address: string }> {\n    await this.runChecks();\n\n    try {\n      const finalTransport: Transport = await this.transport();\n      const str = new Str(finalTransport);\n\n      let mnemonicPath: string | undefined = opts?.path || (await firstValueFrom(mnemonicPath$));\n\n      if (!mnemonicPath) {\n        await this.openAccountSelector();\n        mnemonicPath = await firstValueFrom(mnemonicPath$);\n      }\n\n      const result: { rawPublicKey: Buffer } = await str.getPublicKey(mnemonicPath!);\n      return { address: StrKey.encodeEd25519PublicKey(result.rawPublicKey) };\n    } catch (e) {\n      throw parseError(e);\n    }\n  }\n\n  /**\n   * This method is used by the Wallets Kit itself, if you're a dApp developer, most likely you don't need to use this method.\n   * @param page - {Number}\n   */\n  async getAddresses(page: number = 0): Promise<{ publicKey: string; index: number }[]> {\n    const finalTransport: Transport = await this.transport();\n    const str = new Str(finalTransport);\n    const startIndex: number = page * 10;\n    const results: { publicKey: string; index: number }[] = [];\n\n    for (let i = 0; i < 10; i++) {\n      const result: { rawPublicKey: Buffer } = await str.getPublicKey(`44'/148'/${i + startIndex}'`);\n      results.push({\n        publicKey: StrKey.encodeEd25519PublicKey(result.rawPublicKey),\n        index: i + startIndex,\n      });\n    }\n\n    setHardwareWalletPaths(results);\n\n    return results;\n  }\n\n  /**\n   * This method is used by the Wallets Kit itself, if you're a dApp developer, most likely you don't need to use this method.\n   */\n  async openAccountSelector(): Promise<{ publicKey: string; index: number }> {\n    return new Promise((resolve, reject) => {\n      const el = document.createElement('stellar-accounts-selector') as StellarSelectorModal;\n      el.setAttribute('showModal', '');\n      el.setAttribute('loadingAccounts', '');\n      document.body.appendChild(el);\n\n      this.getAddresses()\n        .then(addressesData => {\n          el.setAttribute('accounts', JSON.stringify(addressesData));\n          el.removeAttribute('loadingAccounts');\n        })\n        .catch(err => {\n          el.remove();\n          reject(err);\n        });\n\n      const listener = (event: CustomEvent) => {\n        const { publicKey, index } = event.detail as { publicKey: string; index: number };\n        setMnemonicPath(`44'/148'/${index}'`);\n        resolve({ publicKey, index });\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        el.removeEventListener('account-selected', listener, false);\n        document.body.removeChild(el);\n      };\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      el.addEventListener('account-selected', listener, false);\n\n      const errorListener = (event: CustomEvent) => {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        el.removeEventListener('account-selected', listener, false);\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        el.removeEventListener('account-selector-closed', errorListener, false);\n        document.body.removeChild(el);\n        reject(event.detail);\n      };\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      el.addEventListener('account-selector-closed', errorListener, false);\n    });\n  }\n\n  async signTransaction(\n    xdr: string,\n    opts?: {\n      networkPassphrase?: string;\n      address?: string;\n      path?: string;\n      nonBlindTx?: boolean;\n    }\n  ): Promise<{ signedTxXdr: string; signerAddress?: string }> {\n    await this.runChecks();\n    const finalTransport: Transport = await this.transport();\n    const str = new Str(finalTransport);\n\n    let mnemonicPath: string | undefined;\n    let account: string;\n    if (opts?.path) {\n      mnemonicPath = opts.path;\n      const result: { rawPublicKey: Buffer } = await str.getPublicKey(mnemonicPath);\n      account = StrKey.encodeEd25519PublicKey(result.rawPublicKey);\n    } else if (opts?.address) {\n      const paths = await firstValueFrom(hardwareWalletPaths$);\n      const target = paths.find(p => p.publicKey === opts.address);\n      if (!target) throw new Error('This address has not been loaded from this ledger');\n      mnemonicPath = `44'/148'/${target.index}'`;\n      account = target.publicKey;\n    } else {\n      mnemonicPath = await firstValueFrom(mnemonicPath$);\n      if (!mnemonicPath) throw new Error('There is no path available, please call the `getAddress` method first.');\n      const result: { rawPublicKey: Buffer } = await str.getPublicKey(mnemonicPath);\n      account = StrKey.encodeEd25519PublicKey(result.rawPublicKey);\n    }\n\n    const network: string | undefined = opts?.networkPassphrase || (await firstValueFrom(selectedNetwork$));\n    if (!network) throw new Error('You need to provide or set a network passphrase');\n\n    const tx: Transaction = new Transaction(xdr, network);\n\n    const result: { signature: Buffer } = opts?.nonBlindTx\n      ? await str.signTransaction(mnemonicPath, tx.signatureBase())\n      : await str.signHash(mnemonicPath, tx.hash());\n\n    tx.addSignature(account, result.signature.toString('base64'));\n\n    return {\n      signedTxXdr: tx.toXDR(),\n      signerAddress: account,\n    };\n  }\n\n  async signAuthEntry(): Promise<{ signedAuthEntry: string; signerAddress?: string }> {\n    throw {\n      code: -3,\n      message: 'Ledger Wallets do not support the \"signAuthEntry\" function',\n    };\n  }\n\n  async signMessage(): Promise<{ signedMessage: string; signerAddress?: string }> {\n    throw {\n      code: -3,\n      message: 'Ledger Wallets do not support the \"signMessage\" function',\n    };\n  }\n\n  async getNetwork(): Promise<{ network: string; networkPassphrase: string }> {\n    throw {\n      code: -3,\n      message: 'Ledger Wallets do not support the \"getNetwork\" function',\n    };\n  }\n}\n"],"names":["ModuleType","removeMnemonicPath","removeHardwareWalletPaths","firstValueFrom","mnemonicPath$","StrKey","parseError","setHardwareWalletPaths","setMnemonicPath","hardwareWalletPaths$","selectedNetwork$","Transaction"],"mappings":"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"}