{
  "version": 3,
  "sources": ["../../../../src/providers/strategies/WalletConnectProviderStrategy/WalletConnectProviderStrategy.ts"],
  "sourcesContent": ["import {\n  SessionEventTypes,\n  SessionTypes,\n  OptionalOperation\n} from '@multiversx/sdk-wallet-connect-provider/out';\nimport { providerLabels } from 'constants/providerFactory.constants';\nimport { fallbackWalletConnectConfigurations } from 'constants/walletConnect.constants';\nimport { Message, Transaction } from 'lib/sdkCore';\nimport { IDAppProviderAccount } from 'lib/sdkDappUtils';\nimport { WalletConnectStateManager } from 'managers/internal/WalletConnectStateManager/WalletConnectStateManager';\nimport { getIsLoggedIn } from 'methods/account/getIsLoggedIn';\nimport { SignTransactionsOptionsType } from 'providers/DappProvider/helpers/signTransactions/signTransactionsWithProvider';\nimport {\n  ProviderTypeEnum,\n  ProviderType\n} from 'providers/types/providerFactory.types';\nimport { logoutAction } from 'store/actions/sharedActions/sharedActions';\nimport { nativeAuthConfigSelector } from 'store/selectors/configSelectors';\nimport { chainIdSelector } from 'store/selectors/networkSelectors';\nimport { getState } from 'store/store';\nimport { ProviderErrorsEnum } from 'types/provider.types';\nimport {\n  WalletConnectOptionalMethodsEnum,\n  WalletConnectV2Provider\n} from 'utils/walletconnect/__sdkWalletconnectProvider';\nimport { WalletConnectV2Error, WalletConnectConfig } from './types';\nimport { BaseProviderStrategy } from '../BaseProviderStrategy/BaseProviderStrategy';\nimport { signMessage } from '../helpers/signMessage/signMessage';\nimport { guardTransactions } from '../helpers/signTransactions/helpers/guardTransactions/guardTransactions';\n\nconst dappMethods: string[] = [\n  WalletConnectOptionalMethodsEnum.CANCEL_ACTION,\n  WalletConnectOptionalMethodsEnum.SIGN_LOGIN_TOKEN\n];\n\ntype WalletConnectProviderStrategyConfigType = WalletConnectConfig & {\n  anchor?: HTMLElement;\n};\n\nexport class WalletConnectProviderStrategy extends BaseProviderStrategy {\n  private provider: WalletConnectV2Provider | null = null;\n  private readonly config: WalletConnectProviderStrategyConfigType;\n  private methods: string[] = [];\n  private _approval: (() => Promise<SessionTypes.Struct>) | null = null;\n  protected cancelActionAbortController: AbortController | null = null;\n\n  constructor(config: WalletConnectProviderStrategyConfigType) {\n    super();\n    this.config = config;\n  }\n\n  async init(): Promise<boolean> {\n    try {\n      if (this.provider?.isInitialized()) {\n        return true;\n      }\n\n      await this.initializeProvider();\n    } catch {\n      return false;\n    }\n\n    return true;\n  }\n\n  logout(): Promise<boolean> {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    return this.provider.logout();\n  }\n\n  getType(): ProviderType {\n    return ProviderTypeEnum.walletConnect;\n  }\n\n  getAddress(): Promise<string | undefined> {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    return Promise.resolve(this.provider.getAddress());\n  }\n\n  setAccount(account: IDAppProviderAccount): void {\n    return this.provider?.setAccount(account);\n  }\n\n  isInitialized(): boolean {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    return this.provider.isInitialized();\n  }\n\n  private async initializeProvider() {\n    await this.initWalletConnectManager();\n\n    if (!this.config) {\n      throw new Error(WalletConnectV2Error.invalidConfig);\n    }\n\n    const { walletConnectProvider, dappMethods: dAppMethods } =\n      await this.createWalletConnectProvider(this.config);\n\n    this.provider = walletConnectProvider;\n    this.methods = dAppMethods;\n\n    const { uri = '', approval } = await this.provider.connect({\n      methods: this.methods\n    });\n\n    const walletConnectDeepLink =\n      this.config.walletConnectDeepLink ??\n      fallbackWalletConnectConfigurations.walletConnectDeepLink;\n\n    this._approval = approval;\n    const walletConnectManager = WalletConnectStateManager.getInstance();\n    walletConnectManager.updateData({\n      wcURI: uri,\n      walletConnectDeepLink: `${walletConnectDeepLink}?wallet-connect=${encodeURIComponent(uri)}`\n    });\n  }\n\n  private async initWalletConnectManager() {\n    const shouldInitiateLogin = !getIsLoggedIn();\n\n    if (!shouldInitiateLogin) {\n      return;\n    }\n\n    const walletConnectManager = WalletConnectStateManager.getInstance();\n    await walletConnectManager.init(this.config?.anchor);\n  }\n\n  private async createWalletConnectProvider(config: WalletConnectConfig) {\n    const isLoggedIn = getIsLoggedIn();\n    const chainId = chainIdSelector(getState());\n    const nativeAuthConfig = nativeAuthConfigSelector(getState());\n\n    if (nativeAuthConfig) {\n      dappMethods.push(WalletConnectOptionalMethodsEnum.SIGN_NATIVE_AUTH_TOKEN);\n    }\n\n    if (!config?.walletConnectV2ProjectId) {\n      throw new Error(WalletConnectV2Error.invalidConfig);\n    }\n\n    const handleOnLogin = () => {};\n\n    const handleOnLogout = () => {\n      logoutAction();\n    };\n\n    const handleOnEvent = (_event: SessionEventTypes['event']) => {};\n\n    const providerHandlers = {\n      onClientLogin: handleOnLogin,\n      onClientLogout: handleOnLogout,\n      onClientEvent: handleOnEvent\n    };\n\n    try {\n      const {\n        walletConnectV2ProjectId,\n        walletConnectV2Options = {},\n        walletConnectV2RelayAddress = ''\n      } = config;\n      const walletConnectProvider = new WalletConnectV2Provider(\n        providerHandlers,\n        chainId,\n        walletConnectV2RelayAddress,\n        walletConnectV2ProjectId,\n        walletConnectV2Options\n      );\n\n      await walletConnectProvider.init();\n\n      return { walletConnectProvider, dappMethods };\n    } catch (err) {\n      console.error(WalletConnectV2Error.connectError, err);\n\n      if (isLoggedIn) {\n        await this.logout();\n      }\n\n      throw err;\n    }\n  }\n\n  async login(options?: { token?: string }): Promise<{\n    address: string;\n    signature: string;\n  }> {\n    if (!this.provider) {\n      throw new Error(\n        'Provider is not initialized. Call createProvider first.'\n      );\n    }\n\n    const reconnect = async (): Promise<{\n      address: string;\n      signature: string;\n    }> => {\n      if (!this.provider) {\n        throw new Error(ProviderErrorsEnum.notInitialized);\n      }\n\n      try {\n        await this.provider.init();\n        const walletConnectManager = WalletConnectStateManager.getInstance();\n\n        const { uri = '', approval: wcApproval } = await this.provider.connect({\n          methods: this.methods\n        });\n\n        const walletConnectDeepLink =\n          this.config.walletConnectDeepLink ??\n          fallbackWalletConnectConfigurations.walletConnectDeepLink;\n\n        walletConnectManager.updateData({\n          wcURI: uri,\n          walletConnectDeepLink: `${walletConnectDeepLink}?wallet-connect=${encodeURIComponent(uri)}`\n        });\n\n        const providerInfo = await this.provider.login({\n          approval: wcApproval,\n          token: options?.token\n        });\n\n        const { address = '', signature = '' } = providerInfo ?? {};\n\n        walletConnectManager.handleClose({ isLoginFinished: Boolean(address) });\n        return { address, signature };\n      } catch {\n        return await reconnect();\n      }\n    };\n\n    if (!this._approval) {\n      throw new Error('Approval or login is not initialized');\n    }\n\n    try {\n      const providerData = await this.provider.login({\n        approval: this._approval.bind(this),\n        token: options?.token\n      });\n\n      const { address = '', signature = '' } = providerData ?? {};\n\n      const walletConnectManager = WalletConnectStateManager.getInstance();\n      walletConnectManager.handleClose({ isLoginFinished: Boolean(address) });\n      return { address, signature };\n    } catch (error) {\n      console.error(WalletConnectV2Error.userRejected, error);\n      return await reconnect();\n    }\n  }\n\n  signTransactions = async (\n    transactions: Transaction[],\n    _options?: SignTransactionsOptionsType\n  ) => {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    const { manager, onClose } = await this.initSignState();\n\n    this.cancelActionAbortController = new AbortController();\n    const signal = this.cancelActionAbortController.signal;\n\n    try {\n      const abortPromise = new Promise<never>((_, reject) => {\n        signal.addEventListener('abort', () => {\n          reject(new Error('cancelled by user'));\n        });\n      });\n\n      const signedTransactions: Transaction[] = await Promise.race([\n        this.provider.signTransactions(transactions),\n        abortPromise\n      ]);\n\n      const optionallyGuardedTransactions =\n        await guardTransactions(signedTransactions);\n\n      return optionallyGuardedTransactions;\n    } catch (error) {\n      await onClose({ shouldCancelAction: true });\n      throw error;\n    } finally {\n      manager?.closeUI();\n    }\n  };\n\n  cancelAction = async () => {\n    this.sendCustomRequest({\n      method: WalletConnectOptionalMethodsEnum.CANCEL_ACTION,\n      action: OptionalOperation.CANCEL_ACTION\n    });\n\n    this.cancelActionAbortController?.abort();\n  };\n\n  signMessage = async (message: Message) => {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    this.cancelActionAbortController = new AbortController();\n    const signal = this.cancelActionAbortController.signal;\n\n    const abortPromise = new Promise<never>((_, reject) => {\n      signal.addEventListener('abort', () => {\n        reject(new Error('cancelled by user'));\n      });\n    });\n\n    const signedMessage = await Promise.race([\n      signMessage({\n        message,\n        handleSignMessage: this.provider.signMessage.bind(this.provider),\n        cancelAction: this.cancelAction,\n        providerType: providerLabels.extension\n      }),\n      abortPromise\n    ]);\n\n    return signedMessage;\n  };\n\n  private async sendCustomRequest({\n    action,\n    method\n  }: {\n    action: OptionalOperation;\n    method: WalletConnectOptionalMethodsEnum;\n  }) {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    try {\n      await this.provider.sendCustomRequest?.({\n        request: {\n          method,\n          params: { action }\n        }\n      });\n    } catch (error) {\n      console.error(WalletConnectV2Error.actionError, error);\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": ["WalletConnectProviderStrategy_exports", "__export", "WalletConnectProviderStrategy", "__toCommonJS", "import_out", "import_providerFactory", "import_walletConnect", "import_WalletConnectStateManager", "import_getIsLoggedIn", "import_sharedActions", "import_configSelectors", "import_networkSelectors", "import_store", "import_provider", "import_sdkWalletconnectProvider", "import_types", "import_BaseProviderStrategy", "import_signMessage", "import_guardTransactions", "dappMethods", "config", "transactions", "_options", "manager", "onClose", "signal", "abortPromise", "_", "reject", "signedTransactions", "error", "message", "account", "walletConnectProvider", "dAppMethods", "uri", "approval", "walletConnectDeepLink", "isLoggedIn", "chainId", "providerHandlers", "_event", "walletConnectV2ProjectId", "walletConnectV2Options", "walletConnectV2RelayAddress", "err", "options", "reconnect", "walletConnectManager", "wcApproval", "providerInfo", "address", "signature", "providerData", "action", "method"]
}
