@creit.tech/stellar-wallets-kit
Version:
A kit to handle all Stellar Wallets at once
1 lines • 15.1 kB
Source Map (JSON)
{"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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"}