@creit.tech/stellar-wallets-kit
Version:
A kit to handle all Stellar Wallets at once
1 lines • 15.5 kB
Source Map (JSON)
{"version":3,"file":"walletconnect.module.mjs","sources":["../../src/modules/walletconnect.module.ts"],"sourcesContent":["import { WalletConnectModal } from '@walletconnect/modal';\nimport { SignClient } from '@walletconnect/sign-client';\nimport { ISignClient } from '@walletconnect/types/dist/types/sign-client/client';\nimport { SessionTypes } from '@walletconnect/types/dist/types/sign-client/session';\nimport { ModuleInterface, ModuleType, WalletNetwork } from '../types';\nimport { parseError } from '../utils';\n\nconst parseWalletConnectSession = (session: SessionTypes.Struct): IParsedWalletConnectSession => {\n const accounts = session.namespaces.stellar.accounts.map((account: string) => ({\n network: account.split(':')[1] as 'pubnet' | 'testnet',\n publicKey: account.split(':')[2],\n }));\n\n return {\n id: session.topic,\n name: session.peer.metadata.name,\n description: session.peer.metadata.description,\n url: session.peer.metadata.url,\n icons: session.peer.metadata.icons[0],\n accounts,\n };\n};\n\nexport interface IParsedWalletConnectSession {\n // \"id\" is the topic, we call it \"id\" to make it easier for those not familiarized with WalletConnect\n id: string;\n name: string;\n description: string;\n url: string;\n icons: string;\n accounts: Array<{\n network: 'pubnet' | 'testnet';\n publicKey: string;\n }>;\n}\n\nexport const WALLET_CONNECT_ID = 'wallet_connect';\n\nexport class WalletConnectModule implements ModuleInterface {\n moduleType: ModuleType = ModuleType.BRIDGE_WALLET;\n\n productId: string = WALLET_CONNECT_ID;\n productName: string = 'Wallet Connect';\n productUrl: string = 'https://walletconnect.com/';\n productIcon: string = 'https://stellar.creit.tech/wallet-icons/walletconnect.png';\n\n private client?: ISignClient & {\n on: (event: string, cb: (data: { topic: string }) => void) => void;\n };\n private activeSession?: string;\n private qrModal!: WalletConnectModal;\n\n async isAvailable(): Promise<boolean> {\n return true;\n }\n\n constructor(public wcParams: IWalletConnectConstructorParams) {\n if (wcParams.sessionId) {\n this.setSession(wcParams.sessionId);\n }\n\n if (wcParams.client && wcParams.modal) {\n this.client = wcParams.client as any;\n this.qrModal = wcParams.modal;\n } else {\n SignClient.init({\n projectId: wcParams.projectId,\n metadata: {\n name: wcParams.name,\n url: wcParams.url,\n description: wcParams.description,\n icons: wcParams.icons,\n },\n })\n .then(client => {\n console.log('WalletConnect is ready.');\n this.client = client as never;\n this.qrModal = new WalletConnectModal({ projectId: wcParams.projectId });\n\n if (wcParams.onSessionDeleted) {\n this.onSessionDeleted(wcParams.onSessionDeleted);\n }\n })\n .catch(console.error);\n }\n }\n\n async getAddress(): Promise<{ address: string }> {\n const runChecks = async () => {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n };\n\n return runChecks()\n .then(async (): Promise<{ address: string }> => {\n const targetSession: IParsedWalletConnectSession = await this.getTargetSession();\n return { address: targetSession.accounts[0].publicKey };\n })\n .catch(e => {\n throw parseError(e);\n });\n }\n\n async signTransaction(\n xdr: string,\n opts?: {\n networkPassphrase?: string;\n address?: string;\n path?: string;\n submit?: boolean;\n submitUrl?: string;\n }\n ): Promise<{ signedTxXdr: string; signerAddress?: string }> {\n const runChecks = async () => {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n };\n\n return runChecks()\n .then(async () => {\n const targetSession: IParsedWalletConnectSession = await this.getTargetSession({ publicKey: opts?.address });\n const signedTxXdr = await this.client!.request({\n topic: targetSession.id,\n chainId:\n opts?.networkPassphrase === WalletNetwork.PUBLIC\n ? WalletConnectTargetChain.PUBLIC\n : WalletConnectTargetChain.TESTNET,\n request: {\n method: this.wcParams.method,\n params: { xdr },\n },\n }).then((v: any) => v.signedXDR);\n\n return { signedTxXdr };\n })\n .catch(e => {\n throw parseError(e);\n });\n }\n\n async signAuthEntry(): Promise<{ signedAuthEntry: string; signerAddress?: string }> {\n throw {\n code: -3,\n message: 'WalletConnect does not support the \"signAuthEntry\" function',\n };\n }\n\n async signMessage(): Promise<{ signedMessage: string; signerAddress?: string }> {\n throw {\n code: -3,\n message: 'WalletConnect does not support the \"signMessage\" function',\n };\n }\n\n async getNetwork(): Promise<{ network: string; networkPassphrase: string }> {\n throw {\n code: -3,\n message: 'WalletConnect does not support the \"getNetwork\" function',\n };\n }\n\n /**\n * Allows manually setting the current active session to be used in the kit when doing WalletConnect requests\n *\n * @param sessionId The session ID is a placeholder for the session \"topic\", term used in WalletConnect\n * */\n public setSession(sessionId: string) {\n this.activeSession = sessionId;\n }\n\n public onSessionDeleted(cb: (sessionId: string) => void) {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n\n this.client.on('session_delete', data => {\n cb(data.topic);\n });\n }\n\n public async connectWalletConnect(): Promise<IParsedWalletConnectSession> {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n\n try {\n const { uri, approval } = await this.client.connect({\n requiredNamespaces: {\n stellar: {\n methods: [this.wcParams.method],\n chains: [\n this.wcParams.network === WalletNetwork.PUBLIC\n ? WalletConnectTargetChain.PUBLIC\n : WalletConnectTargetChain.TESTNET,\n ],\n events: [],\n },\n },\n });\n const session: IParsedWalletConnectSession = await new Promise<SessionTypes.Struct>((resolve, reject) => {\n // Open QRCode modal if a URI was returned (i.e. we're not connecting an existing pairing).\n if (uri) {\n this.qrModal.openModal({ uri });\n }\n\n // Await session approval from the wallet.\n approval()\n .then(session => {\n this.qrModal.closeModal();\n resolve(session);\n })\n .catch(error => {\n this.qrModal.closeModal();\n reject(error);\n });\n }).then(parseWalletConnectSession);\n\n this.setSession(session.id);\n return session;\n } catch (e: unknown) {\n this.qrModal.closeModal();\n console.error(e);\n throw new Error('There was an error when trying to connect');\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n\n const sessions: IParsedWalletConnectSession[] = await this.getSessions();\n for (const session of sessions) {\n await this.closeSession(session.id);\n }\n }\n\n public async closeSession(sessionId: string, reason?: string): Promise<void> {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n\n await this.client.disconnect({\n topic: sessionId,\n reason: {\n message: reason || 'Session closed',\n code: -1,\n },\n });\n }\n\n public async getSessions(): Promise<IParsedWalletConnectSession[]> {\n if (!this.client) {\n throw new Error('WalletConnect is not running yet');\n }\n\n return this.client.session.values.map(parseWalletConnectSession);\n }\n\n private async getTargetSession(params?: { publicKey?: string }): Promise<IParsedWalletConnectSession> {\n const activeSessions: IParsedWalletConnectSession[] = await this.getSessions();\n let targetSession: IParsedWalletConnectSession | undefined = activeSessions.find(\n (session: IParsedWalletConnectSession): boolean =>\n session.id === this.activeSession || !!session.accounts.find(a => a.publicKey === params?.publicKey)\n );\n\n if (!targetSession) {\n targetSession = await this.connectWalletConnect();\n }\n\n return targetSession;\n }\n}\n\nexport interface IWalletConnectConstructorParams {\n projectId: string;\n name: string;\n description: string;\n url: string;\n icons: string[];\n method: WalletConnectAllowedMethods;\n network: WalletNetwork;\n sessionId?: string;\n client?: typeof SignClient;\n modal?: WalletConnectModal;\n onSessionDeleted?: (sessionId: string) => void;\n}\n\nexport enum WalletConnectTargetChain {\n PUBLIC = 'stellar:pubnet',\n TESTNET = 'stellar:testnet',\n}\n\nexport enum WalletConnectAllowedMethods {\n SIGN = 'stellar_signXDR',\n SIGN_AND_SUBMIT = 'stellar_signAndSubmitXDR',\n}\n"],"names":["session","WalletConnectTargetChain","WalletConnectAllowedMethods"],"mappings":"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"}