{"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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"}