{"version":3,"file":"source-amounts.mjs","sourceRoot":"","sources":["../../src/utils/source-amounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AACrD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,EAAE,gBAAgB,EAAE,oBAAgB;AAK3C,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAO1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,eAA4C,EAC5C,SAA4C;IAE5C,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO;KACR;IAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;IAEjD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE;QACnC,OAAO;KACR;IAED,MAAM,aAAa,GAAG,MAAM;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;SAC7D,MAAM,CAAC,OAAO,CAAiC,CAAC;IAEnD,GAAG,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhE,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,YAAqC,EACrC,KAAkC,EAClC,SAA4C;IAE5C,MAAM,oBAAoB,GAAG,gBAAgB,CAC3C,SAAS,EACT,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,OAAO,CACrB,CAAC;IAEF,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,mBAAmB,GACvB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE;QAClE,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC;IAEzC,IAAI,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE;QACrC,GAAG,CAAC,sCAAsC,EAAE;YAC1C,YAAY,EAAE,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,mBAAmB,EAAE;QACvB,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,sBAAsB,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAC/D,oBAAoB,CAAC,OAAO,CAC7B,CAAC;IAEF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,sBAAsB;SAC3C,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;SAChC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,EAAE;QAC3B,GAAG,CAAC,+BAA+B,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,iBAAiB;QACjB,eAAe;QACf,kBAAkB,EAAE,KAAK,CAAC,OAAO;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getTokenFiatRate } from './token';\nimport type {\n  TransactionPayControllerMessenger,\n  TransactionPaymentToken,\n} from '..';\nimport { projectLogger } from '../logger';\nimport type {\n  TransactionPaySourceAmount,\n  TransactionData,\n  TransactionPayRequiredToken,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'source-amounts');\n\n/**\n * Update the source amounts for a transaction.\n *\n * @param transactionId - ID of the transaction to update.\n * @param transactionData - Existing transaction data.\n * @param messenger - Controller messenger.\n */\nexport function updateSourceAmounts(\n  transactionId: string,\n  transactionData: TransactionData | undefined,\n  messenger: TransactionPayControllerMessenger,\n) {\n  if (!transactionData) {\n    return;\n  }\n\n  const { paymentToken, tokens } = transactionData;\n\n  if (!tokens.length || !paymentToken) {\n    return;\n  }\n\n  const sourceAmounts = tokens\n    .map((t) => calculateSourceAmount(paymentToken, t, messenger))\n    .filter(Boolean) as TransactionPaySourceAmount[];\n\n  log('Updated source amounts', { transactionId, sourceAmounts });\n\n  transactionData.sourceAmounts = sourceAmounts;\n}\n\n/**\n * Calculate the required source amount for a payment token to cover a target token.\n *\n * @param paymentToken - Selected payment token.\n * @param token - Target token to cover.\n * @param messenger - Controller messenger.\n * @returns The source amount or undefined if calculation failed.\n */\nfunction calculateSourceAmount(\n  paymentToken: TransactionPaymentToken,\n  token: TransactionPayRequiredToken,\n  messenger: TransactionPayControllerMessenger,\n): TransactionPaySourceAmount | undefined {\n  const paymentTokenFiatRate = getTokenFiatRate(\n    messenger,\n    paymentToken.address,\n    paymentToken.chainId,\n  );\n\n  if (!paymentTokenFiatRate) {\n    return undefined;\n  }\n\n  const hasBalance = new BigNumber(token.balanceRaw).gte(token.amountRaw);\n\n  const isSameTokenSelected =\n    token.address.toLowerCase() === paymentToken.address.toLowerCase() &&\n    token.chainId === paymentToken.chainId;\n\n  if (token.skipIfBalance && hasBalance) {\n    log('Skipping token as sufficient balance', {\n      tokenAddress: token.address,\n    });\n    return undefined;\n  }\n\n  if (isSameTokenSelected) {\n    log('Skipping token as same as payment token');\n    return undefined;\n  }\n\n  const sourceAmountHumanValue = new BigNumber(token.amountUsd).div(\n    paymentTokenFiatRate.usdRate,\n  );\n\n  const sourceAmountHuman = sourceAmountHumanValue.toString(10);\n\n  const sourceAmountRaw = sourceAmountHumanValue\n    .shiftedBy(paymentToken.decimals)\n    .toFixed(0);\n\n  if (token.amountRaw === '0') {\n    log('Skipping token as zero amount', { tokenAddress: token.address });\n    return undefined;\n  }\n\n  return {\n    sourceAmountHuman,\n    sourceAmountRaw,\n    targetTokenAddress: token.address,\n  };\n}\n"]}