@metamask/transaction-pay-controller 10.3.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/actions/update-payment-token.cjs.map +1 -1
  3. package/dist/actions/update-payment-token.d.cts.map +1 -1
  4. package/dist/actions/update-payment-token.d.mts.map +1 -1
  5. package/dist/actions/update-payment-token.mjs.map +1 -1
  6. package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
  7. package/dist/strategy/bridge/bridge-quotes.d.cts.map +1 -1
  8. package/dist/strategy/bridge/bridge-quotes.d.mts.map +1 -1
  9. package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
  10. package/dist/strategy/relay/constants.cjs +2 -1
  11. package/dist/strategy/relay/constants.cjs.map +1 -1
  12. package/dist/strategy/relay/constants.d.cts +1 -0
  13. package/dist/strategy/relay/constants.d.cts.map +1 -1
  14. package/dist/strategy/relay/constants.d.mts +1 -0
  15. package/dist/strategy/relay/constants.d.mts.map +1 -1
  16. package/dist/strategy/relay/constants.mjs +1 -0
  17. package/dist/strategy/relay/constants.mjs.map +1 -1
  18. package/dist/strategy/relay/relay-quotes.cjs +60 -32
  19. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  20. package/dist/strategy/relay/relay-quotes.mjs +61 -33
  21. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  22. package/dist/strategy/relay/relay-submit.cjs +2 -0
  23. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  24. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  25. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  26. package/dist/strategy/relay/relay-submit.mjs +2 -0
  27. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  28. package/dist/strategy/relay/types.cjs.map +1 -1
  29. package/dist/strategy/relay/types.d.cts +5 -0
  30. package/dist/strategy/relay/types.d.cts.map +1 -1
  31. package/dist/strategy/relay/types.d.mts +5 -0
  32. package/dist/strategy/relay/types.d.mts.map +1 -1
  33. package/dist/strategy/relay/types.mjs.map +1 -1
  34. package/dist/tests/messenger-mock.cjs.map +1 -1
  35. package/dist/tests/messenger-mock.d.cts +9 -0
  36. package/dist/tests/messenger-mock.d.cts.map +1 -1
  37. package/dist/tests/messenger-mock.d.mts +9 -0
  38. package/dist/tests/messenger-mock.d.mts.map +1 -1
  39. package/dist/tests/messenger-mock.mjs.map +1 -1
  40. package/dist/utils/feature-flags.cjs +4 -1
  41. package/dist/utils/feature-flags.cjs.map +1 -1
  42. package/dist/utils/feature-flags.d.cts +2 -0
  43. package/dist/utils/feature-flags.d.cts.map +1 -1
  44. package/dist/utils/feature-flags.d.mts +2 -0
  45. package/dist/utils/feature-flags.d.mts.map +1 -1
  46. package/dist/utils/feature-flags.mjs +3 -0
  47. package/dist/utils/feature-flags.mjs.map +1 -1
  48. package/dist/utils/quotes.cjs.map +1 -1
  49. package/dist/utils/quotes.d.cts.map +1 -1
  50. package/dist/utils/quotes.d.mts.map +1 -1
  51. package/dist/utils/quotes.mjs.map +1 -1
  52. package/dist/utils/required-tokens.cjs.map +1 -1
  53. package/dist/utils/required-tokens.d.cts.map +1 -1
  54. package/dist/utils/required-tokens.d.mts.map +1 -1
  55. package/dist/utils/required-tokens.mjs.map +1 -1
  56. package/dist/utils/transaction.cjs.map +1 -1
  57. package/dist/utils/transaction.d.cts +2 -1
  58. package/dist/utils/transaction.d.cts.map +1 -1
  59. package/dist/utils/transaction.d.mts +2 -1
  60. package/dist/utils/transaction.d.mts.map +1 -1
  61. package/dist/utils/transaction.mjs.map +1 -1
  62. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [10.4.0]
11
+
12
+ ### Changed
13
+
14
+ - Bump `@metamask/transaction-controller` from `^62.4.0` to `^62.5.0` ([#7325](https://github.com/MetaMask/core/pull/7325))
15
+ - Bump `@metamask/bridge-status-controller` from `^63.1.0` to `^64.0.1` ([#7295](https://github.com/MetaMask/core/pull/7295), [#7307](https://github.com/MetaMask/core/pull/7307))
16
+ - Bump `@metamask/bridge-controller` from `^63.2.0` to `^64.0.0` ([#7295](https://github.com/MetaMask/core/pull/7295))
17
+ - Skip delegation in Relay quotes if token transfer only ([#7262](https://github.com/MetaMask/core/pull/7262))
18
+ - Bump `@metamask/assets-controllers` from `^92.0.0` to `^93.1.0` ([#7291](https://github.com/MetaMask/core/pull/7291), [#7309](https://github.com/MetaMask/core/pull/7309))
19
+ - Bump `@metamask/remote-feature-flag-controller` from `^2.0.1` to `^3.0.0` ([#7309](https://github.com/MetaMask/core/pull/7309)
20
+
21
+ ### Fixed
22
+
23
+ - Fix source network fees for batch Relay deposits on EIP-7702 networks ([#7323](https://github.com/MetaMask/core/pull/7323))
24
+ - Improve Relay provider fees ([#7313](https://github.com/MetaMask/core/pull/7313))
25
+ - Include slippage from feature flag.
26
+ - Read fee from `totalImpact` property.
27
+ - Send dust in transaction quotes to token transfer recipient, if available.
28
+
10
29
  ## [10.3.0]
11
30
 
12
31
  ### Changed
@@ -184,7 +203,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
184
203
 
185
204
  - Initial release ([#6820](https://github.com/MetaMask/core/pull/6820))
186
205
 
187
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.3.0...HEAD
206
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.4.0...HEAD
207
+ [10.4.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.3.0...@metamask/transaction-pay-controller@10.4.0
188
208
  [10.3.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.2.0...@metamask/transaction-pay-controller@10.3.0
189
209
  [10.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.1.0...@metamask/transaction-pay-controller@10.2.0
190
210
  [10.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@10.0.0...@metamask/transaction-pay-controller@10.1.0
@@ -1 +1 @@
1
- {"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":";;;AAAA,2CAA+D;AAC/D,+CAAyC;AAGzC,0CAA0C;AAM1C,8CAIwB;AACxB,0DAAsD;AAEtD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAW;QACvC,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AA7BD,gDA6BC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,IAAA,oBAAY,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,IAAI,wBAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,wBAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,iBAAiB;SAClC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;SACpC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,iBAAiB;SACjC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;SACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger, type Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n) {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const paymentToken = getPaymentToken({\n chainId,\n from: transaction?.txParams.from as Hex,\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n const balanceRawValue = new BigNumber(balance);\n const balanceHumanValue = new BigNumber(balance).shiftedBy(-decimals);\n const balanceRaw = balanceRawValue.toFixed(0);\n const balanceHuman = balanceHumanValue.toString(10);\n\n const balanceFiat = balanceHumanValue\n .multipliedBy(tokenFiatRate.fiatRate)\n .toString(10);\n\n const balanceUsd = balanceHumanValue\n .multipliedBy(tokenFiatRate.usdRate)\n .toString(10);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
1
+ {"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":";;;AAAA,2CAAqD;AAErD,+CAAyC;AAGzC,0CAA0C;AAM1C,8CAIwB;AACxB,0DAAsD;AAEtD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAW;QACvC,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AA7BD,gDA6BC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,IAAA,oBAAY,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,IAAI,wBAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,wBAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,iBAAiB;SAClC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;SACpC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,iBAAiB;SACjC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;SACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n) {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const paymentToken = getPaymentToken({\n chainId,\n from: transaction?.txParams.from as Hex,\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n const balanceRawValue = new BigNumber(balance);\n const balanceHumanValue = new BigNumber(balance).shiftedBy(-decimals);\n const balanceRaw = balanceRawValue.toFixed(0);\n const balanceHuman = balanceHumanValue.toString(10);\n\n const balanceFiat = balanceHumanValue\n .multipliedBy(tokenFiatRate.fiatRate)\n .toString(10);\n\n const balanceUsd = balanceHumanValue\n .multipliedBy(tokenFiatRate.usdRate)\n .toString(10);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAUlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,QA2BnC"}
1
+ {"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAUlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,QA2BnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAUlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,QA2BnC"}
1
+ {"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAUlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,QA2BnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAY,wBAAwB;AAC/D,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAGzC,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAM1C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,2BAAuB;AACxB,OAAO,EAAE,cAAc,EAAE,iCAA6B;AAEtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAW;QACvC,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,iBAAiB;SAClC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;SACpC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,iBAAiB;SACjC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;SACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger, type Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n) {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const paymentToken = getPaymentToken({\n chainId,\n from: transaction?.txParams.from as Hex,\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n const balanceRawValue = new BigNumber(balance);\n const balanceHumanValue = new BigNumber(balance).shiftedBy(-decimals);\n const balanceRaw = balanceRawValue.toFixed(0);\n const balanceHuman = balanceHumanValue.toString(10);\n\n const balanceFiat = balanceHumanValue\n .multipliedBy(tokenFiatRate.fiatRate)\n .toString(10);\n\n const balanceUsd = balanceHumanValue\n .multipliedBy(tokenFiatRate.usdRate)\n .toString(10);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
1
+ {"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAErD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAGzC,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAM1C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,2BAAuB;AACxB,OAAO,EAAE,cAAc,EAAE,iCAA6B;AAEtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAW;QACvC,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,iBAAiB;SAClC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;SACpC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,iBAAiB;SACjC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;SACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n) {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const paymentToken = getPaymentToken({\n chainId,\n from: transaction?.txParams.from as Hex,\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n const balanceRawValue = new BigNumber(balance);\n const balanceHumanValue = new BigNumber(balance).shiftedBy(-decimals);\n const balanceRaw = balanceRawValue.toFixed(0);\n const balanceHuman = balanceHumanValue.toString(10);\n\n const balanceFiat = balanceHumanValue\n .multipliedBy(tokenFiatRate.fiatRate)\n .toString(10);\n\n const balanceUsd = balanceHumanValue\n .multipliedBy(tokenFiatRate.usdRate)\n .toString(10);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
1
+ {"version":3,"file":"bridge-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { FeatureId } from '@metamask/bridge-controller';\nimport type { GenericQuoteRequest } from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-quotes.d.cts","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yCAAyC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,KAAK,EAEV,yBAAyB,EAE1B,oBAAgB;AAGjB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,2BAA2B,EAC3B,oCAAoC,EAEpC,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAkBrB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAqB3D;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,CAAC,yBAAyB,CAAC,GAC7D,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oCAAoC,GAC5C,MAAM,GAAG,SAAS,CAapB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EACrD,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CAUpC"}
1
+ {"version":3,"file":"bridge-quotes.d.cts","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yCAAyC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,KAAK,EAEV,yBAAyB,EAE1B,oBAAgB;AAGjB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,2BAA2B,EAC3B,oCAAoC,EAEpC,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAkBrB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAqB3D;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,CAAC,yBAAyB,CAAC,GAC7D,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oCAAoC,GAC5C,MAAM,GAAG,SAAS,CAapB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EACrD,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CAUpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-quotes.d.mts","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yCAAyC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,KAAK,EAEV,yBAAyB,EAE1B,oBAAgB;AAGjB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,2BAA2B,EAC3B,oCAAoC,EAEpC,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAkBrB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAqB3D;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,CAAC,yBAAyB,CAAC,GAC7D,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oCAAoC,GAC5C,MAAM,GAAG,SAAS,CAapB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EACrD,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CAUpC"}
1
+ {"version":3,"file":"bridge-quotes.d.mts","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yCAAyC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,KAAK,EAEV,yBAAyB,EAE1B,oBAAgB;AAGjB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,2BAA2B,EAC3B,oCAAoC,EAEpC,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAkBrB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAqB3D;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,CAAC,yBAAyB,CAAC,GAC7D,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oCAAoC,GAC5C,MAAM,GAAG,SAAS,CAapB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EACrD,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CAUpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
1
+ {"version":3,"file":"bridge-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { FeatureId } from '@metamask/bridge-controller';\nimport type { GenericQuoteRequest } from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RELAY_POLLING_INTERVAL = exports.RELAY_URL_BASE = exports.CHAIN_ID_HYPERCORE = void 0;
3
+ exports.TOKEN_TRANSFER_FOUR_BYTE = exports.RELAY_POLLING_INTERVAL = exports.RELAY_URL_BASE = exports.CHAIN_ID_HYPERCORE = void 0;
4
4
  exports.CHAIN_ID_HYPERCORE = '0x539';
5
5
  exports.RELAY_URL_BASE = 'https://api.relay.link';
6
6
  exports.RELAY_POLLING_INTERVAL = 1000; // 1 Second
7
+ exports.TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';
7
8
  //# sourceMappingURL=constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAC7B,QAAA,cAAc,GAAG,wBAAwB,CAAC;AAC1C,QAAA,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\n"]}
1
+ {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAC7B,QAAA,cAAc,GAAG,wBAAwB,CAAC;AAC1C,QAAA,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW;AAC1C,QAAA,wBAAwB,GAAG,YAAY,CAAC","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\nexport const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';\n"]}
@@ -1,4 +1,5 @@
1
1
  export declare const CHAIN_ID_HYPERCORE = "0x539";
2
2
  export declare const RELAY_URL_BASE = "https://api.relay.link";
3
3
  export declare const RELAY_POLLING_INTERVAL = 1000;
4
+ export declare const TOKEN_TRANSFER_FOUR_BYTE = "0xa9059cbb";
4
5
  //# sourceMappingURL=constants.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
1
+ {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,wBAAwB,eAAe,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export declare const CHAIN_ID_HYPERCORE = "0x539";
2
2
  export declare const RELAY_URL_BASE = "https://api.relay.link";
3
3
  export declare const RELAY_POLLING_INTERVAL = 1000;
4
+ export declare const TOKEN_TRANSFER_FOUR_BYTE = "0xa9059cbb";
4
5
  //# sourceMappingURL=constants.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
1
+ {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,wBAAwB,eAAe,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export const CHAIN_ID_HYPERCORE = '0x539';
2
2
  export const RELAY_URL_BASE = 'https://api.relay.link';
3
3
  export const RELAY_POLLING_INTERVAL = 1000; // 1 Second
4
+ export const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';
4
5
  //# sourceMappingURL=constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\n"]}
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\nexport const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';\n"]}