{"version":3,"file":"trezor.module.cjs","sources":["../../src/modules/trezor.module.ts"],"sourcesContent":["import TrezorConnect from '@trezor/connect-web';\nimport { transformTransaction } from '@trezor/connect-plugin-stellar';\nimport { Transaction } from '@stellar/stellar-base';\nimport { firstValueFrom } from 'rxjs';\n\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 { parseError } from '../utils';\nimport { StellarSelectorModal } from '../components/selector-modal/stellar-selector-modal';\n\nexport const TREZOR_ID = 'TREZOR';\n\nexport class TrezorModule implements ModuleInterface {\n  TrezorConnect: typeof TrezorConnect =\n    'default' in TrezorConnect ? (TrezorConnect.default as typeof TrezorConnect) : TrezorConnect;\n\n  private _isAvailable: boolean = false;\n\n  moduleType: ModuleType = ModuleType.HW_WALLET;\n\n  productId: string = TREZOR_ID;\n  productName: string = 'Trezor';\n  productUrl: string = 'https://www.trezor.com/';\n  productIcon: string = 'https://stellar.creit.tech/wallet-icons/trezor.png';\n\n  constructor(params: ITrezorModuleParams) {\n    this.TrezorConnect.init({\n      manifest: {\n        appUrl: params.appUrl,\n        email: params.email,\n      },\n      // More advanced options\n      debug: params.debug || false,\n      lazyLoad: params.lazyLoad || false,\n      coreMode: params.coreMode || 'auto',\n    }).then(() => {\n      console.log('Trezor is ready');\n      this._isAvailable = true;\n    });\n  }\n\n  async disconnect(): Promise<void> {\n    removeMnemonicPath();\n    removeHardwareWalletPaths();\n  }\n\n  /**\n   * `TrezorConnect` needs to be started before we can use it but because users most likely\n   * won't use their devices as soon as the site loads, we return `true` since it should be already started\n   * once the user needs to interact with it.\n   */\n  async isAvailable(): Promise<boolean> {\n    return true;\n  }\n\n  async runChecks(): Promise<void> {\n    if (!this._isAvailable) {\n      throw parseError(new Error('Trezor connection has not been started yet.'));\n    }\n  }\n\n  async getAddress(opts?: { path?: string }): Promise<{ address: string }> {\n    await this.runChecks();\n\n    try {\n      const mnemonicPath: string | undefined = opts?.path || (await firstValueFrom(mnemonicPath$));\n\n      if (!mnemonicPath) {\n        const result = await this.openAccountSelector();\n        return { address: result.publicKey };\n      } else {\n        const result = await this.TrezorConnect.stellarGetAddress({ path: mnemonicPath, showOnTrezor: false });\n        if (!result.success) {\n          throw parseError(new Error(result.payload.error));\n        }\n\n        return { address: result.payload.address };\n      }\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 startIndex: number = page * 10;\n    const bundle: { path: string; showOnTrezor: boolean }[] = new Array(10)\n      .fill(undefined)\n      .map((_, i): { path: string; showOnTrezor: boolean } => ({\n        path: `m/44'/148'/${i + startIndex}'`,\n        showOnTrezor: false,\n      }));\n\n    const result = await this.TrezorConnect.stellarGetAddress({ bundle });\n    if (!result.success) {\n      throw parseError(new Error(result.payload.error));\n    }\n\n    const results = result.payload.map((item, i) => ({\n      publicKey: item.address,\n      index: i + startIndex,\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    }\n  ): Promise<{ signedTxXdr: string; signerAddress?: string }> {\n    await this.runChecks();\n\n    let mnemonicPath: string | undefined;\n    let account: string;\n    if (opts?.path) {\n      mnemonicPath = opts.path;\n      const result = await this.TrezorConnect.stellarGetAddress({ path: mnemonicPath, showOnTrezor: false });\n      if (!result.success) {\n        throw new Error(result.payload.error);\n      }\n      account = result.payload.address;\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 parseError(new Error('This address has not been loaded from this device'));\n      mnemonicPath = `m/44'/148'/${target.index}'`;\n      account = target.publicKey;\n    } else {\n      mnemonicPath = await firstValueFrom(mnemonicPath$);\n      if (!mnemonicPath)\n        throw parseError(new Error('There is no path available, please call the `getAddress` method first.'));\n      const result = await this.TrezorConnect.stellarGetAddress({ path: mnemonicPath, showOnTrezor: false });\n      if (!result.success) {\n        throw new Error(result.payload.error);\n      }\n      account = result.payload.address;\n    }\n\n    const network: string | undefined = opts?.networkPassphrase || (await firstValueFrom(selectedNetwork$));\n    if (!network) throw parseError(new Error('You need to provide or set a network passphrase'));\n\n    const tx: Transaction = new Transaction(xdr, network);\n    const parsedTx = transformTransaction(mnemonicPath, tx);\n    const result = await this.TrezorConnect.stellarSignTransaction(parsedTx);\n\n    if (!result.success) {\n      throw parseError(new Error(result.payload.error));\n    }\n\n    tx.addSignature(account, Buffer.from(result.payload.signature, 'hex').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: 'Trezor Wallets do not support the \"signAuthEntry\" method',\n    };\n  }\n\n  async signMessage(): Promise<{ signedMessage: string; signerAddress?: string }> {\n    throw {\n      code: -3,\n      message: 'Trezor Wallets do not support the \"signMessage\" method',\n    };\n  }\n\n  async getNetwork(): Promise<{ network: string; networkPassphrase: string }> {\n    throw {\n      code: -3,\n      message: 'Trezor Wallets do not support the \"getNetwork\" method',\n    };\n  }\n}\n\n/**\n * These values are used to start the TrezorConnect library\n */\nexport interface ITrezorModuleParams {\n  appUrl: string;\n  email: string;\n  debug?: boolean;\n  lazyLoad?: boolean;\n  coreMode?: 'auto' | 'iframe' | 'popup';\n}\n"],"names":["ModuleType","removeMnemonicPath","removeHardwareWalletPaths","parseError","firstValueFrom","mnemonicPath$","setHardwareWalletPaths","setMnemonicPath","hardwareWalletPaths$","selectedNetwork$","Transaction","transformTransaction"],"mappings":"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"}