@creit.tech/stellar-wallets-kit
Version:
A kit to handle all Stellar Wallets at once
1 lines • 13.4 kB
Source Map (JSON)
{"version":3,"file":"ledger.module.mjs","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":["result"],"mappings":"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"}