{"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport { CONTROLLER_NAME, TransactionPayStrategy } from './constants';\nimport type {\n  TransactionData,\n  TransactionPayControllerMessenger,\n  TransactionPayControllerOptions,\n  TransactionPayControllerState,\n} from './types';\nimport { queueRefreshQuotes, updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst stateMetadata = {\n  transactionData: { persist: false, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n  transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n  typeof CONTROLLER_NAME,\n  TransactionPayControllerState,\n  TransactionPayControllerMessenger\n> {\n  readonly #getStrategy?: (\n    transaction: TransactionMeta,\n  ) => Promise<TransactionPayStrategy>;\n\n  constructor({\n    getStrategy,\n    messenger,\n    state,\n  }: TransactionPayControllerOptions) {\n    super({\n      name: CONTROLLER_NAME,\n      metadata: stateMetadata,\n      messenger,\n      state: { ...getDefaultState(), ...state },\n    });\n\n    this.#getStrategy = getStrategy;\n\n    this.#registerActionHandlers();\n\n    pollTransactionChanges(\n      messenger,\n      this.#updateTransactionData.bind(this),\n      this.#removeTransactionData.bind(this),\n    );\n\n    queueRefreshQuotes(messenger, this.#updateTransactionData.bind(this));\n  }\n\n  updatePaymentToken({\n    transactionId,\n    tokenAddress,\n    chainId,\n  }: {\n    transactionId: string;\n    tokenAddress: Hex;\n    chainId: Hex;\n  }) {\n    updatePaymentToken(\n      { transactionId, tokenAddress, chainId },\n      {\n        messenger: this.messagingSystem,\n        updateTransactionData: this.#updateTransactionData.bind(this),\n      },\n    );\n  }\n\n  #removeTransactionData(transactionId: string) {\n    this.update((state) => {\n      delete state.transactionData[transactionId];\n    });\n  }\n\n  #updateTransactionData(\n    transactionId: string,\n    fn: (transactionData: Draft<TransactionData>) => void,\n  ) {\n    let shouldUpdateQuotes = false;\n\n    this.update((state) => {\n      const { transactionData } = state;\n      let current = transactionData[transactionId];\n      const originalPaymentToken = current?.paymentToken;\n      const originalTokens = current?.tokens;\n\n      if (!current) {\n        transactionData[transactionId] = {\n          isLoading: false,\n          tokens: [],\n        };\n\n        current = transactionData[transactionId];\n      }\n\n      fn(current);\n\n      const isPaymentTokenUpdated =\n        current.paymentToken !== originalPaymentToken;\n\n      const isTokensUpdated = current.tokens !== originalTokens;\n\n      if (isPaymentTokenUpdated || isTokensUpdated) {\n        updateSourceAmounts(\n          transactionId,\n          current as never,\n          this.messagingSystem,\n        );\n\n        shouldUpdateQuotes = true;\n        current.isLoading = true;\n      }\n    });\n\n    if (shouldUpdateQuotes) {\n      updateQuotes({\n        messenger: this.messagingSystem,\n        transactionData: this.state.transactionData[transactionId],\n        transactionId,\n        updateTransactionData: this.#updateTransactionData.bind(this),\n      }).catch(noop);\n    }\n  }\n\n  #registerActionHandlers() {\n    this.messagingSystem.registerActionHandler(\n      'TransactionPayController:getStrategy',\n      this.#getStrategy ?? (async () => TransactionPayStrategy.Relay),\n    );\n  }\n}\n"]}