{"version":3,"file":"walletconnect.module.cjs","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":["ModuleType","SignClient","WalletConnectModal","parseError","WalletNetwork","WalletConnectTargetChain","WalletConnectAllowedMethods"],"mappings":"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"}