{
  "version": 3,
  "sources": ["../../../src/managers/TransactionManager/TransactionManager.ts"],
  "sourcesContent": ["import axios, { AxiosError } from 'axios';\nimport { BATCH_TRANSACTIONS_ID_SEPARATOR } from 'constants/transactions.constants';\nimport { Transaction } from 'lib/sdkCore';\nimport { getAccount } from 'methods/account/getAccount';\nimport { TransactionTrackingConfigType } from 'methods/initApp/initApp.types';\nimport { addTransactionToast } from 'store/actions/toasts/toastsActions';\nimport { createTransactionsSession } from 'store/actions/transactions/transactionsActions';\nimport { networkSelector } from 'store/selectors/networkSelectors';\nimport { getState } from 'store/store';\nimport {\n  TransactionBatchStatusesEnum,\n  TransactionServerStatusesEnum\n} from 'types/enums.types';\nimport { BatchTransactionsResponseType } from 'types/serverTransactions.types';\nimport { SignedTransactionType } from 'types/transactions.types';\nimport { isGuardianTx } from 'utils/transactions/isGuardianTx';\nimport { getToastDuration } from './helpers/getToastDuration';\nimport { getTransactionsSessionStatus } from './helpers/getTransactionsStatus';\nimport { isBatchTransaction } from './helpers/isBatchTransaction';\nimport { registerCallbacks } from './helpers/sessionCallbacks';\nimport { TransactionManagerTrackOptionsType } from './TransactionManager.types';\n\nexport class TransactionManager {\n  private static instance: TransactionManager | null = null;\n\n  public static getInstance(): TransactionManager {\n    if (!TransactionManager.instance) {\n      TransactionManager.instance = new TransactionManager();\n    }\n    return TransactionManager.instance;\n  }\n\n  /**\n   * Set callbacks to be executed when the transaction session is successful or fails.\n   * It is analogous to the `onSuccess` and `onFail` callbacks set in the `initApp` method,\n   * as a way to override the global callbacks\n   * @param onSuccess - The callback to run when the transaction session is successful.\n   * @param onFail - The callback to run when the transaction session fails.\n   * @example\n   * ```ts\n   * TransactionManager.setCallbacks({\n   *   onSuccess: (sessionId) => {\n   *     console.log('Transaction session successful', sessionId);\n   *   },\n   * });\n   */\n  public setCallbacks = ({\n    onSuccess,\n    onFail\n  }: TransactionTrackingConfigType) => {\n    registerCallbacks({ onSuccess, onFail });\n  };\n\n  public send = async (\n    signedTransactions: Transaction[] | Transaction[][]\n  ): Promise<SignedTransactionType[] | SignedTransactionType[][]> => {\n    if (signedTransactions.length === 0) {\n      throw new Error('No transactions to send');\n    }\n\n    try {\n      if (!isBatchTransaction(signedTransactions)) {\n        const flatTransactions =\n          await this.sendSignedTransactions(signedTransactions);\n\n        return flatTransactions;\n      }\n\n      const sentTransactions =\n        await this.sendSignedBatchTransactions(signedTransactions);\n\n      if (!sentTransactions.data || sentTransactions.data.error) {\n        throw new Error(\n          sentTransactions.data?.error ?? 'Failed to send transactions'\n        );\n      }\n\n      const groupedTransactions = sentTransactions.data.transactions;\n\n      return groupedTransactions;\n    } catch (error) {\n      const responseData = <{ message: string }>(\n        (error as AxiosError).response?.data\n      );\n      throw responseData?.message ?? (error as Error).message;\n    }\n  };\n\n  /**\n   * Track the status of a transaction session.\n   * @param sentTransactions - The transactions to track.\n   * @param options - The options for the transaction session.\n   * @returns The session id.\n   * @example\n   * ```ts\n   * const sessionId = await txManager.track(sentTransactions, {\n   *   transactionsDisplayInfo: {\n   *     errorMessage: 'Failed adding stake',\n   *     successMessage: 'Stake successfully added',\n   *     processingMessage: 'Staking in progress'\n   *   },\n   *   onSuccess: async(sessionId) => {\n   *     console.log('Session successful', sessionId);\n   *   },\n   *   onFail: async(sessionId) => {\n   *     console.log('Session failed', sessionId);\n   *   }\n   *   sessionInformation: {\n   *     stakeAmount: '1000000000000000000000000'\n   *   }\n   * });\n   * ```\n   */\n  public track = async (\n    sentTransactions: SignedTransactionType[] | SignedTransactionType[][],\n    options: TransactionManagerTrackOptionsType = { disableToasts: false }\n  ): Promise<string> => {\n    const flatTransactions = this.sequentialToFlatArray(sentTransactions).map(\n      (transaction) => ({\n        ...transaction,\n        status: transaction.status ?? TransactionServerStatusesEnum.pending\n      })\n    );\n\n    const status = getTransactionsSessionStatus(flatTransactions);\n\n    const sessionId = createTransactionsSession({\n      transactions: flatTransactions,\n      transactionsDisplayInfo: options.transactionsDisplayInfo,\n      status: status ?? TransactionBatchStatusesEnum.sent,\n      sessionInformation: options.sessionInformation\n    });\n\n    if (options.disableToasts === true) {\n      return sessionId;\n    }\n\n    if (options.onSuccess) {\n      registerCallbacks({ onSuccess: options.onSuccess, sessionId });\n    }\n\n    if (options.onFail) {\n      registerCallbacks({ onFail: options.onFail, sessionId });\n    }\n\n    const totalDuration = getToastDuration(sentTransactions);\n    addTransactionToast({\n      toastId: sessionId,\n      totalDuration\n    });\n\n    return sessionId;\n  };\n\n  private readonly sendSignedTransactions = async (\n    signedTransactions: Transaction[]\n  ): Promise<SignedTransactionType[]> => {\n    const { apiAddress, apiTimeout } = networkSelector(getState());\n\n    const mergedTransactions = await Promise.all(\n      signedTransactions.map(async (transaction) => {\n        const response = await axios.post(\n          `${apiAddress}/transactions`,\n          transaction.toPlainObject(),\n          { timeout: Number(apiTimeout) }\n        );\n\n        const txHash = response.data.txHash;\n\n        return {\n          ...transaction.toPlainObject(),\n          ...response.data,\n          status: TransactionServerStatusesEnum.pending,\n          hash: txHash\n        };\n      })\n    );\n\n    return mergedTransactions;\n  };\n\n  private readonly sendSignedBatchTransactions = async (\n    signedTransactions: Transaction[][]\n  ) => {\n    const { address } = getAccount();\n    const { apiAddress, apiTimeout } = networkSelector(getState());\n\n    if (!address) {\n      return {\n        error:\n          'Invalid address provided. You need to be logged in to send transactions'\n      };\n    }\n\n    const batchId = this.buildBatchId(address);\n\n    const plainTransactions = signedTransactions.map((group) =>\n      group.map((tx) => tx.toPlainObject())\n    );\n\n    const payload = {\n      transactions: plainTransactions,\n      id: batchId\n    };\n\n    const { data } = await axios.post<BatchTransactionsResponseType>(\n      `${apiAddress}/batch`,\n      payload,\n      {\n        timeout: Number(apiTimeout)\n      }\n    );\n\n    const parsedTransactions = data.transactions.map((group) =>\n      group.map((tx) => {\n        const parsedTx: SignedTransactionType = {\n          ...tx,\n          status: TransactionServerStatusesEnum.pending,\n          hash: tx.hash\n        };\n\n        // Remove when the protocol supports usernames for guardian transactions\n        if (isGuardianTx({ data: parsedTx.data })) {\n          delete parsedTx.senderUsername;\n          delete parsedTx.receiverUsername;\n        }\n\n        return parsedTx;\n      })\n    );\n\n    return {\n      data: {\n        ...data,\n        transactions: parsedTransactions\n      }\n    };\n  };\n\n  private readonly buildBatchId = (address: string) => {\n    const sessionId = Date.now().toString();\n    return `${sessionId}${BATCH_TRANSACTIONS_ID_SEPARATOR}${address}`;\n  };\n  private readonly sequentialToFlatArray = (\n    transactions: SignedTransactionType[] | SignedTransactionType[][] = []\n  ) =>\n    this.getIsSequential(transactions)\n      ? transactions.flat()\n      : (transactions as SignedTransactionType[]);\n\n  private readonly getIsSequential = (\n    transactions?: SignedTransactionType[] | SignedTransactionType[][]\n  ) => transactions?.every((transaction) => Array.isArray(transaction));\n}\n"],
  "mappings": "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",
  "names": ["TransactionManager_exports", "__export", "TransactionManager", "__toCommonJS", "import_axios", "import_transactions", "import_getAccount", "import_toastsActions", "import_transactionsActions", "import_networkSelectors", "import_store", "import_enums", "import_isGuardianTx", "import_getToastDuration", "import_getTransactionsStatus", "import_isBatchTransaction", "import_sessionCallbacks", "_TransactionManager", "onSuccess", "onFail", "signedTransactions", "sentTransactions", "error", "options", "flatTransactions", "transaction", "status", "sessionId", "totalDuration", "apiAddress", "apiTimeout", "response", "axios", "txHash", "address", "batchId", "payload", "group", "tx", "data", "parsedTransactions", "parsedTx", "transactions"]
}
