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