{
  "version": 3,
  "sources": ["../../../../src/providers/strategies/LedgerProviderStrategy/LedgerProviderStrategy.ts"],
  "sourcesContent": ["import { HWProvider } from '@multiversx/sdk-hw-provider';\n\nimport { CANCEL_TRANSACTION_TOAST_DEFAULT_DURATION } from 'constants/transactions.constants';\nimport { Message, Transaction } from 'lib/sdkCore';\nimport { IDAppProviderAccount } from 'lib/sdkDappUtils';\nimport { LedgerConnectStateManager } from 'managers/internal/LedgerConnectStateManager/LedgerConnectStateManager';\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 { createCustomToast } from 'store/actions/toasts/toastsActions';\nimport { IconNamesEnum } from 'types/enums.types';\nimport { ProviderErrorsEnum } from 'types/provider.types';\nimport { authenticateLedgerAccount } from './helpers/authenticateLedgerAccount';\nimport { getLedgerProvider } from './helpers/getLedgerProvider';\nimport { initializeLedgerProvider } from './helpers/initializeLedgerProvider';\nimport { signLedgerMessage } from './helpers/signLedgerMessage';\nimport { LedgerConfigType } from './types/ledgerProvider.types';\nimport {\n  BaseProviderStrategy,\n  LoginOptionsTypes\n} from '../BaseProviderStrategy/BaseProviderStrategy';\nimport { signTransactions } from '../helpers/signTransactions/signTransactions';\n\ntype LedgerProviderStrategyOptionsType = {\n  anchor?: HTMLElement;\n  shouldInitProvider?: boolean;\n};\n\ntype LedgerProviderStrategyType = LedgerProviderStrategyOptionsType & {\n  address?: string;\n};\n\nexport class LedgerProviderStrategy extends BaseProviderStrategy {\n  private provider: HWProvider | null = null;\n  private config: LedgerConfigType | null = null;\n  private readonly options?: LedgerProviderStrategyOptionsType;\n\n  constructor({\n    address,\n    anchor,\n    shouldInitProvider\n  }: LedgerProviderStrategyType) {\n    super(address);\n    this.options = { anchor, shouldInitProvider };\n    this._login = this.ledgerLogin.bind(this);\n  }\n\n  async init(): Promise<boolean> {\n    try {\n      this.initializeAddress();\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.ledger;\n  }\n\n  getAddress(): Promise<string | undefined> {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    return 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.initLegderConnectManager(this.options?.anchor);\n    const ledgerConnectManager = LedgerConnectStateManager.getInstance();\n\n    const { ledgerProvider, ledgerConfig } = await new Promise<\n      Awaited<ReturnType<typeof getLedgerProvider>>\n    >((resolve, reject) =>\n      initializeLedgerProvider({\n        manager: ledgerConnectManager,\n        resolve,\n        reject,\n        shouldInitProvider: this.options?.shouldInitProvider\n      })\n    );\n\n    this.config = ledgerConfig;\n    this.provider = ledgerProvider;\n  }\n\n  private readonly ledgerLogin = async (\n    options?: LoginOptionsTypes & { addressIndex?: number }\n  ): Promise<{ address: string; signature: string }> => {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n    if (!options || typeof options.addressIndex !== 'number') {\n      throw new Error('Missing addressIndex for Ledger login');\n    }\n    const { address, signature } = await this.provider.login({\n      addressIndex: options.addressIndex\n    });\n    return {\n      address,\n      signature: signature ?? ''\n    };\n  };\n\n  public override loginOperation = async (options?: LoginOptionsTypes) => {\n    if (!this.provider || !this.config) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    return await authenticateLedgerAccount({\n      options,\n      config: this.config,\n      provider: this.provider,\n      login: this.ledgerLogin.bind(this)\n    });\n  };\n\n  private readonly initLegderConnectManager = async (anchor?: HTMLElement) => {\n    const shouldInitiateLogin = !getIsLoggedIn();\n\n    if (!shouldInitiateLogin) {\n      return;\n    }\n\n    const ledgerConnectManager = LedgerConnectStateManager.getInstance();\n    await ledgerConnectManager.init(anchor);\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    await this.rebuildProvider();\n\n    const signedTransactions = await signTransactions({\n      transactions,\n      handleSign: this.provider.signTransactions.bind(this.provider),\n      options\n    });\n\n    return signedTransactions;\n  };\n\n  signMessage = async (message: Message): Promise<Message> => {\n    if (!this.provider) {\n      throw new Error(ProviderErrorsEnum.notInitialized);\n    }\n\n    await this.rebuildProvider();\n\n    const signedMessage = await signLedgerMessage({\n      message,\n      handleSignMessage: this.provider.signMessage.bind(this.provider)\n    });\n\n    return signedMessage;\n  };\n\n  /**\n   * Makes sure the device is accessible and if not, tries to initialize a new provider\n   */\n  private readonly rebuildProvider = async () => {\n    try {\n      await this.provider?.getAddress(); // can communicate with device\n    } catch (_err) {\n      try {\n        const { ledgerProvider } = await getLedgerProvider({\n          shouldInitProvider: true\n        });\n        this.provider = ledgerProvider;\n      } catch (error) {\n        createCustomToast({\n          toastId: 'ledger-provider-rebuild-error',\n          duration: CANCEL_TRANSACTION_TOAST_DEFAULT_DURATION,\n          icon: IconNamesEnum.close,\n          iconClassName: 'warning',\n          message: 'Unlock your device & open the MultiversX App',\n          title: 'Ledger unavailable'\n        });\n        throw error;\n      }\n    }\n  };\n}\n"],
  "mappings": "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",
  "names": ["LedgerProviderStrategy_exports", "__export", "LedgerProviderStrategy", "__toCommonJS", "import_transactions", "import_LedgerConnectStateManager", "import_getIsLoggedIn", "import_providerFactory", "import_toastsActions", "import_enums", "import_provider", "import_authenticateLedgerAccount", "import_getLedgerProvider", "import_initializeLedgerProvider", "import_signLedgerMessage", "import_BaseProviderStrategy", "import_signTransactions", "address", "anchor", "shouldInitProvider", "options", "signature", "transactions", "message", "ledgerProvider", "error", "account", "ledgerConnectManager", "ledgerConfig", "resolve", "reject"]
}
