@creit.tech/stellar-wallets-kit
Version:
A kit to handle all Stellar Wallets at once
1 lines • 14.9 kB
Source Map (JSON)
{"version":3,"file":"trezor.module.mjs","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":["result"],"mappings":";;;;;;;;AAkBO,MAAM,SAAY,GAAA;AAElB,MAAM,YAAwC,CAAA;AAAA,EAanD,YAAY,MAA6B,EAAA;AAZzC,IACE,IAAA,CAAA,aAAA,GAAA,SAAA,IAAa,aAAiB,GAAA,aAAA,CAAc,OAAmC,GAAA,aAAA;AAEjF,IAAA,IAAA,CAAQ,YAAwB,GAAA,KAAA;AAEhC,IAAA,IAAA,CAAA,UAAA,GAAyB,UAAW,CAAA,SAAA;AAEpC,IAAoB,IAAA,CAAA,SAAA,GAAA,SAAA;AACpB,IAAsB,IAAA,CAAA,WAAA,GAAA,QAAA;AACtB,IAAqB,IAAA,CAAA,UAAA,GAAA,yBAAA;AACrB,IAAsB,IAAA,CAAA,WAAA,GAAA,oDAAA;AAGpB,IAAA,IAAA,CAAK,cAAc,IAAK,CAAA;AAAA,MACtB,QAAU,EAAA;AAAA,QACR,QAAQ,MAAO,CAAA,MAAA;AAAA,QACf,OAAO,MAAO,CAAA;AAAA,OAChB;AAAA;AAAA,MAEA,KAAA,EAAO,OAAO,KAAS,IAAA,KAAA;AAAA,MACvB,QAAA,EAAU,OAAO,QAAY,IAAA,KAAA;AAAA,MAC7B,QAAA,EAAU,OAAO,QAAY,IAAA;AAAA,KAC9B,CAAE,CAAA,IAAA,CAAK,MAAM;AACZ,MAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,MAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AAAA,KACrB,CAAA;AAAA;AACH,EAEA,MAAM,UAA4B,GAAA;AAChC,IAAmB,kBAAA,EAAA;AACnB,IAA0B,yBAAA,EAAA;AAAA;AAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAgC,GAAA;AACpC,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAM,SAA2B,GAAA;AAC/B,IAAI,IAAA,CAAC,KAAK,YAAc,EAAA;AACtB,MAAA,MAAM,UAAW,CAAA,IAAI,KAAM,CAAA,6CAA6C,CAAC,CAAA;AAAA;AAC3E;AACF,EAEA,MAAM,WAAW,IAAwD,EAAA;AACvE,IAAA,MAAM,KAAK,SAAU,EAAA;AAErB,IAAI,IAAA;AACF,MAAA,MAAM,YAAmC,GAAA,IAAA,EAAM,IAAS,IAAA,MAAM,eAAe,aAAa,CAAA;AAE1F,MAAA,IAAI,CAAC,YAAc,EAAA;AACjB,QAAM,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAoB,EAAA;AAC9C,QAAO,OAAA,EAAE,OAAS,EAAA,MAAA,CAAO,SAAU,EAAA;AAAA,OAC9B,MAAA;AACL,QAAM,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,aAAc,CAAA,iBAAA,CAAkB,EAAE,IAAM,EAAA,YAAA,EAAc,YAAc,EAAA,KAAA,EAAO,CAAA;AACrG,QAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,UAAA,MAAM,WAAW,IAAI,KAAA,CAAM,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGlD,QAAA,OAAO,EAAE,OAAA,EAAS,MAAO,CAAA,OAAA,CAAQ,OAAQ,EAAA;AAAA;AAC3C,aACO,CAAG,EAAA;AACV,MAAA,MAAM,WAAW,CAAC,CAAA;AAAA;AACpB;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAa,CAAA,IAAA,GAAe,CAAoD,EAAA;AACpF,IAAA,MAAM,aAAqB,IAAO,GAAA,EAAA;AAClC,IAAM,MAAA,MAAA,GAAoD,IAAI,KAAA,CAAM,EAAE,CAAA,CACnE,IAAK,CAAA,KAAA,CAAS,CACd,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAgD,MAAA;AAAA,MACvD,IAAA,EAAM,CAAc,WAAA,EAAA,CAAA,GAAI,UAAU,CAAA,CAAA,CAAA;AAAA,MAClC,YAAc,EAAA;AAAA,KACd,CAAA,CAAA;AAEJ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,cAAc,iBAAkB,CAAA,EAAE,QAAQ,CAAA;AACpE,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,MAAA,MAAM,WAAW,IAAI,KAAA,CAAM,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGlD,IAAA,MAAM,UAAU,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAM,CAAO,MAAA;AAAA,MAC/C,WAAW,IAAK,CAAA,OAAA;AAAA,MAChB,OAAO,CAAI,GAAA;AAAA,KACX,CAAA,CAAA;AAEF,IAAA,sBAAA,CAAuB,OAAO,CAAA;AAE9B,IAAO,OAAA,OAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAqE,GAAA;AACzE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAM,MAAA,EAAA,GAAK,QAAS,CAAA,aAAA,CAAc,2BAA2B,CAAA;AAC7D,MAAG,EAAA,CAAA,YAAA,CAAa,aAAa,EAAE,CAAA;AAC/B,MAAG,EAAA,CAAA,YAAA,CAAa,mBAAmB,EAAE,CAAA;AACrC,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AAE5B,MAAK,IAAA,CAAA,YAAA,EACF,CAAA,IAAA,CAAK,CAAiB,aAAA,KAAA;AACrB,QAAA,EAAA,CAAG,YAAa,CAAA,UAAA,EAAY,IAAK,CAAA,SAAA,CAAU,aAAa,CAAC,CAAA;AACzD,QAAA,EAAA,CAAG,gBAAgB,iBAAiB,CAAA;AAAA,OACrC,CACA,CAAA,KAAA,CAAM,CAAO,GAAA,KAAA;AACZ,QAAA,EAAA,CAAG,MAAO,EAAA;AACV,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,OACX,CAAA;AAEH,MAAM,MAAA,QAAA,GAAW,CAAC,KAAuB,KAAA;AACvC,QAAA,MAAM,EAAE,SAAA,EAAW,KAAM,EAAA,GAAI,KAAM,CAAA,MAAA;AACnC,QAAgB,eAAA,CAAA,CAAA,SAAA,EAAY,KAAK,CAAG,CAAA,CAAA,CAAA;AACpC,QAAQ,OAAA,CAAA,EAAE,SAAW,EAAA,KAAA,EAAO,CAAA;AAG5B,QAAG,EAAA,CAAA,mBAAA,CAAoB,kBAAoB,EAAA,QAAA,EAAU,KAAK,CAAA;AAC1D,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,OAC9B;AAGA,MAAG,EAAA,CAAA,gBAAA,CAAiB,kBAAoB,EAAA,QAAA,EAAU,KAAK,CAAA;AAEvD,MAAM,MAAA,aAAA,GAAgB,CAAC,KAAuB,KAAA;AAG5C,QAAG,EAAA,CAAA,mBAAA,CAAoB,kBAAoB,EAAA,QAAA,EAAU,KAAK,CAAA;AAG1D,QAAG,EAAA,CAAA,mBAAA,CAAoB,yBAA2B,EAAA,aAAA,EAAe,KAAK,CAAA;AACtE,QAAS,QAAA,CAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AAC5B,QAAA,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,OACrB;AAGA,MAAG,EAAA,CAAA,gBAAA,CAAiB,yBAA2B,EAAA,aAAA,EAAe,KAAK,CAAA;AAAA,KACpE,CAAA;AAAA;AACH,EAEA,MAAM,eACJ,CAAA,GAAA,EACA,IAK0D,EAAA;AAC1D,IAAA,MAAM,KAAK,SAAU,EAAA;AAErB,IAAI,IAAA,YAAA;AACJ,IAAI,IAAA,OAAA;AACJ,IAAA,IAAI,MAAM,IAAM,EAAA;AACd,MAAA,YAAA,GAAe,IAAK,CAAA,IAAA;AACpB,MAAMA,MAAAA,OAAAA,GAAS,MAAM,IAAA,CAAK,aAAc,CAAA,iBAAA,CAAkB,EAAE,IAAM,EAAA,YAAA,EAAc,YAAc,EAAA,KAAA,EAAO,CAAA;AACrG,MAAI,IAAA,CAACA,QAAO,OAAS,EAAA;AACnB,QAAA,MAAM,IAAI,KAAA,CAAMA,OAAO,CAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AAEtC,MAAA,OAAA,GAAUA,QAAO,OAAQ,CAAA,OAAA;AAAA,KAC3B,MAAA,IAAW,MAAM,OAAS,EAAA;AACxB,MAAM,MAAA,KAAA,GAAQ,MAAM,cAAA,CAAe,oBAAoB,CAAA;AACvD,MAAA,MAAM,SAAS,KAAM,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,SAAA,KAAc,KAAK,OAAO,CAAA;AAC3D,MAAA,IAAI,CAAC,MAAQ,EAAA,MAAM,WAAW,IAAI,KAAA,CAAM,mDAAmD,CAAC,CAAA;AAC5F,MAAe,YAAA,GAAA,CAAA,WAAA,EAAc,OAAO,KAAK,CAAA,CAAA,CAAA;AACzC,MAAA,OAAA,GAAU,MAAO,CAAA,SAAA;AAAA,KACZ,MAAA;AACL,MAAe,YAAA,GAAA,MAAM,eAAe,aAAa,CAAA;AACjD,MAAA,IAAI,CAAC,YAAA;AACH,QAAA,MAAM,UAAW,CAAA,IAAI,KAAM,CAAA,wEAAwE,CAAC,CAAA;AACtG,MAAMA,MAAAA,OAAAA,GAAS,MAAM,IAAA,CAAK,aAAc,CAAA,iBAAA,CAAkB,EAAE,IAAM,EAAA,YAAA,EAAc,YAAc,EAAA,KAAA,EAAO,CAAA;AACrG,MAAI,IAAA,CAACA,QAAO,OAAS,EAAA;AACnB,QAAA,MAAM,IAAI,KAAA,CAAMA,OAAO,CAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AAEtC,MAAA,OAAA,GAAUA,QAAO,OAAQ,CAAA,OAAA;AAAA;AAG3B,IAAA,MAAM,OAA8B,GAAA,IAAA,EAAM,iBAAsB,IAAA,MAAM,eAAe,gBAAgB,CAAA;AACrG,IAAA,IAAI,CAAC,OAAS,EAAA,MAAM,WAAW,IAAI,KAAA,CAAM,iDAAiD,CAAC,CAAA;AAE3F,IAAA,MAAM,EAAkB,GAAA,IAAI,WAAY,CAAA,GAAA,EAAK,OAAO,CAAA;AACpD,IAAM,MAAA,QAAA,GAAW,oBAAqB,CAAA,YAAA,EAAc,EAAE,CAAA;AACtD,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,uBAAuB,QAAQ,CAAA;AAEvE,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,MAAA,MAAM,WAAW,IAAI,KAAA,CAAM,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGlD,IAAG,EAAA,CAAA,YAAA,CAAa,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,MAAA,CAAO,OAAQ,CAAA,SAAA,EAAW,KAAK,CAAA,CAAE,QAAS,CAAA,QAAQ,CAAC,CAAA;AAExF,IAAO,OAAA;AAAA,MACL,WAAA,EAAa,GAAG,KAAM,EAAA;AAAA,MACtB,aAAe,EAAA;AAAA,KACjB;AAAA;AACF,EAEA,MAAM,aAA8E,GAAA;AAClF,IAAM,MAAA;AAAA,MACJ,IAAM,EAAA,CAAA,CAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACX;AAAA;AACF,EAEA,MAAM,WAA0E,GAAA;AAC9E,IAAM,MAAA;AAAA,MACJ,IAAM,EAAA,CAAA,CAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACX;AAAA;AACF,EAEA,MAAM,UAAsE,GAAA;AAC1E,IAAM,MAAA;AAAA,MACJ,IAAM,EAAA,CAAA,CAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACX;AAAA;AAEJ;;;;"}