@metamask-previews/bridge-controller 81.3.2-preview-11d253c58 → 81.3.3-preview-c4789fdf4
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.
- package/CHANGELOG.md +16 -1
- package/dist/coercers/quote-response-v2-to-v1.js.map +1 -1
- package/dist/selectors.d.ts.map +1 -1
- package/dist/selectors.js +3 -1
- package/dist/selectors.js.map +1 -1
- package/dist/utils/number-formatters.js +2 -2
- package/dist/utils/number-formatters.js.map +1 -1
- package/dist/utils/quote-fees.js +1 -1
- package/dist/utils/quote-fees.js.map +1 -1
- package/dist/utils/quote-metadata/calculators.js +4 -4
- package/dist/utils/quote-metadata/calculators.js.map +1 -1
- package/dist/utils/quote-metadata/to-currency-values.d.ts.map +1 -1
- package/dist/utils/quote-metadata/to-currency-values.js +11 -12
- package/dist/utils/quote-metadata/to-currency-values.js.map +1 -1
- package/dist/utils/swaps.js +1 -1
- package/dist/utils/swaps.js.map +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Bump `@ethersproject/bignumber` from `^5.7.0` to `^5.8.0` ([#10479](https://github.com/MetaMask/core/pull/10479))
|
|
13
|
+
- Bump `@ethersproject/constants` from `^5.7.0` to `^5.8.0` ([#10481](https://github.com/MetaMask/core/pull/10481))
|
|
14
|
+
- Bump `@ethersproject/providers` from `^5.7.0` to `^5.8.0` ([#10482](https://github.com/MetaMask/core/pull/10482))
|
|
15
|
+
- Bump `@ethersproject/address` from `^5.7.0` to `^5.8.0` ([#10478](https://github.com/MetaMask/core/pull/10478))
|
|
16
|
+
|
|
17
|
+
## [81.3.3]
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Bump `@metamask/transaction-controller` from `^72.0.0` to `^72.0.1` ([#10462](https://github.com/MetaMask/core/pull/10462))
|
|
22
|
+
- Bump `@metamask/assets-controller` from `^16.1.2` to `^17.0.0` ([#10474](https://github.com/MetaMask/core/pull/10474))
|
|
23
|
+
|
|
10
24
|
## [81.3.2]
|
|
11
25
|
|
|
12
26
|
### Changed
|
|
@@ -2083,7 +2097,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
2083
2097
|
|
|
2084
2098
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
|
2085
2099
|
|
|
2086
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.3.
|
|
2100
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.3.3...HEAD
|
|
2101
|
+
[81.3.3]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.3.2...@metamask/bridge-controller@81.3.3
|
|
2087
2102
|
[81.3.2]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.3.1...@metamask/bridge-controller@81.3.2
|
|
2088
2103
|
[81.3.1]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.3.0...@metamask/bridge-controller@81.3.1
|
|
2089
2104
|
[81.3.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@81.2.0...@metamask/bridge-controller@81.3.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-response-v2-to-v1.js","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n create,\n coerce,\n is,\n StructError,\n intersection,\n Infer,\n} from '@metamask/superstruct';\nimport { parseCaipAssetType } from '@metamask/utils';\n\nimport type { Step } from '../types.js';\nimport {\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from '../utils/caip-formatters.js';\nimport type { QuoteMetadata } from '../utils/quote-metadata/types.js';\nimport { formatStructErrors } from '../utils/struct-error.js';\nimport {\n BridgeAssetSchema,\n BridgeAssetV2Schema,\n MinimalAssetSchema,\n} from '../validators/bridge-asset.js';\nimport type { BridgeAssetV2 } from '../validators/bridge-asset.js';\nimport { QuoteResponseSchemaV1 } from '../validators/quote-response-v1.js';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1.js';\nimport { QuoteResponseSchemaV2 } from '../validators/quote-response.js';\nimport type { QuoteResponse } from '../validators/quote-response.js';\nimport {\n QuoteSchemaV2,\n FeeType,\n Quote,\n QuoteSchema,\n} from '../validators/quote.js';\nimport { StepSchemaV2, StepSchema } from '../validators/step.js';\n\nconst BridgeAssetV1FromV2 = coerce(\n intersection([BridgeAssetSchema, MinimalAssetSchema]),\n BridgeAssetV2Schema,\n (value) => {\n const { assetId, ...rest } = value;\n\n const { chainId } = parseCaipAssetType(assetId);\n return {\n address: formatAddressToCaipReference(assetId),\n chainId: formatChainIdToDec(chainId),\n assetId,\n ...rest,\n };\n },\n);\n\nconst toBridgeAssetV1 = (\n data: BridgeAssetV2,\n): Infer<typeof BridgeAssetSchema> => {\n return create(data, BridgeAssetV1FromV2);\n};\n\nconst StepSchemaV1FromV2 = coerce(StepSchema, StepSchemaV2, (value) => {\n const { src, dest, action } = value;\n const srcAsset = toBridgeAssetV1(src.asset);\n const destAsset = toBridgeAssetV1(dest.asset);\n\n return {\n action,\n srcChainId: srcAsset.chainId,\n destChainId: destAsset.chainId,\n srcAsset,\n destAsset,\n };\n});\n\nconst toStepV1 = (step: Infer<typeof StepSchemaV2>): Step => {\n const stepV2 = create(step, StepSchemaV1FromV2);\n return stepV2;\n};\n\nconst QuoteV1FromV2 = coerce(QuoteSchema, QuoteSchemaV2, (value) => {\n const {\n priceData,\n feeData,\n steps,\n protocols,\n aggregator,\n src,\n dest,\n intent,\n ...restQuote\n } = value;\n\n const { chainId: srcChainIdInCaip } = parseCaipAssetType(src.asset.assetId);\n const { chainId: destChainIdInCaip } = parseCaipAssetType(dest.asset.assetId);\n\n const srcChainId = formatChainIdToDec(srcChainIdInCaip);\n const destChainId = formatChainIdToDec(destChainIdInCaip);\n\n const { usd, ...metabridgeFeeData } = feeData[FeeType.METABRIDGE][0];\n\n return {\n bridges: protocols,\n bridgeId: aggregator,\n protocols,\n aggregator,\n srcChainId,\n destChainId,\n srcAsset: toBridgeAssetV1(src.asset),\n destAsset: toBridgeAssetV1(dest.asset),\n srcTokenAmount: src.amount,\n destTokenAmount: dest.amount,\n minDestTokenAmount: dest.minAmount ?? dest.amount,\n feeData: {\n [FeeType.METABRIDGE]: {\n ...metabridgeFeeData,\n asset: toBridgeAssetV1(metabridgeFeeData.asset),\n },\n ...(feeData[FeeType.TX_FEE]?.length && /* istanbul ignore next */ {\n [FeeType.TX_FEE]: {\n ...feeData[FeeType.TX_FEE][0],\n asset: toBridgeAssetV1(feeData[FeeType.TX_FEE][0].asset),\n },\n }),\n },\n ...(dest.walletAddress && /* istanbul ignore next */ {\n destWalletAddress: dest.walletAddress,\n }),\n ...(src.walletAddress && /* istanbul ignore next */ {\n walletAddress: src.walletAddress,\n }),\n ...(priceData?.priceImpact?.amount && /* istanbul ignore next */ {\n priceData: {\n priceImpact: priceData.priceImpact.amount,\n },\n }),\n ...(intent && /* istanbul ignore next */ { intent }),\n /**\n * @deprecated This field is deprecated.\n */\n steps: steps?.map(toStepV1),\n ...restQuote,\n };\n});\n\nconst toQuoteV1 = (quote: Infer<typeof QuoteSchemaV2>): Quote => {\n const quoteV2 = create(quote, QuoteV1FromV2);\n return quoteV2;\n};\n\nconst QuoteResponseV1FromV2 = coerce(\n QuoteResponseSchemaV1,\n QuoteResponseSchemaV2,\n (value: QuoteResponse | null) => {\n if (!value) {\n return null;\n }\n const {\n quote,\n estimatedProcessingTimeInSeconds,\n approval,\n // @ts-expect-error - Some networks don't have an approval field\n resetApproval,\n featureId,\n trade,\n quoteRequestIndex,\n nonEvmFeesInNative,\n l1GasFeesInHexWei,\n quoteId,\n } = value;\n\n const quoteV1 = toQuoteV1(quote);\n return {\n estimatedProcessingTimeInSeconds,\n approval,\n trade,\n quote: quoteV1,\n ...(featureId && /* istanbul ignore next */ { featureId }),\n ...(quoteId && /* istanbul ignore next */ { quoteId }),\n ...(resetApproval && /* istanbul ignore next */ { resetApproval }),\n ...(quoteRequestIndex !== undefined && /* istanbul ignore next */ {\n quoteRequestIndex,\n }),\n ...(nonEvmFeesInNative && /* istanbul ignore next */ {\n nonEvmFeesInNative,\n }),\n ...(l1GasFeesInHexWei && /* istanbul ignore next */ {\n l1GasFeesInHexWei,\n }),\n };\n },\n);\n\n/**\n * Converts a {@link QuoteResponse} to a {@link QuoteResponseV1} for backwards compatibility.\n * This does not preserve any post-fetch {@link QuoteMetadata}.\n *\n * @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.\n * @param quoteResponse - The {@link QuoteResponse} to convert\n * @returns The {@link QuoteResponseV1}\n */\nexport const toQuoteResponseV1 = (\n quoteResponse:\n | QuoteResponse\n | (QuoteResponseV1 & QuoteMetadata)\n | QuoteResponseV1,\n): QuoteResponseV1 & QuoteMetadata => {\n let errorMessage = 'Failed to convert';\n\n // V1 quote\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n errorMessage += ' unmodified QuoteResponseV1';\n return quoteResponse as QuoteResponseV1 & QuoteMetadata;\n }\n\n try {\n // V2 with namespace, chainId, maybe QuoteMetadata\n if (is(quoteResponse, QuoteResponseSchemaV2)) {\n errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';\n const quoteResponseV1 = create(quoteResponse, QuoteResponseV1FromV2);\n return quoteResponseV1;\n }\n\n // V2 with no namespace, chainId\n errorMessage += ' QuoteResponseV2 to QuoteResponseV1';\n return create(quoteResponse, QuoteResponseV1FromV2);\n } catch (error) {\n /* istanbul ignore next */\n let errorDetails = error instanceof Error ? error.message : 'Unknown error';\n\n /* istanbul ignore next */\n if (error instanceof StructError) {\n const formattedErrors = formatStructErrors(error);\n errorDetails = JSON.stringify(formattedErrors, null, 2);\n console.warn(errorMessage, formatStructErrors(error));\n }\n\n throw new Error(`${errorMessage}. ${errorDetails}`);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"quote-response-v2-to-v1.js","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n create,\n coerce,\n is,\n StructError,\n intersection,\n Infer,\n} from '@metamask/superstruct';\nimport { parseCaipAssetType } from '@metamask/utils';\n\nimport type { Step } from '../types.js';\nimport {\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from '../utils/caip-formatters.js';\nimport type { QuoteMetadata } from '../utils/quote-metadata/types.js';\nimport { formatStructErrors } from '../utils/struct-error.js';\nimport {\n BridgeAssetSchema,\n BridgeAssetV2Schema,\n MinimalAssetSchema,\n} from '../validators/bridge-asset.js';\nimport type { BridgeAssetV2 } from '../validators/bridge-asset.js';\nimport { QuoteResponseSchemaV1 } from '../validators/quote-response-v1.js';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1.js';\nimport { QuoteResponseSchemaV2 } from '../validators/quote-response.js';\nimport type { QuoteResponse } from '../validators/quote-response.js';\nimport {\n QuoteSchemaV2,\n FeeType,\n Quote,\n QuoteSchema,\n} from '../validators/quote.js';\nimport { StepSchemaV2, StepSchema } from '../validators/step.js';\n\nconst BridgeAssetV1FromV2 = coerce(\n intersection([BridgeAssetSchema, MinimalAssetSchema]),\n BridgeAssetV2Schema,\n (value) => {\n const { assetId, ...rest } = value;\n\n const { chainId } = parseCaipAssetType(assetId);\n return {\n address: formatAddressToCaipReference(assetId),\n chainId: formatChainIdToDec(chainId),\n assetId,\n ...rest,\n };\n },\n);\n\nconst toBridgeAssetV1 = (\n data: BridgeAssetV2,\n): Infer<typeof BridgeAssetSchema> => {\n return create(data, BridgeAssetV1FromV2);\n};\n\nconst StepSchemaV1FromV2 = coerce(StepSchema, StepSchemaV2, (value) => {\n const { src, dest, action } = value;\n const srcAsset = toBridgeAssetV1(src.asset);\n const destAsset = toBridgeAssetV1(dest.asset);\n\n return {\n action,\n srcChainId: srcAsset.chainId,\n destChainId: destAsset.chainId,\n srcAsset,\n destAsset,\n };\n});\n\nconst toStepV1 = (step: Infer<typeof StepSchemaV2>): Step => {\n const stepV2 = create(step, StepSchemaV1FromV2);\n return stepV2;\n};\n\nconst QuoteV1FromV2 = coerce(QuoteSchema, QuoteSchemaV2, (value) => {\n const {\n priceData,\n feeData,\n steps,\n protocols,\n aggregator,\n src,\n dest,\n intent,\n ...restQuote\n } = value;\n\n const { chainId: srcChainIdInCaip } = parseCaipAssetType(src.asset.assetId);\n const { chainId: destChainIdInCaip } = parseCaipAssetType(dest.asset.assetId);\n\n const srcChainId = formatChainIdToDec(srcChainIdInCaip);\n const destChainId = formatChainIdToDec(destChainIdInCaip);\n\n const { usd, ...metabridgeFeeData } = feeData[FeeType.METABRIDGE][0];\n\n return {\n bridges: protocols,\n bridgeId: aggregator,\n protocols,\n aggregator,\n srcChainId,\n destChainId,\n srcAsset: toBridgeAssetV1(src.asset),\n destAsset: toBridgeAssetV1(dest.asset),\n srcTokenAmount: src.amount,\n destTokenAmount: dest.amount,\n minDestTokenAmount: dest.minAmount ?? dest.amount,\n feeData: {\n [FeeType.METABRIDGE]: {\n ...metabridgeFeeData,\n asset: toBridgeAssetV1(metabridgeFeeData.asset),\n },\n ...(feeData[FeeType.TX_FEE]?.length && /* istanbul ignore next */ {\n [FeeType.TX_FEE]: {\n ...feeData[FeeType.TX_FEE][0],\n asset: toBridgeAssetV1(feeData[FeeType.TX_FEE][0].asset),\n },\n }),\n },\n ...(dest.walletAddress && /* istanbul ignore next */ {\n destWalletAddress: dest.walletAddress,\n }),\n ...(src.walletAddress && /* istanbul ignore next */ {\n walletAddress: src.walletAddress,\n }),\n ...(priceData?.priceImpact?.amount && /* istanbul ignore next */ {\n priceData: {\n priceImpact: priceData.priceImpact.amount,\n },\n }),\n ...(intent && /* istanbul ignore next */ { intent }),\n /**\n * @deprecated This field is deprecated.\n */\n steps: steps?.map(toStepV1),\n ...restQuote,\n };\n});\n\nconst toQuoteV1 = (quote: Infer<typeof QuoteSchemaV2>): Quote => {\n const quoteV2 = create(quote, QuoteV1FromV2);\n return quoteV2;\n};\n\nconst QuoteResponseV1FromV2 = coerce(\n QuoteResponseSchemaV1,\n QuoteResponseSchemaV2,\n (value: QuoteResponse | null) => {\n if (!value) {\n return null;\n }\n const {\n quote,\n estimatedProcessingTimeInSeconds,\n approval,\n // @ts-expect-error - Some networks don't have an approval field\n resetApproval,\n featureId,\n trade,\n quoteRequestIndex,\n nonEvmFeesInNative,\n l1GasFeesInHexWei,\n quoteId,\n } = value;\n\n const quoteV1 = toQuoteV1(quote);\n return {\n estimatedProcessingTimeInSeconds,\n approval,\n trade,\n quote: quoteV1,\n ...(featureId && /* istanbul ignore next */ { featureId }),\n ...(quoteId && /* istanbul ignore next */ { quoteId }),\n ...(resetApproval && /* istanbul ignore next */ { resetApproval }),\n ...(quoteRequestIndex !== undefined && /* istanbul ignore next */ {\n quoteRequestIndex,\n }),\n ...(nonEvmFeesInNative && /* istanbul ignore next */ {\n nonEvmFeesInNative,\n }),\n ...(l1GasFeesInHexWei && /* istanbul ignore next */ {\n l1GasFeesInHexWei,\n }),\n };\n },\n);\n\n/**\n * Converts a {@link QuoteResponse} to a {@link QuoteResponseV1} for backwards compatibility.\n * This does not preserve any post-fetch {@link QuoteMetadata}.\n *\n * @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.\n * @param quoteResponse - The {@link QuoteResponse} to convert\n * @returns The {@link QuoteResponseV1}\n */\nexport const toQuoteResponseV1 = (\n quoteResponse:\n | QuoteResponse\n | (QuoteResponseV1 & QuoteMetadata)\n | QuoteResponseV1,\n): QuoteResponseV1 & QuoteMetadata => {\n let errorMessage = 'Failed to convert';\n\n // V1 quote\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n errorMessage += ' unmodified QuoteResponseV1';\n return quoteResponse;\n }\n\n try {\n // V2 with namespace, chainId, maybe QuoteMetadata\n if (is(quoteResponse, QuoteResponseSchemaV2)) {\n errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';\n const quoteResponseV1 = create(quoteResponse, QuoteResponseV1FromV2);\n return quoteResponseV1;\n }\n\n // V2 with no namespace, chainId\n errorMessage += ' QuoteResponseV2 to QuoteResponseV1';\n return create(quoteResponse, QuoteResponseV1FromV2);\n } catch (error) {\n /* istanbul ignore next */\n let errorDetails = error instanceof Error ? error.message : 'Unknown error';\n\n /* istanbul ignore next */\n if (error instanceof StructError) {\n const formattedErrors = formatStructErrors(error);\n errorDetails = JSON.stringify(formattedErrors, null, 2);\n console.warn(errorMessage, formatStructErrors(error));\n }\n\n throw new Error(`${errorMessage}. ${errorDetails}`);\n }\n};\n"]}
|
package/dist/selectors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA1WnB,wBAAwB;;kCAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEhD,CAAC;AAmBH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB;8BAhmBN,wBAAwB;;8BAEtB,OAAO;;;;;;;;;;;;;;;;;IAwmB/B;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA5mBmB,wBAAwB;;kCAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAinBpC,CAAC;AAEF,eAAO,MAAM,yCAAyC,UAC7C,cAAc,WAIR,CAAC;AAEhB,eAAO,MAAM,mBAAmB,UAAW,cAAc;;;;GACpC,CAAC;AAEtB,eAAO,MAAM,+BAA+B;8BA/nBhB,wBAAwB;;8BAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAgoBb,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,6DAElD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,6DAElD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,4EAIlD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC;;;;;;;;CAuBzE,CAAC"}
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA3WnB,wBAAwB;;kCAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEhD,CAAC;AAmBH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB;8BAjmBN,wBAAwB;;8BAEtB,OAAO;;;;;;;;;;;;;;;;;IAymB/B;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;QAFH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA7mBmB,wBAAwB;;kCAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAknBpC,CAAC;AAEF,eAAO,MAAM,yCAAyC,UAC7C,cAAc,WAIR,CAAC;AAEhB,eAAO,MAAM,mBAAmB,UAAW,cAAc;;;;GACpC,CAAC;AAEtB,eAAO,MAAM,+BAA+B;8BAhoBhB,wBAAwB;;8BAEtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAioBb,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,6DAElD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,6DAElD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,4EAIlD,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC;;;;;;;;CAuBzE,CAAC"}
|
package/dist/selectors.js
CHANGED
|
@@ -123,7 +123,9 @@ export const selectExchangeRateByAssetId = (exchangeRateSources, assetId) => {
|
|
|
123
123
|
}
|
|
124
124
|
// If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller
|
|
125
125
|
if (!isNonEvmChainId(chainId)) {
|
|
126
|
-
const marketDataByChain =
|
|
126
|
+
const marketDataByChain =
|
|
127
|
+
// oxlint-disable-next-line typescript/no-unnecessary-type-assertion
|
|
128
|
+
marketData ?? {};
|
|
127
129
|
const evmTokenExchangeRates = marketDataByChain[formatChainIdToHex(chainId)];
|
|
128
130
|
const evmTokenExchangeRateForAddress = getEvmTokenExchangeRateForAddress(evmTokenExchangeRates, address);
|
|
129
131
|
const currencyKey = evmTokenExchangeRateForAddress?.currency;
|
package/dist/selectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { getAddress } from '@ethersproject/address';\nimport type {\n CurrencyRateState,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n} from '@metamask/assets-controllers';\nimport type {\n GasFeeEstimates,\n GasFeeEstimatesByChainId,\n} from '@metamask/gas-fee-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { isStrictHexString, parseCaipAssetType } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash-es';\nimport {\n createSelector as createSelector_,\n createStructuredSelector as createStructuredSelector_,\n} from 'reselect';\n\nimport { BRIDGE_PREFERRED_GAS_ESTIMATE } from './constants/bridge.js';\nimport type {\n BridgeControllerState,\n DeepPartial,\n ExchangeRate,\n} from './types.js';\nimport { RequestStatus, SortOrder } from './types.js';\nimport {\n getNativeAssetForChainId,\n isNativeAddress,\n isNonEvmChainId,\n} from './utils/bridge.js';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters.js';\nimport { processFeatureFlags } from './utils/feature-flags.js';\nimport { sumAmounts } from './utils/number-formatters.js';\nimport {\n calcBatchFees,\n calcQuoteMetadata,\n} from './utils/quote-metadata/calculators.js';\nimport { mergeQuoteMetadata } from './utils/quote-metadata/merge.js';\nimport { toCurrencyValues } from './utils/quote-metadata/to-currency-values.js';\nimport type { QuoteMetadata } from './utils/quote-metadata/types.js';\nimport { QuoteMetadataMigrationPhase } from './utils/quote-metadata/types.js';\nimport { getDefaultSlippagePercentage } from './utils/slippage.js';\nimport type { QuoteResponse } from './validators/quote-response.js';\n\nconst EMPTY_QUOTE_METADATA: never[] = [];\n\n/**\n * The controller states that provide exchange rates\n */\ntype ExchangeRateControllerState = MultichainAssetsRatesControllerState &\n TokenRatesControllerState &\n CurrencyRateState &\n Pick<BridgeControllerState, 'assetExchangeRates'>;\n/**\n * The state of the bridge controller and all its dependency controllers\n */\ntype RemoteFeatureFlagControllerState = {\n remoteFeatureFlags: {\n bridgeConfig: unknown;\n };\n};\n\n/**\n * Minimal shape required for exchange-rate lookups (used by getExchangeRateByChainIdAndAddress).\n * Uses types from assets-controllers; marketData and conversionRates also accept the bridge format.\n */\nexport type ExchangeRateSourcesForLookup = Pick<\n BridgeControllerState,\n 'assetExchangeRates'\n> &\n Partial<Pick<CurrencyRateState, 'currencyRates'>> & {\n marketData?:\n | TokenRatesControllerState['marketData']\n | Record<string, Record<string, { price?: number; currency?: string }>>;\n conversionRates?:\n | MultichainAssetsRatesControllerState['conversionRates']\n | Record<string, { rate: string }>;\n };\n\nexport type BridgeAppState = BridgeControllerState & {\n gasFeeEstimatesByChainId: GasFeeEstimatesByChainId;\n} & ExchangeRateControllerState & {\n participateInMetaMetrics: boolean;\n } & RemoteFeatureFlagControllerState;\n/**\n * Creates a structured selector for the bridge controller\n */\nconst createStructuredBridgeSelector =\n createStructuredSelector_.withTypes<BridgeAppState>();\n/**\n * Creates a typed selector for the bridge controller\n */\nconst createBridgeSelector = createSelector_.withTypes<BridgeAppState>();\n/**\n * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\n sortOrder: SortOrder;\n selectedQuote: (QuoteResponse & QuoteMetadata) | null;\n migrationPhase: QuoteMetadataMigrationPhase;\n};\n\ntype EvmTokenExchangeRate = { price?: number; currency?: string };\ntype EvmTokenExchangeRates = Record<string, EvmTokenExchangeRate>;\n\nconst createFeatureFlagsSelector =\n createSelector_.withTypes<RemoteFeatureFlagControllerState>();\n\n/**\n * Selects the bridge feature flags\n *\n * @param state - The state of the bridge controller\n * @returns The bridge feature flags\n *\n * @example\n * ```ts\n * const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));\n *\n * Or\n *\n * export const selectBridgeFeatureFlags = createSelector(\n * selectRemoteFeatureFlags,\n * (remoteFeatureFlags) =>\n * selectBridgeFeatureFlagsBase({\n * bridgeConfig: remoteFeatureFlags.bridgeConfig,\n * }),\n * );\n * ```\n */\nexport const selectBridgeFeatureFlags = createFeatureFlagsSelector(\n [(state) => state.remoteFeatureFlags.bridgeConfig],\n (bridgeConfig: unknown) => processFeatureFlags(bridgeConfig),\n);\n\nconst getEvmTokenExchangeRateForAddress = (\n evmTokenExchangeRates: EvmTokenExchangeRates | undefined,\n address: string,\n): EvmTokenExchangeRate | null | undefined => {\n try {\n return isStrictHexString(address)\n ? (evmTokenExchangeRates?.[getAddress(address)] ??\n evmTokenExchangeRates?.[address.toLowerCase()])\n : null;\n } catch {\n return null;\n }\n};\n\n/**\n * Selects the asset exchange rate for a given chain and address\n *\n * @param exchangeRateSources - the controller states containing the exchange rates\n * @param assetId - the assetId to get the exchange rate for\n * @returns The asset exchange rate for the given assetId\n */\nexport const selectExchangeRateByAssetId = (\n exchangeRateSources: ExchangeRateSourcesForLookup,\n assetId?: CaipAssetType,\n): ExchangeRate => {\n if (!assetId) {\n return {};\n }\n\n const { assetExchangeRates, currencyRates, marketData, conversionRates } =\n exchangeRateSources;\n\n // If the asset exchange rate is available in the bridge controller, use it\n // This is defined if the token's rate is not available from the assets controllers\n const bridgeControllerRate =\n assetExchangeRates?.[assetId.toLowerCase() as CaipAssetType] ??\n assetExchangeRates?.[assetId];\n if (\n bridgeControllerRate?.exchangeRate &&\n bridgeControllerRate?.usdExchangeRate\n ) {\n return bridgeControllerRate;\n }\n\n const { chainId } = parseCaipAssetType(assetId);\n\n // If the chain is a non-EVM chain, use the conversion rate from the multichain assets controller\n if (isNonEvmChainId(chainId)) {\n const conversionRatesByKey = conversionRates as\n | Record<string, { rate?: string }>\n | undefined;\n const multichainAssetExchangeRate = conversionRatesByKey?.[assetId];\n const rate = multichainAssetExchangeRate?.rate;\n if (rate) {\n // The multichain rate is denominated in the user's selected currency.\n // To get a USD rate, find the user's-currency-to-USD conversion factor from any EVM native currency rate.\n const nativeCurrencyRate =\n currencyRates &&\n Object.values(currencyRates).find(\n (rateEntry) =>\n rateEntry?.conversionRate !== undefined &&\n rateEntry?.conversionRate !== null &&\n rateEntry?.usdConversionRate !== undefined &&\n rateEntry?.usdConversionRate !== null,\n );\n const usersCurrencyToUsdRate =\n nativeCurrencyRate?.conversionRate !== undefined &&\n nativeCurrencyRate?.conversionRate !== null &&\n nativeCurrencyRate?.usdConversionRate !== undefined &&\n nativeCurrencyRate?.usdConversionRate !== null\n ? new BigNumber(nativeCurrencyRate.usdConversionRate).div(\n nativeCurrencyRate.conversionRate,\n )\n : undefined;\n const usdExchangeRate = usersCurrencyToUsdRate\n ? new BigNumber(rate).times(usersCurrencyToUsdRate).toString()\n : undefined;\n return {\n exchangeRate: rate,\n usdExchangeRate,\n };\n }\n return {};\n }\n\n const address = formatAddressToCaipReference(assetId);\n\n // If the chain is an EVM chain, use the conversion rate from the currency rates controller\n if (isNativeAddress(address)) {\n const { symbol } = getNativeAssetForChainId(chainId);\n const evmNativeExchangeRate = currencyRates?.[symbol];\n if (evmNativeExchangeRate) {\n return {\n exchangeRate: evmNativeExchangeRate.conversionRate?.toString(),\n usdExchangeRate: evmNativeExchangeRate.usdConversionRate?.toString(),\n };\n }\n return {};\n }\n // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller\n if (!isNonEvmChainId(chainId)) {\n const marketDataByChain =\n (marketData as Record<string, EvmTokenExchangeRates> | undefined) ?? {};\n const evmTokenExchangeRates =\n marketDataByChain[formatChainIdToHex(chainId)];\n const evmTokenExchangeRateForAddress = getEvmTokenExchangeRateForAddress(\n evmTokenExchangeRates,\n address,\n );\n const currencyKey = evmTokenExchangeRateForAddress?.currency;\n const nativeCurrencyRate =\n currencyKey !== undefined && currencyKey !== null\n ? currencyRates?.[currencyKey]\n : undefined;\n const price = evmTokenExchangeRateForAddress?.price;\n // A missing or zero price is not a usable exchange rate. Returning a \"0\"\n // rate here is harmful in two ways: it surfaces a $0 fiat value, and it\n // makes `selectIsAssetExchangeRateInState` treat the token as already\n // priced (the non-empty \"0\" string is truthy), which prevents the\n // controller from fetching the real rate. Fall through to `{}` instead so\n // the rate gets fetched from the price API.\n if (price && nativeCurrencyRate) {\n return {\n exchangeRate: new BigNumber(price)\n .multipliedBy(nativeCurrencyRate.conversionRate ?? 0)\n .toString(),\n usdExchangeRate: new BigNumber(price)\n .multipliedBy(nativeCurrencyRate.usdConversionRate ?? 0)\n .toString(),\n };\n }\n }\n\n return {};\n};\n\n/**\n * Checks whether an exchange rate is available for a given assetId\n *\n * @param state The state of the bridge controller and its dependency controllers\n * @param assetId The assetId to check\n * @returns Whether an exchange rate is available for the given chain and address\n */\nexport const selectIsAssetExchangeRateInState = (\n state: ExchangeRateSourcesForLookup,\n assetId?: CaipAssetType,\n) =>\n Boolean(selectExchangeRateByAssetId(state, assetId)?.exchangeRate) &&\n Boolean(selectExchangeRateByAssetId(state, assetId)?.usdExchangeRate);\n\n/**\n * Selects the gas fee estimates from the gas fee controller. All potential networks\n * support EIP1559 gas fees so assume that gasFeeEstimates is of type GasFeeEstimates\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param state.gasFeeEstimatesByChainId - gasEstimates by Hex ChainId\n * @param state.quotes - Fetched bridge/swap quotes\n * @returns The gas fee estimates in decGWEI\n */\nconst selectBridgeFeesPerGas = createBridgeSelector(\n [\n (state) => state.gasFeeEstimatesByChainId,\n (state) => state.quotes?.[0]?.chainId,\n ],\n (gasFeeEstimatesByChainId, srcChainId) => {\n if (!srcChainId) {\n return null;\n }\n if (isNonEvmChainId(srcChainId)) {\n return null;\n }\n // @ts-expect-error - all supported networks use this type of estimates\n const gasFeeEstimates: GasFeeEstimates | undefined =\n gasFeeEstimatesByChainId?.[\n formatChainIdToHex(srcChainId) as keyof typeof gasFeeEstimatesByChainId\n ]?.gasFeeEstimates;\n if (!gasFeeEstimates) {\n return null;\n }\n return {\n estimatedBaseFeeInDecGwei: gasFeeEstimates.estimatedBaseFee,\n feePerGasInDecGwei:\n gasFeeEstimates[BRIDGE_PREFERRED_GAS_ESTIMATE]?.suggestedMaxFeePerGas,\n maxFeePerGasInDecGwei: gasFeeEstimates.high?.suggestedMaxFeePerGas,\n };\n },\n);\n\nconst selectExchangeRateSources = createStructuredBridgeSelector({\n currencyRates: (state) => state.currencyRates,\n marketData: (state) => state.marketData,\n conversionRates: (state) => state.conversionRates,\n assetExchangeRates: (state) => state.assetExchangeRates,\n});\n\n// Selects metadata for cross-chain swap quotes\nconst selectMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectBridgeFeesPerGas,\n selectExchangeRateSources,\n ({ quoteRequest }) => quoteRequest,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (\n quotes,\n bridgeFeesPerGas,\n exchangeRateSources,\n quoteRequest,\n migrationPhase,\n ) => {\n // Return early if the migration phase is V2Only because we don't need to calculate metadata\n if (migrationPhase === QuoteMetadataMigrationPhase.V2Only) {\n return EMPTY_QUOTE_METADATA;\n }\n const { destTokenAddress, srcChainId, destChainId } = quoteRequest[0] ?? {};\n\n return quotes.map((quote) =>\n calcQuoteMetadata(quote, {\n srcTokenExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n quote.quote.src.asset.assetId,\n ),\n bridgeFeesPerGas,\n destTokenExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n quote.quote.dest.asset.assetId ??\n formatAddressToAssetId(\n destTokenAddress ?? quote.quote.dest.asset.assetId,\n destChainId,\n ),\n ),\n nativeExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n getNativeAssetForChainId(srcChainId ?? quote.chainId)?.assetId,\n ),\n }),\n );\n },\n);\n\n/**\n * Selects the USD to fiat exchange rate based on the native asset's price\n *\n * @param options - The options for the selector\n * @param options.quoteRequest - The quote request\n * @returns The USD to fiat exchange rate in string format\n */\nconst selectUsdToCurrencyExchangeRate = createBridgeSelector(\n [\n selectExchangeRateSources,\n ({ quoteRequest }) =>\n getNativeAssetForChainId(quoteRequest[0]?.srcChainId ?? 1)?.assetId,\n ],\n (exchangeRateSources, nativeAssetId) => {\n const exchangeRate = selectExchangeRateByAssetId(\n exchangeRateSources,\n nativeAssetId,\n );\n return exchangeRate?.exchangeRate && exchangeRate?.usdExchangeRate\n ? new BigNumber(exchangeRate.exchangeRate)\n .div(exchangeRate.usdExchangeRate)\n .toFixed()\n : undefined;\n },\n);\n\nconst selectCurrencyValues = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectUsdToCurrencyExchangeRate,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (quotes, usdToFiatExchangeRateString, migrationPhase) => {\n if (migrationPhase === QuoteMetadataMigrationPhase.V1Data) {\n return EMPTY_QUOTE_METADATA;\n }\n const usdToFiatExchangeRate = usdToFiatExchangeRateString\n ? new BigNumber(usdToFiatExchangeRateString)\n : undefined;\n return quotes.map((quote) =>\n toCurrencyValues(quote, usdToFiatExchangeRate),\n );\n },\n);\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n selectMetadata,\n selectCurrencyValues,\n ({ quotes }) => quotes,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (legacyQuoteMetadata, quoteMetadataV2, quotes, migrationPhase) =>\n quotes.map((quote, index) =>\n mergeQuoteMetadata(\n quote,\n legacyQuoteMetadata[index],\n migrationPhase,\n quoteMetadataV2[index],\n ),\n ),\n);\n\nconst selectSortedBridgeQuotes = createBridgeSelector(\n [\n selectBridgeQuotesWithMetadata,\n (_, { sortOrder }: BridgeQuotesClientParams) => sortOrder,\n ],\n (quotesWithMetadata, sortOrder): QuoteResponse[] => {\n switch (sortOrder) {\n case SortOrder.ETA_ASC:\n return orderBy(\n quotesWithMetadata,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n );\n default:\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.cost?.valueInCurrency,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.cost?.valueInCurrency),\n 'asc',\n );\n }\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.priceImpact?.amount,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.priceImpact?.amount),\n 'asc',\n );\n }\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.priceImpact?.valueInCurrency,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.priceImpact?.valueInCurrency),\n 'asc',\n );\n }\n return orderBy(\n quotesWithMetadata,\n ({ quote }) => Number(quote.dest.amount),\n 'desc',\n );\n }\n },\n);\n\nconst selectRecommendedQuote = createBridgeSelector(\n [selectSortedBridgeQuotes],\n (quotes) => (quotes.length > 0 ? quotes[0] : null),\n);\n\nconst selectActiveQuote = createBridgeSelector(\n [\n selectRecommendedQuote,\n selectSortedBridgeQuotes,\n (_, { selectedQuote }) => selectedQuote?.quote.requestId,\n ],\n (recommendedQuote, sortedQuotes, requestId) =>\n sortedQuotes.find((quote) => quote.quote.requestId === requestId) ??\n recommendedQuote,\n);\n\nconst selectIsQuoteGoingToRefresh = createBridgeSelector(\n [\n selectBridgeFeatureFlags,\n // If at least one quote request is sufficiently funded, continue polling until max refresh count is reached\n (state) =>\n state.quoteRequest.every((quoteRequest) =>\n Boolean(quoteRequest.insufficientBal),\n ),\n (state) => state.quotesRefreshCount,\n ],\n (featureFlags, insufficientBal, quotesRefreshCount) =>\n insufficientBal ? false : featureFlags.maxRefreshCount > quotesRefreshCount,\n);\n\nconst selectQuoteRefreshRate = createBridgeSelector(\n [selectBridgeFeatureFlags, (state) => state.quoteRequest[0]?.srcChainId],\n (featureFlags, srcChainId) =>\n (srcChainId\n ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : featureFlags.refreshRate) ?? featureFlags.refreshRate,\n);\n\nexport const selectIsQuoteExpired = createBridgeSelector(\n [\n selectIsQuoteGoingToRefresh,\n ({ quotesLastFetched }) => quotesLastFetched,\n selectQuoteRefreshRate,\n (_, _ignoredParam, currentTimeInMs: number) => currentTimeInMs,\n ],\n (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) =>\n Boolean(\n !isQuoteGoingToRefresh &&\n quotesLastFetched &&\n currentTimeInMs - quotesLastFetched > refreshRate,\n ),\n);\n\n/**\n * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change\n * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBridgeQuotes(\n * { ...state.metamask, bridgeConfig: remoteFeatureFlags.bridgeConfig },\n * {\n * sortOrder: state.bridge.sortOrder,\n * selectedQuote: state.bridge.selectedQuote,\n * migrationPhase: '1.5',\n * }\n * ));\n * ```\n */\nexport const selectBridgeQuotes = createStructuredBridgeSelector({\n sortedQuotes: selectSortedBridgeQuotes,\n recommendedQuote: selectRecommendedQuote,\n activeQuote: selectActiveQuote,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n\nconst selectRecommendedQuotes = createBridgeSelector(\n [\n selectSortedBridgeQuotes,\n (_, { requestCount }: { requestCount: number }) => requestCount,\n ],\n (quotes, requestCount) =>\n quotes.reduce((acc, quote) => {\n const requestIndex = quote.quoteRequestIndex ?? 0;\n acc[requestIndex] ??= quote;\n return acc;\n }, Array<QuoteResponse | null>(requestCount).fill(null)),\n);\n\nconst selectDestAmountSum = createBridgeSelector(\n [selectRecommendedQuotes],\n (recommendedQuotes) => {\n return sumAmounts(recommendedQuotes.map((quote) => quote?.quote.dest));\n },\n);\n\nconst selectMinDestAmountSum = createBridgeSelector(\n [selectDestAmountSum],\n (destAmountSum): DeepPartial<QuoteResponse['quote']['dest']> | undefined => {\n if (!destAmountSum) {\n return undefined;\n }\n\n const {\n minAmount,\n minAmountNormalized,\n minAmountValueInCurrency,\n minAmountUsd,\n asset,\n } = destAmountSum;\n\n return {\n amount: minAmount,\n normalizedAmount: minAmountNormalized,\n valueInCurrency: minAmountValueInCurrency,\n usd: minAmountUsd,\n asset,\n };\n },\n);\n\n/**\n * Selects the recommended swap quotes for a batch of quote requests.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param requestCount - The number of quote requests fetched in the batch\n * @returns The quotes for multiple quote requests, including their recommendedQuotes,\n * totalReceived, minimumReceived, totalNetworkFee, and other quote fetching metadata.\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBatchSellQuotes(\n * { ...state.metamask },\n * {\n * sortOrder: state.bridge.sortOrder,\n * requestCount: 4,\n * }\n * ));\n * ```\n */\nexport const selectBatchSellQuotes = createStructuredBridgeSelector({\n recommendedQuotes: selectRecommendedQuotes,\n totalReceived: selectDestAmountSum,\n minimumReceived: selectMinDestAmountSum,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n\nconst selectBatchSellFees = createBridgeSelector(\n [\n (state) => state.batchSellTrades?.fee?.amount,\n (state) => state.batchSellTrades?.fee?.asset,\n (state) =>\n selectExchangeRateByAssetId(\n state,\n state.batchSellTrades?.fee?.asset?.assetId,\n ),\n ],\n (feeAmount, feeAsset, exchangeRate) => {\n return feeAmount && feeAsset && exchangeRate\n ? calcBatchFees(feeAmount, feeAsset, exchangeRate)\n : undefined;\n },\n);\n\n/**\n * Selects the batch transactions and fees for a batch of quotes\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @returns The total transaction fees and whether the batch sell trades are submittable.\n *\n * @example\n * ```ts\n * const { totalNetworkFee, isBatchSellTradeAvailable } = useSelector(state => selectBatchSellTrades(state.metamask));\n * ```\n */\nexport const selectBatchSellTrades = createBridgeSelector(\n [\n (state) => state.batchSellTradesLoadingStatus === RequestStatus.FETCHED,\n (state) => state.batchSellTrades,\n selectBatchSellFees,\n (state) => state.batchSellTradesLoadingStatus === RequestStatus.LOADING,\n ],\n (isBatchSellTradeAvailable, batchSellTrades, batchFees, isLoading) => {\n return {\n totalNetworkFee: batchFees,\n /**\n * Whether the batch sell trades have been fetched and transactions are ready to be submitted\n */\n isBatchSellTradeAvailable:\n isBatchSellTradeAvailable &&\n Boolean(batchSellTrades?.transactions?.length),\n isLoading,\n };\n },\n);\n\nexport const selectMinimumBalanceForRentExemptionInSOL = (\n state: BridgeAppState,\n) =>\n new BigNumber(state.minimumBalanceForRentExemptionInLamports ?? 0)\n .div(10 ** 9)\n .toString();\n\nexport const selectTokenWarnings = (state: BridgeAppState) =>\n state.tokenWarnings;\n\nexport const selectDefaultSlippagePercentage = createBridgeSelector(\n [\n (state) => selectBridgeFeatureFlags(state).chains,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.srcTokenAddress,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.destTokenAddress,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.srcChainId\n ? formatChainIdToCaip(slippageParams.srcChainId)\n : undefined,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.destChainId\n ? formatChainIdToCaip(slippageParams.destChainId)\n : undefined,\n ],\n (\n featureFlagsByChain,\n srcTokenAddress,\n destTokenAddress,\n srcChainId,\n destChainId,\n ) => {\n return getDefaultSlippagePercentage(\n {\n srcTokenAddress,\n destTokenAddress,\n srcChainId,\n destChainId,\n },\n srcChainId ? featureFlagsByChain[srcChainId]?.stablecoins : undefined,\n destChainId ? featureFlagsByChain[destChainId]?.stablecoins : undefined,\n );\n },\n);\n"]}
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { getAddress } from '@ethersproject/address';\nimport type {\n CurrencyRateState,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n} from '@metamask/assets-controllers';\nimport type {\n GasFeeEstimates,\n GasFeeEstimatesByChainId,\n} from '@metamask/gas-fee-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { isStrictHexString, parseCaipAssetType } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash-es';\nimport {\n createSelector as createSelector_,\n createStructuredSelector as createStructuredSelector_,\n} from 'reselect';\n\nimport { BRIDGE_PREFERRED_GAS_ESTIMATE } from './constants/bridge.js';\nimport type {\n BridgeControllerState,\n DeepPartial,\n ExchangeRate,\n} from './types.js';\nimport { RequestStatus, SortOrder } from './types.js';\nimport {\n getNativeAssetForChainId,\n isNativeAddress,\n isNonEvmChainId,\n} from './utils/bridge.js';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters.js';\nimport { processFeatureFlags } from './utils/feature-flags.js';\nimport { sumAmounts } from './utils/number-formatters.js';\nimport {\n calcBatchFees,\n calcQuoteMetadata,\n} from './utils/quote-metadata/calculators.js';\nimport { mergeQuoteMetadata } from './utils/quote-metadata/merge.js';\nimport { toCurrencyValues } from './utils/quote-metadata/to-currency-values.js';\nimport type { QuoteMetadata } from './utils/quote-metadata/types.js';\nimport { QuoteMetadataMigrationPhase } from './utils/quote-metadata/types.js';\nimport { getDefaultSlippagePercentage } from './utils/slippage.js';\nimport type { QuoteResponse } from './validators/quote-response.js';\n\nconst EMPTY_QUOTE_METADATA: never[] = [];\n\n/**\n * The controller states that provide exchange rates\n */\ntype ExchangeRateControllerState = MultichainAssetsRatesControllerState &\n TokenRatesControllerState &\n CurrencyRateState &\n Pick<BridgeControllerState, 'assetExchangeRates'>;\n/**\n * The state of the bridge controller and all its dependency controllers\n */\ntype RemoteFeatureFlagControllerState = {\n remoteFeatureFlags: {\n bridgeConfig: unknown;\n };\n};\n\n/**\n * Minimal shape required for exchange-rate lookups (used by getExchangeRateByChainIdAndAddress).\n * Uses types from assets-controllers; marketData and conversionRates also accept the bridge format.\n */\nexport type ExchangeRateSourcesForLookup = Pick<\n BridgeControllerState,\n 'assetExchangeRates'\n> &\n Partial<Pick<CurrencyRateState, 'currencyRates'>> & {\n marketData?:\n | TokenRatesControllerState['marketData']\n | Record<string, Record<string, { price?: number; currency?: string }>>;\n conversionRates?:\n | MultichainAssetsRatesControllerState['conversionRates']\n | Record<string, { rate: string }>;\n };\n\nexport type BridgeAppState = BridgeControllerState & {\n gasFeeEstimatesByChainId: GasFeeEstimatesByChainId;\n} & ExchangeRateControllerState & {\n participateInMetaMetrics: boolean;\n } & RemoteFeatureFlagControllerState;\n/**\n * Creates a structured selector for the bridge controller\n */\nconst createStructuredBridgeSelector =\n createStructuredSelector_.withTypes<BridgeAppState>();\n/**\n * Creates a typed selector for the bridge controller\n */\nconst createBridgeSelector = createSelector_.withTypes<BridgeAppState>();\n/**\n * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\n sortOrder: SortOrder;\n selectedQuote: (QuoteResponse & QuoteMetadata) | null;\n migrationPhase: QuoteMetadataMigrationPhase;\n};\n\ntype EvmTokenExchangeRate = { price?: number; currency?: string };\ntype EvmTokenExchangeRates = Record<string, EvmTokenExchangeRate>;\n\nconst createFeatureFlagsSelector =\n createSelector_.withTypes<RemoteFeatureFlagControllerState>();\n\n/**\n * Selects the bridge feature flags\n *\n * @param state - The state of the bridge controller\n * @returns The bridge feature flags\n *\n * @example\n * ```ts\n * const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));\n *\n * Or\n *\n * export const selectBridgeFeatureFlags = createSelector(\n * selectRemoteFeatureFlags,\n * (remoteFeatureFlags) =>\n * selectBridgeFeatureFlagsBase({\n * bridgeConfig: remoteFeatureFlags.bridgeConfig,\n * }),\n * );\n * ```\n */\nexport const selectBridgeFeatureFlags = createFeatureFlagsSelector(\n [(state) => state.remoteFeatureFlags.bridgeConfig],\n (bridgeConfig: unknown) => processFeatureFlags(bridgeConfig),\n);\n\nconst getEvmTokenExchangeRateForAddress = (\n evmTokenExchangeRates: EvmTokenExchangeRates | undefined,\n address: string,\n): EvmTokenExchangeRate | null | undefined => {\n try {\n return isStrictHexString(address)\n ? (evmTokenExchangeRates?.[getAddress(address)] ??\n evmTokenExchangeRates?.[address.toLowerCase()])\n : null;\n } catch {\n return null;\n }\n};\n\n/**\n * Selects the asset exchange rate for a given chain and address\n *\n * @param exchangeRateSources - the controller states containing the exchange rates\n * @param assetId - the assetId to get the exchange rate for\n * @returns The asset exchange rate for the given assetId\n */\nexport const selectExchangeRateByAssetId = (\n exchangeRateSources: ExchangeRateSourcesForLookup,\n assetId?: CaipAssetType,\n): ExchangeRate => {\n if (!assetId) {\n return {};\n }\n\n const { assetExchangeRates, currencyRates, marketData, conversionRates } =\n exchangeRateSources;\n\n // If the asset exchange rate is available in the bridge controller, use it\n // This is defined if the token's rate is not available from the assets controllers\n const bridgeControllerRate =\n assetExchangeRates?.[assetId.toLowerCase() as CaipAssetType] ??\n assetExchangeRates?.[assetId];\n if (\n bridgeControllerRate?.exchangeRate &&\n bridgeControllerRate?.usdExchangeRate\n ) {\n return bridgeControllerRate;\n }\n\n const { chainId } = parseCaipAssetType(assetId);\n\n // If the chain is a non-EVM chain, use the conversion rate from the multichain assets controller\n if (isNonEvmChainId(chainId)) {\n const conversionRatesByKey = conversionRates as\n | Record<string, { rate?: string }>\n | undefined;\n const multichainAssetExchangeRate = conversionRatesByKey?.[assetId];\n const rate = multichainAssetExchangeRate?.rate;\n if (rate) {\n // The multichain rate is denominated in the user's selected currency.\n // To get a USD rate, find the user's-currency-to-USD conversion factor from any EVM native currency rate.\n const nativeCurrencyRate =\n currencyRates &&\n Object.values(currencyRates).find(\n (rateEntry) =>\n rateEntry?.conversionRate !== undefined &&\n rateEntry?.conversionRate !== null &&\n rateEntry?.usdConversionRate !== undefined &&\n rateEntry?.usdConversionRate !== null,\n );\n const usersCurrencyToUsdRate =\n nativeCurrencyRate?.conversionRate !== undefined &&\n nativeCurrencyRate?.conversionRate !== null &&\n nativeCurrencyRate?.usdConversionRate !== undefined &&\n nativeCurrencyRate?.usdConversionRate !== null\n ? new BigNumber(nativeCurrencyRate.usdConversionRate).div(\n nativeCurrencyRate.conversionRate,\n )\n : undefined;\n const usdExchangeRate = usersCurrencyToUsdRate\n ? new BigNumber(rate).times(usersCurrencyToUsdRate).toString()\n : undefined;\n return {\n exchangeRate: rate,\n usdExchangeRate,\n };\n }\n return {};\n }\n\n const address = formatAddressToCaipReference(assetId);\n\n // If the chain is an EVM chain, use the conversion rate from the currency rates controller\n if (isNativeAddress(address)) {\n const { symbol } = getNativeAssetForChainId(chainId);\n const evmNativeExchangeRate = currencyRates?.[symbol];\n if (evmNativeExchangeRate) {\n return {\n exchangeRate: evmNativeExchangeRate.conversionRate?.toString(),\n usdExchangeRate: evmNativeExchangeRate.usdConversionRate?.toString(),\n };\n }\n return {};\n }\n // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller\n if (!isNonEvmChainId(chainId)) {\n const marketDataByChain =\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion\n (marketData as Record<string, EvmTokenExchangeRates> | undefined) ?? {};\n const evmTokenExchangeRates =\n marketDataByChain[formatChainIdToHex(chainId)];\n const evmTokenExchangeRateForAddress = getEvmTokenExchangeRateForAddress(\n evmTokenExchangeRates,\n address,\n );\n const currencyKey = evmTokenExchangeRateForAddress?.currency;\n const nativeCurrencyRate =\n currencyKey !== undefined && currencyKey !== null\n ? currencyRates?.[currencyKey]\n : undefined;\n const price = evmTokenExchangeRateForAddress?.price;\n // A missing or zero price is not a usable exchange rate. Returning a \"0\"\n // rate here is harmful in two ways: it surfaces a $0 fiat value, and it\n // makes `selectIsAssetExchangeRateInState` treat the token as already\n // priced (the non-empty \"0\" string is truthy), which prevents the\n // controller from fetching the real rate. Fall through to `{}` instead so\n // the rate gets fetched from the price API.\n if (price && nativeCurrencyRate) {\n return {\n exchangeRate: new BigNumber(price)\n .multipliedBy(nativeCurrencyRate.conversionRate ?? 0)\n .toString(),\n usdExchangeRate: new BigNumber(price)\n .multipliedBy(nativeCurrencyRate.usdConversionRate ?? 0)\n .toString(),\n };\n }\n }\n\n return {};\n};\n\n/**\n * Checks whether an exchange rate is available for a given assetId\n *\n * @param state The state of the bridge controller and its dependency controllers\n * @param assetId The assetId to check\n * @returns Whether an exchange rate is available for the given chain and address\n */\nexport const selectIsAssetExchangeRateInState = (\n state: ExchangeRateSourcesForLookup,\n assetId?: CaipAssetType,\n) =>\n Boolean(selectExchangeRateByAssetId(state, assetId)?.exchangeRate) &&\n Boolean(selectExchangeRateByAssetId(state, assetId)?.usdExchangeRate);\n\n/**\n * Selects the gas fee estimates from the gas fee controller. All potential networks\n * support EIP1559 gas fees so assume that gasFeeEstimates is of type GasFeeEstimates\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param state.gasFeeEstimatesByChainId - gasEstimates by Hex ChainId\n * @param state.quotes - Fetched bridge/swap quotes\n * @returns The gas fee estimates in decGWEI\n */\nconst selectBridgeFeesPerGas = createBridgeSelector(\n [\n (state) => state.gasFeeEstimatesByChainId,\n (state) => state.quotes?.[0]?.chainId,\n ],\n (gasFeeEstimatesByChainId, srcChainId) => {\n if (!srcChainId) {\n return null;\n }\n if (isNonEvmChainId(srcChainId)) {\n return null;\n }\n // @ts-expect-error - all supported networks use this type of estimates\n const gasFeeEstimates: GasFeeEstimates | undefined =\n gasFeeEstimatesByChainId?.[\n formatChainIdToHex(srcChainId) as keyof typeof gasFeeEstimatesByChainId\n ]?.gasFeeEstimates;\n if (!gasFeeEstimates) {\n return null;\n }\n return {\n estimatedBaseFeeInDecGwei: gasFeeEstimates.estimatedBaseFee,\n feePerGasInDecGwei:\n gasFeeEstimates[BRIDGE_PREFERRED_GAS_ESTIMATE]?.suggestedMaxFeePerGas,\n maxFeePerGasInDecGwei: gasFeeEstimates.high?.suggestedMaxFeePerGas,\n };\n },\n);\n\nconst selectExchangeRateSources = createStructuredBridgeSelector({\n currencyRates: (state) => state.currencyRates,\n marketData: (state) => state.marketData,\n conversionRates: (state) => state.conversionRates,\n assetExchangeRates: (state) => state.assetExchangeRates,\n});\n\n// Selects metadata for cross-chain swap quotes\nconst selectMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectBridgeFeesPerGas,\n selectExchangeRateSources,\n ({ quoteRequest }) => quoteRequest,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (\n quotes,\n bridgeFeesPerGas,\n exchangeRateSources,\n quoteRequest,\n migrationPhase,\n ) => {\n // Return early if the migration phase is V2Only because we don't need to calculate metadata\n if (migrationPhase === QuoteMetadataMigrationPhase.V2Only) {\n return EMPTY_QUOTE_METADATA;\n }\n const { destTokenAddress, srcChainId, destChainId } = quoteRequest[0] ?? {};\n\n return quotes.map((quote) =>\n calcQuoteMetadata(quote, {\n srcTokenExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n quote.quote.src.asset.assetId,\n ),\n bridgeFeesPerGas,\n destTokenExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n quote.quote.dest.asset.assetId ??\n formatAddressToAssetId(\n destTokenAddress ?? quote.quote.dest.asset.assetId,\n destChainId,\n ),\n ),\n nativeExchangeRate: selectExchangeRateByAssetId(\n exchangeRateSources,\n getNativeAssetForChainId(srcChainId ?? quote.chainId)?.assetId,\n ),\n }),\n );\n },\n);\n\n/**\n * Selects the USD to fiat exchange rate based on the native asset's price\n *\n * @param options - The options for the selector\n * @param options.quoteRequest - The quote request\n * @returns The USD to fiat exchange rate in string format\n */\nconst selectUsdToCurrencyExchangeRate = createBridgeSelector(\n [\n selectExchangeRateSources,\n ({ quoteRequest }) =>\n getNativeAssetForChainId(quoteRequest[0]?.srcChainId ?? 1)?.assetId,\n ],\n (exchangeRateSources, nativeAssetId) => {\n const exchangeRate = selectExchangeRateByAssetId(\n exchangeRateSources,\n nativeAssetId,\n );\n return exchangeRate?.exchangeRate && exchangeRate?.usdExchangeRate\n ? new BigNumber(exchangeRate.exchangeRate)\n .div(exchangeRate.usdExchangeRate)\n .toFixed()\n : undefined;\n },\n);\n\nconst selectCurrencyValues = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectUsdToCurrencyExchangeRate,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (quotes, usdToFiatExchangeRateString, migrationPhase) => {\n if (migrationPhase === QuoteMetadataMigrationPhase.V1Data) {\n return EMPTY_QUOTE_METADATA;\n }\n const usdToFiatExchangeRate = usdToFiatExchangeRateString\n ? new BigNumber(usdToFiatExchangeRateString)\n : undefined;\n return quotes.map((quote) =>\n toCurrencyValues(quote, usdToFiatExchangeRate),\n );\n },\n);\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n selectMetadata,\n selectCurrencyValues,\n ({ quotes }) => quotes,\n (_, { migrationPhase }: BridgeQuotesClientParams) => migrationPhase,\n ],\n (legacyQuoteMetadata, quoteMetadataV2, quotes, migrationPhase) =>\n quotes.map((quote, index) =>\n mergeQuoteMetadata(\n quote,\n legacyQuoteMetadata[index],\n migrationPhase,\n quoteMetadataV2[index],\n ),\n ),\n);\n\nconst selectSortedBridgeQuotes = createBridgeSelector(\n [\n selectBridgeQuotesWithMetadata,\n (_, { sortOrder }: BridgeQuotesClientParams) => sortOrder,\n ],\n (quotesWithMetadata, sortOrder): QuoteResponse[] => {\n switch (sortOrder) {\n case SortOrder.ETA_ASC:\n return orderBy(\n quotesWithMetadata,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n );\n default:\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.cost?.valueInCurrency,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.cost?.valueInCurrency),\n 'asc',\n );\n }\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.priceImpact?.amount,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.priceImpact?.amount),\n 'asc',\n );\n }\n if (\n quotesWithMetadata.every(\n (quote) => quote.quote.priceData?.priceImpact?.valueInCurrency,\n )\n ) {\n return orderBy(\n quotesWithMetadata,\n ({ quote: { priceData } }) =>\n Number(priceData?.priceImpact?.valueInCurrency),\n 'asc',\n );\n }\n return orderBy(\n quotesWithMetadata,\n ({ quote }) => Number(quote.dest.amount),\n 'desc',\n );\n }\n },\n);\n\nconst selectRecommendedQuote = createBridgeSelector(\n [selectSortedBridgeQuotes],\n (quotes) => (quotes.length > 0 ? quotes[0] : null),\n);\n\nconst selectActiveQuote = createBridgeSelector(\n [\n selectRecommendedQuote,\n selectSortedBridgeQuotes,\n (_, { selectedQuote }) => selectedQuote?.quote.requestId,\n ],\n (recommendedQuote, sortedQuotes, requestId) =>\n sortedQuotes.find((quote) => quote.quote.requestId === requestId) ??\n recommendedQuote,\n);\n\nconst selectIsQuoteGoingToRefresh = createBridgeSelector(\n [\n selectBridgeFeatureFlags,\n // If at least one quote request is sufficiently funded, continue polling until max refresh count is reached\n (state) =>\n state.quoteRequest.every((quoteRequest) =>\n Boolean(quoteRequest.insufficientBal),\n ),\n (state) => state.quotesRefreshCount,\n ],\n (featureFlags, insufficientBal, quotesRefreshCount) =>\n insufficientBal ? false : featureFlags.maxRefreshCount > quotesRefreshCount,\n);\n\nconst selectQuoteRefreshRate = createBridgeSelector(\n [selectBridgeFeatureFlags, (state) => state.quoteRequest[0]?.srcChainId],\n (featureFlags, srcChainId) =>\n (srcChainId\n ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : featureFlags.refreshRate) ?? featureFlags.refreshRate,\n);\n\nexport const selectIsQuoteExpired = createBridgeSelector(\n [\n selectIsQuoteGoingToRefresh,\n ({ quotesLastFetched }) => quotesLastFetched,\n selectQuoteRefreshRate,\n (_, _ignoredParam, currentTimeInMs: number) => currentTimeInMs,\n ],\n (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) =>\n Boolean(\n !isQuoteGoingToRefresh &&\n quotesLastFetched &&\n currentTimeInMs - quotesLastFetched > refreshRate,\n ),\n);\n\n/**\n * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change\n * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBridgeQuotes(\n * { ...state.metamask, bridgeConfig: remoteFeatureFlags.bridgeConfig },\n * {\n * sortOrder: state.bridge.sortOrder,\n * selectedQuote: state.bridge.selectedQuote,\n * migrationPhase: '1.5',\n * }\n * ));\n * ```\n */\nexport const selectBridgeQuotes = createStructuredBridgeSelector({\n sortedQuotes: selectSortedBridgeQuotes,\n recommendedQuote: selectRecommendedQuote,\n activeQuote: selectActiveQuote,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n\nconst selectRecommendedQuotes = createBridgeSelector(\n [\n selectSortedBridgeQuotes,\n (_, { requestCount }: { requestCount: number }) => requestCount,\n ],\n (quotes, requestCount) =>\n quotes.reduce((acc, quote) => {\n const requestIndex = quote.quoteRequestIndex ?? 0;\n acc[requestIndex] ??= quote;\n return acc;\n }, Array<QuoteResponse | null>(requestCount).fill(null)),\n);\n\nconst selectDestAmountSum = createBridgeSelector(\n [selectRecommendedQuotes],\n (recommendedQuotes) => {\n return sumAmounts(recommendedQuotes.map((quote) => quote?.quote.dest));\n },\n);\n\nconst selectMinDestAmountSum = createBridgeSelector(\n [selectDestAmountSum],\n (destAmountSum): DeepPartial<QuoteResponse['quote']['dest']> | undefined => {\n if (!destAmountSum) {\n return undefined;\n }\n\n const {\n minAmount,\n minAmountNormalized,\n minAmountValueInCurrency,\n minAmountUsd,\n asset,\n } = destAmountSum;\n\n return {\n amount: minAmount,\n normalizedAmount: minAmountNormalized,\n valueInCurrency: minAmountValueInCurrency,\n usd: minAmountUsd,\n asset,\n };\n },\n);\n\n/**\n * Selects the recommended swap quotes for a batch of quote requests.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param requestCount - The number of quote requests fetched in the batch\n * @returns The quotes for multiple quote requests, including their recommendedQuotes,\n * totalReceived, minimumReceived, totalNetworkFee, and other quote fetching metadata.\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBatchSellQuotes(\n * { ...state.metamask },\n * {\n * sortOrder: state.bridge.sortOrder,\n * requestCount: 4,\n * }\n * ));\n * ```\n */\nexport const selectBatchSellQuotes = createStructuredBridgeSelector({\n recommendedQuotes: selectRecommendedQuotes,\n totalReceived: selectDestAmountSum,\n minimumReceived: selectMinDestAmountSum,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n\nconst selectBatchSellFees = createBridgeSelector(\n [\n (state) => state.batchSellTrades?.fee?.amount,\n (state) => state.batchSellTrades?.fee?.asset,\n (state) =>\n selectExchangeRateByAssetId(\n state,\n state.batchSellTrades?.fee?.asset?.assetId,\n ),\n ],\n (feeAmount, feeAsset, exchangeRate) => {\n return feeAmount && feeAsset && exchangeRate\n ? calcBatchFees(feeAmount, feeAsset, exchangeRate)\n : undefined;\n },\n);\n\n/**\n * Selects the batch transactions and fees for a batch of quotes\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @returns The total transaction fees and whether the batch sell trades are submittable.\n *\n * @example\n * ```ts\n * const { totalNetworkFee, isBatchSellTradeAvailable } = useSelector(state => selectBatchSellTrades(state.metamask));\n * ```\n */\nexport const selectBatchSellTrades = createBridgeSelector(\n [\n (state) => state.batchSellTradesLoadingStatus === RequestStatus.FETCHED,\n (state) => state.batchSellTrades,\n selectBatchSellFees,\n (state) => state.batchSellTradesLoadingStatus === RequestStatus.LOADING,\n ],\n (isBatchSellTradeAvailable, batchSellTrades, batchFees, isLoading) => {\n return {\n totalNetworkFee: batchFees,\n /**\n * Whether the batch sell trades have been fetched and transactions are ready to be submitted\n */\n isBatchSellTradeAvailable:\n isBatchSellTradeAvailable &&\n Boolean(batchSellTrades?.transactions?.length),\n isLoading,\n };\n },\n);\n\nexport const selectMinimumBalanceForRentExemptionInSOL = (\n state: BridgeAppState,\n) =>\n new BigNumber(state.minimumBalanceForRentExemptionInLamports ?? 0)\n .div(10 ** 9)\n .toString();\n\nexport const selectTokenWarnings = (state: BridgeAppState) =>\n state.tokenWarnings;\n\nexport const selectDefaultSlippagePercentage = createBridgeSelector(\n [\n (state) => selectBridgeFeatureFlags(state).chains,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.srcTokenAddress,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.destTokenAddress,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.srcChainId\n ? formatChainIdToCaip(slippageParams.srcChainId)\n : undefined,\n (_, slippageParams: Parameters<typeof getDefaultSlippagePercentage>[0]) =>\n slippageParams.destChainId\n ? formatChainIdToCaip(slippageParams.destChainId)\n : undefined,\n ],\n (\n featureFlagsByChain,\n srcTokenAddress,\n destTokenAddress,\n srcChainId,\n destChainId,\n ) => {\n return getDefaultSlippagePercentage(\n {\n srcTokenAddress,\n destTokenAddress,\n srcChainId,\n destChainId,\n },\n srcChainId ? featureFlagsByChain[srcChainId]?.stablecoins : undefined,\n destChainId ? featureFlagsByChain[destChainId]?.stablecoins : undefined,\n );\n },\n);\n"]}
|
|
@@ -11,7 +11,7 @@ import { assetIdsMatch } from './assets.js';
|
|
|
11
11
|
*/
|
|
12
12
|
export const calcNormalizedTokenAmount = (value, decimals, base = 10) => {
|
|
13
13
|
if (value === undefined || decimals === undefined || value === null) {
|
|
14
|
-
return
|
|
14
|
+
return;
|
|
15
15
|
}
|
|
16
16
|
const divisor = new BigNumber(base).pow(decimals ?? 0);
|
|
17
17
|
return new BigNumber(value, base).div(divisor).toFixed();
|
|
@@ -26,7 +26,7 @@ export const calcNormalizedTokenAmount = (value, decimals, base = 10) => {
|
|
|
26
26
|
*/
|
|
27
27
|
export const calcAtomicTokenAmount = (value, decimals, base = 10) => {
|
|
28
28
|
if (value === undefined || decimals === undefined || value === null) {
|
|
29
|
-
return
|
|
29
|
+
return;
|
|
30
30
|
}
|
|
31
31
|
const divisor = new BigNumber(base).pow(decimals);
|
|
32
32
|
return new BigNumber(value, base).times(divisor).toFixed();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-formatters.js","sourceRoot":"","sources":["../../src/utils/number-formatters.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAA4C,EAC5C,QAA4B,EAC5B,IAAI,GAAW,EAAE,EACjB,EAAE;IACF,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpE,OAAO
|
|
1
|
+
{"version":3,"file":"number-formatters.js","sourceRoot":"","sources":["../../src/utils/number-formatters.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { BigNumber } from 'bignumber.js';\n\nimport type { DeepPartial } from '../types.js';\nimport type { QuoteResponse } from '../validators/quote-response.js';\nimport { assetIdsMatch } from './assets.js';\n\n/**\n * 1500000 -> 1.5\n *\n * @param value - The value to convert to token amount\n * @param decimals - The number of decimals to convert to\n * @param base - The base of the number system to use\n * @returns The token amount in string format\n */\nexport const calcNormalizedTokenAmount = (\n value: string | BigNumber | undefined | null,\n decimals: number | undefined,\n base: number = 10,\n) => {\n if (value === undefined || decimals === undefined || value === null) {\n return;\n }\n const divisor = new BigNumber(base).pow(decimals ?? 0);\n return new BigNumber(value, base).div(divisor).toFixed();\n};\n\n/**\n * 1.5 -> 1500000\n *\n * @param value - The amount to convert to token value\n * @param decimals - The number of decimals to convert to\n * @param base - The base of the number system to use\n * @returns The token value in string format\n */\nexport const calcAtomicTokenAmount = (\n value: string | BigNumber | undefined | null,\n decimals: number | undefined,\n base: number = 10,\n) => {\n if (value === undefined || decimals === undefined || value === null) {\n return;\n }\n const divisor = new BigNumber(base).pow(decimals);\n return new BigNumber(value, base).times(divisor).toFixed();\n};\n\n/**\n * @deprecated No longer used\n * @param estimatedProcessingTimeInSeconds - The estimated processing time in seconds\n * @returns The estimated processing time in minutes\n */\nexport const formatEtaInMinutes = (\n estimatedProcessingTimeInSeconds: number,\n) => {\n if (estimatedProcessingTimeInSeconds < 60) {\n return `< 1`;\n }\n return (estimatedProcessingTimeInSeconds / 60).toFixed();\n};\n\n/**\n * Keys that require the asset to be the same for all fees\n */\nconst AMOUNT_KEYS = [\n 'amount' as const,\n 'normalizedAmount' as const,\n 'minAmount' as const,\n 'minAmountNormalized' as const,\n];\n\n/**\n * Keys that can be aggregated across all fees\n */\nconst FIAT_OR_USD_KEYS = [\n 'valueInCurrency' as const,\n 'usd' as const,\n 'minAmountValueInCurrency' as const,\n 'minAmountUsd' as const,\n];\n\nconst KEYS = [...AMOUNT_KEYS, ...FIAT_OR_USD_KEYS];\n\n/**\n * Groups amounts by matching assetId and sums amount and fiat keys within each group.\n *\n * @param maybeFees - The list of fees to aggregate\n * @returns One dest object per unique asset, or undefined if no fees are provided\n */\nexport const sumAmountsByAssetId = (\n ...maybeFees: (\n | (DeepPartial<QuoteResponse['quote']['dest']> | undefined | null)[]\n | undefined\n )[]\n): DeepPartial<QuoteResponse['quote']['dest']>[] => {\n const fees = maybeFees\n .flat()\n .flat()\n .filter(\n (value): value is Partial<QuoteResponse['quote']['dest']> =>\n value !== undefined && value !== null,\n );\n\n if (fees.length === 0) {\n return [];\n }\n\n return fees.reduce<DeepPartial<QuoteResponse['quote']['dest']>[]>(\n (acc, fee) => {\n const feeIndex = acc.findIndex(({ asset }) =>\n assetIdsMatch(asset?.assetId, fee.asset?.assetId),\n );\n\n if (feeIndex === -1) {\n return [...acc, { ...fee }];\n }\n\n const aggregatedFees = { ...acc[feeIndex] };\n KEYS.forEach((key) => {\n const value = fee[key];\n if (value) {\n aggregatedFees[key] = new BigNumber(aggregatedFees[key] ?? 0)\n .plus(value)\n .toFixed();\n }\n });\n\n return [\n ...acc.slice(0, feeIndex),\n aggregatedFees,\n ...acc.slice(feeIndex + 1),\n ];\n },\n [],\n );\n};\n\n/**\n * Aggregates a list of amounts into a single fee object. If fees have different assets,\n * the returned object will only aggregate the usd and valueInCurrency values.\n *\n * @param maybeFees - The list of fees to aggregate\n * @returns The aggregated fee object, or null if no fees are provided\n */\nexport const sumAmounts = (\n ...maybeFees: (\n | (DeepPartial<QuoteResponse['quote']['dest']> | undefined | null)[]\n | undefined\n )[]\n): DeepPartial<QuoteResponse['quote']['dest']> | undefined => {\n const fees = maybeFees\n .flat()\n .flat()\n .filter(\n (value): value is Partial<QuoteResponse['quote']['dest']> =>\n value !== undefined && value !== null,\n );\n\n if (!fees || fees.length === 0) {\n return undefined;\n }\n\n /**\n * Fees and prices can be denominated in different assets, so we need to check if all fees have the same units\n */\n const isSameAssetForAllFees = fees.reduce(\n (acc, fee) =>\n acc && assetIdsMatch(fee.asset?.assetId, fees[0]?.asset?.assetId),\n true,\n );\n\n return fees.reduce((acc, fee) => {\n const newAcc = { ...acc };\n if (isSameAssetForAllFees && fee.asset) {\n newAcc.asset = fee.asset;\n }\n\n AMOUNT_KEYS.forEach((key) => {\n const value = fee[key];\n if (value && isSameAssetForAllFees) {\n newAcc[key] = new BigNumber(acc[key] ?? 0).plus(value).toFixed();\n }\n });\n\n FIAT_OR_USD_KEYS.forEach((key) => {\n const value = fee[key];\n if (value) {\n newAcc[key] = new BigNumber(acc[key] ?? 0).plus(value).toFixed();\n }\n });\n\n return newAcc;\n }, {});\n};\n"]}
|
package/dist/utils/quote-fees.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-fees.js","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport type { CaipChainId } from '@metamask/utils';\n\nimport { CHAIN_IDS } from '../constants/chains.js';\nimport type {\n L1GasFees,\n NonEvmFees,\n BridgeControllerMessenger,\n} from '../types.js';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1.js';\nimport { isTronTrade } from '../validators/trade.js';\nimport type { TxData } from '../validators/trade.js';\nimport { isNonEvmChainId, sumHexes } from './bridge.js';\nimport { formatChainIdToCaip, formatChainIdToHex } from './caip-formatters.js';\nimport { computeFeeRequest } from './snaps.js';\nimport { extractTradeData } from './trade-utils.js';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param chainId - The CAIP srcChainId of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n): Promise<(QuoteType & L1GasFees)[] | undefined> => {\n // Indicates whether some of the quotes are not for optimism or base\n const hasInvalidQuotes = ![CHAIN_IDS.OPTIMISM, CHAIN_IDS.BASE]\n .map(formatChainIdToCaip)\n .includes(chainId);\n\n // Only append L1 gas fees if all quotes are for either optimism or base\n if (hasInvalidQuotes) {\n return undefined;\n }\n\n const hexChainId = formatChainIdToHex(chainId);\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, approval } = quoteResponse;\n\n const getTxParams = (txData: TxData) => ({\n from: txData.from,\n to: txData.to,\n value: txData.value,\n data: txData.data,\n gasLimit: txData.gasLimit?.toString(),\n });\n const approvalL1GasFees = approval\n ? await getLayer1GasFee({\n transactionParams: getTxParams(approval as TxData),\n chainId: hexChainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId: hexChainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return undefined;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteType & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n if (quotesWithL1GasFees.length) {\n return quotesWithL1GasFees;\n }\n return undefined;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param chainId - The CAIP chain ID of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n messenger: BridgeControllerMessenger,\n selectedAccount?: InternalAccount,\n): Promise<(QuoteType & NonEvmFees)[] | undefined> => {\n if (!isNonEvmChainId(chainId)) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade } = quoteResponse;\n\n // Skip fee computation if no snap account or trade data\n if (!selectedAccount?.metadata?.snap?.id || !trade) {\n return quoteResponse;\n }\n\n try {\n const transaction = extractTradeData(trade);\n\n // Tron trades need the visible flag and contract type to be included in the request options\n const options = isTronTrade(trade)\n ? {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n feeLimit: trade.raw_data?.fee_limit,\n }\n : undefined;\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount?.metadata?.snap?.id,\n transaction,\n selectedAccount?.id,\n chainId,\n options,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n // Bitcoin snap returns 'priority' fee, Solana returns 'base' fee\n const fee =\n response?.find((f) => f.type === 'base') ||\n response?.find((f) => f.type === 'priority') ||\n response?.[0];\n const feeInNative = fee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n } catch (error) {\n // Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)\n // Client can render special UI or skip the quote card row for quotes with missing fee data\n console.error(\n `Failed to compute non-EVM fees for quote ${quoteResponse.quoteId ?? ''}`,\n error,\n );\n return {\n ...quoteResponse,\n nonEvmFeesInNative: undefined,\n };\n }\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteType & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param chainId - The CAIP chain ID of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount?: InternalAccount,\n): Promise<(QuoteType & L1GasFees & NonEvmFees)[]> => {\n // Safe to cast: appendL1GasFees checks if all quotes are EVM and returns undefined otherwise\n const quotesWithL1GasFees = await appendL1GasFees(\n chainId,\n quotes,\n getLayer1GasFee,\n );\n\n const quotesWithNonEvmFees = await appendNonEvmFees(\n chainId,\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"quote-fees.js","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport type { CaipChainId } from '@metamask/utils';\n\nimport { CHAIN_IDS } from '../constants/chains.js';\nimport type {\n L1GasFees,\n NonEvmFees,\n BridgeControllerMessenger,\n} from '../types.js';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1.js';\nimport { isTronTrade } from '../validators/trade.js';\nimport type { TxData } from '../validators/trade.js';\nimport { isNonEvmChainId, sumHexes } from './bridge.js';\nimport { formatChainIdToCaip, formatChainIdToHex } from './caip-formatters.js';\nimport { computeFeeRequest } from './snaps.js';\nimport { extractTradeData } from './trade-utils.js';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param chainId - The CAIP srcChainId of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n): Promise<(QuoteType & L1GasFees)[] | undefined> => {\n // Indicates whether some of the quotes are not for optimism or base\n const hasInvalidQuotes = ![CHAIN_IDS.OPTIMISM, CHAIN_IDS.BASE]\n .map(formatChainIdToCaip)\n .includes(chainId);\n\n // Only append L1 gas fees if all quotes are for either optimism or base\n if (hasInvalidQuotes) {\n return undefined;\n }\n\n const hexChainId = formatChainIdToHex(chainId);\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, approval } = quoteResponse;\n\n const getTxParams = (txData: TxData) => ({\n from: txData.from,\n to: txData.to,\n value: txData.value,\n data: txData.data,\n gasLimit: txData.gasLimit?.toString(),\n });\n const approvalL1GasFees = approval\n ? await getLayer1GasFee({\n transactionParams: getTxParams(approval as TxData),\n chainId: hexChainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId: hexChainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteType & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n if (quotesWithL1GasFees.length) {\n return quotesWithL1GasFees;\n }\n return undefined;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param chainId - The CAIP chain ID of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n messenger: BridgeControllerMessenger,\n selectedAccount?: InternalAccount,\n): Promise<(QuoteType & NonEvmFees)[] | undefined> => {\n if (!isNonEvmChainId(chainId)) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade } = quoteResponse;\n\n // Skip fee computation if no snap account or trade data\n if (!selectedAccount?.metadata?.snap?.id || !trade) {\n return quoteResponse;\n }\n\n try {\n const transaction = extractTradeData(trade);\n\n // Tron trades need the visible flag and contract type to be included in the request options\n const options = isTronTrade(trade)\n ? {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n feeLimit: trade.raw_data?.fee_limit,\n }\n : undefined;\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount?.metadata?.snap?.id,\n transaction,\n selectedAccount?.id,\n chainId,\n options,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n // Bitcoin snap returns 'priority' fee, Solana returns 'base' fee\n const fee =\n response?.find((f) => f.type === 'base') ||\n response?.find((f) => f.type === 'priority') ||\n response?.[0];\n const feeInNative = fee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n } catch (error) {\n // Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)\n // Client can render special UI or skip the quote card row for quotes with missing fee data\n console.error(\n `Failed to compute non-EVM fees for quote ${quoteResponse.quoteId ?? ''}`,\n error,\n );\n return {\n ...quoteResponse,\n nonEvmFeesInNative: undefined,\n };\n }\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteType & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param chainId - The CAIP chain ID of the quotes\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async <\n QuoteType extends Omit<QuoteResponseV1, 'quote'>,\n>(\n chainId: CaipChainId,\n quotes: QuoteType[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount?: InternalAccount,\n): Promise<(QuoteType & L1GasFees & NonEvmFees)[]> => {\n // Safe to cast: appendL1GasFees checks if all quotes are EVM and returns undefined otherwise\n const quotesWithL1GasFees = await appendL1GasFees(\n chainId,\n quotes,\n getLayer1GasFee,\n );\n\n const quotesWithNonEvmFees = await appendNonEvmFees(\n chainId,\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|
|
@@ -86,7 +86,7 @@ export const calcRelayerFee = (sentAmount, quoteResponse, { exchangeRate, usdExc
|
|
|
86
86
|
relayerFeeInNative = relayerFeeInNative?.minus(sentAmount.amount ?? '0');
|
|
87
87
|
}
|
|
88
88
|
if (relayerFeeInNative?.lte(0)) {
|
|
89
|
-
return
|
|
89
|
+
return;
|
|
90
90
|
}
|
|
91
91
|
return {
|
|
92
92
|
amount: relayerFeeInNative?.toFixed(),
|
|
@@ -168,7 +168,7 @@ export const calcTotalEstimatedNetworkFee = (gasFee, relayerFee) => {
|
|
|
168
168
|
// Gas is included for some swap quotes and this is the value displayed in the client
|
|
169
169
|
export const calcIncludedTxFees = ({ gasIncluded, gasIncluded7702, srcAsset, feeData: { txFee }, }, srcTokenExchangeRate, destTokenExchangeRate) => {
|
|
170
170
|
if (!txFee || !(gasIncluded || gasIncluded7702)) {
|
|
171
|
-
return
|
|
171
|
+
return;
|
|
172
172
|
}
|
|
173
173
|
// Use exchange rate of the token that is being used to pay for the transaction
|
|
174
174
|
const { exchangeRate, usdExchangeRate } = assetIdsMatch(txFee?.asset?.assetId, srcAsset.assetId)
|
|
@@ -253,7 +253,7 @@ export const calcSlippagePercentage = (adjustedReturn, sentAmount) => {
|
|
|
253
253
|
*/
|
|
254
254
|
export const calcPriceImpact = (quote) => {
|
|
255
255
|
if (!quote?.sentAmount || !quote?.toTokenAmount) {
|
|
256
|
-
return
|
|
256
|
+
return;
|
|
257
257
|
}
|
|
258
258
|
const sourceFiat = quote.sentAmount.valueInCurrency;
|
|
259
259
|
const destFiat = quote.toTokenAmount.valueInCurrency;
|
|
@@ -267,7 +267,7 @@ export const calcPriceImpact = (quote) => {
|
|
|
267
267
|
? new BigNumber(sourceUsd).minus(destUsd).abs().toFixed()
|
|
268
268
|
: undefined;
|
|
269
269
|
if (!valueInCurrency && !usd) {
|
|
270
|
-
return
|
|
270
|
+
return;
|
|
271
271
|
}
|
|
272
272
|
return {
|
|
273
273
|
valueInCurrency,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculators.js","sourceRoot":"","sources":["../../../src/utils/quote-metadata/calculators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n convertHexToDecimal,\n toHex,\n weiHexToGweiDec,\n} from '@metamask/controller-utils';\nimport { is } from '@metamask/superstruct';\nimport { BigNumber } from 'bignumber.js';\n\nimport { toQuoteResponseV1 } from '../../coercers/quote-response-v2-to-v1.js';\nimport type {\n L1GasFees,\n ExchangeRate,\n NonEvmFees,\n DeepPartial,\n} from '../../types.js';\nimport type { BridgeAsset } from '../../validators/bridge-asset.js';\nimport { FloatStringSchema } from '../../validators/number.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport { isQuoteResponseV2 } from '../../validators/quote-response.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport type { TxData } from '../../validators/trade.js';\nimport { assetIdsMatch } from '../assets.js';\nimport { isEvmQuoteResponse, isNativeAddress } from '../bridge.js';\nimport { calcNormalizedTokenAmount } from '../number-formatters.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\nimport type { QuoteMetadata, TokenAmountValues } from './types.js';\n\nexport const calcNonEvmTotalNetworkFee = (\n bridgeQuote: QuoteResponseV1 & NonEvmFees,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { nonEvmFeesInNative } = bridgeQuote;\n // Fees are now stored directly in native units (SOL, BTC) without conversion\n const feeInNative = nonEvmFeesInNative\n ? new BigNumber(nonEvmFeesInNative)\n : undefined;\n\n return {\n amount: feeInNative?.toFixed(),\n valueInCurrency: exchangeRate && feeInNative?.times(exchangeRate).toFixed(),\n usd: usdExchangeRate && feeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string | undefined,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const maybeNormalizedDestAmount = calcNormalizedTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n const normalizedDestAmount = maybeNormalizedDestAmount\n ? new BigNumber(maybeNormalizedDestAmount)\n : undefined;\n return {\n amount: normalizedDestAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedDestAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedDestAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData, intent }: QuoteResponseV1['quote'],\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n isQuoteV2: boolean = false,\n) => {\n // For intent-based swaps or converted V2 quote responses, srcTokenAmount is the total\n // fixed commitment the user makes to the protocol — the protocol fee is\n // already baked in. Adding feeData fees on top would double-count them.\n // For conventional swaps, srcTokenAmount is the net routing amount (fees\n // excluded), so the src-token fees must be added to get the wallet deduction.\n const sentAmount =\n intent || isQuoteV2\n ? new BigNumber(srcTokenAmount)\n : Object.values(feeData)\n .filter(\n (fee) =>\n fee?.amount &&\n assetIdsMatch(fee.asset?.assetId, srcAsset.assetId),\n )\n .reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const maybeNormalizedSentAmount = calcNormalizedTokenAmount(\n sentAmount,\n srcAsset.decimals,\n );\n const normalizedSentAmount = maybeNormalizedSentAmount\n ? new BigNumber(maybeNormalizedSentAmount)\n : undefined;\n\n return {\n amount: normalizedSentAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedSentAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedSentAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcBatchFees = (\n amount: string,\n asset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const maybeNormalizedAmount = calcNormalizedTokenAmount(\n amount,\n asset.decimals,\n );\n const normalizedAmount = maybeNormalizedAmount\n ? new BigNumber(maybeNormalizedAmount)\n : undefined;\n\n return {\n amount: normalizedAmount?.toFixed(),\n valueInCurrency: exchangeRate\n ? normalizedAmount?.times(exchangeRate).toFixed()\n : null,\n usd: usdExchangeRate\n ? normalizedAmount?.times(usdExchangeRate).toFixed()\n : null,\n asset,\n };\n};\n\nexport const calcRelayerFee = (\n sentAmount: ReturnType<typeof calcSentAmount>,\n quoteResponse: QuoteResponseV1<TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = trade.value\n ? new BigNumber(convertHexToDecimal(trade.value))\n : undefined;\n const maybeNormalizedRelayerFee = relayerFeeAmount\n ? calcNormalizedTokenAmount(relayerFeeAmount.toFixed(), 18)\n : undefined;\n let relayerFeeInNative = maybeNormalizedRelayerFee\n ? new BigNumber(maybeNormalizedRelayerFee)\n : undefined;\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.assetId)) {\n relayerFeeInNative = relayerFeeInNative?.minus(sentAmount.amount ?? '0');\n }\n\n if (relayerFeeInNative?.lte(0)) {\n return undefined;\n }\n\n return {\n amount: relayerFeeInNative?.toFixed(),\n valueInCurrency:\n exchangeRate && relayerFeeInNative?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && relayerFeeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nconst calcTotalGasFee = ({\n approvalGasLimit,\n resetApprovalGasLimit,\n tradeGasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n}: {\n approvalGasLimit?: number | null;\n resetApprovalGasLimit?: number | null;\n tradeGasLimit?: number | null;\n l1GasFeesInHexWei?: string | null;\n feePerGasInDecGwei?: string;\n nativeToDisplayCurrencyExchangeRate?: string;\n nativeToUsdExchangeRate?: string;\n}) => {\n const totalGasLimitInDec =\n tradeGasLimit || approvalGasLimit || resetApprovalGasLimit\n ? new BigNumber(tradeGasLimit?.toFixed() ?? '0')\n .plus(approvalGasLimit?.toFixed() ?? '0')\n .plus(resetApprovalGasLimit?.toFixed() ?? '0')\n : undefined;\n\n const l1GasFeesInDecGWei = l1GasFeesInHexWei\n ? weiHexToGweiDec(toHex(l1GasFeesInHexWei))\n : undefined;\n\n const gasFeesInDecGwei = totalGasLimitInDec\n ? totalGasLimitInDec\n ?.times(feePerGasInDecGwei ?? '0')\n ?.plus(l1GasFeesInDecGWei ?? '0')\n : undefined;\n const gasFeesInDecEth = gasFeesInDecGwei?.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth?.times(nativeToDisplayCurrencyExchangeRate)\n : undefined;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth?.times(nativeToUsdExchangeRate)\n : undefined;\n\n return {\n amount: gasFeesInDecEth?.toFixed(),\n valueInCurrency: gasFeesInDisplayCurrency?.toFixed(),\n usd: gasFeesInUSD?.toFixed(),\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponseV1<TxData, TxData> & L1GasFees;\n feePerGasInDecGwei?: string;\n} & ExchangeRate) => {\n // Estimated total gas fee, including refunded fees (medium)\n const { amount, valueInCurrency, usd } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n return {\n total: {\n amount,\n valueInCurrency,\n usd,\n },\n };\n};\n\n/**\n * Calculates the total estimated network fees for the bridge transaction\n *\n * @param gasFee - The gas fee for the bridge transaction\n * @param gasFee.total - The fee to display to the user. If not available, this is equal to the gasLimit (total)\n * @param relayerFee - The relayer fee paid to bridge providers\n * @returns The total estimated network fee for the bridge transaction, including the relayer fee paid to bridge providers\n */\nexport const calcTotalEstimatedNetworkFee = (\n gasFee: { total?: Partial<TokenAmountValues> } | undefined,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n const { total: gasFeeToDisplay } = gasFee ?? {};\n return {\n amount:\n (gasFeeToDisplay?.amount ?? relayerFee?.amount) &&\n new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee?.amount ?? '0')\n .toFixed(),\n valueInCurrency:\n (gasFeeToDisplay?.valueInCurrency ?? relayerFee?.valueInCurrency) &&\n new BigNumber(gasFeeToDisplay?.valueInCurrency ?? '0')\n .plus(relayerFee?.valueInCurrency ?? '0')\n .toFixed(),\n usd:\n (gasFeeToDisplay?.usd ?? relayerFee?.usd) &&\n new BigNumber(gasFeeToDisplay?.usd ?? '0')\n .plus(relayerFee?.usd ?? '0')\n .toFixed(),\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n {\n gasIncluded,\n gasIncluded7702,\n srcAsset,\n feeData: { txFee },\n }: QuoteResponseV1['quote'],\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return undefined;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } = assetIdsMatch(\n txFee?.asset?.assetId,\n srcAsset.assetId,\n )\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const maybeNormalizedTxFeeAmount = calcNormalizedTokenAmount(\n txFee?.amount,\n txFee?.asset.decimals,\n );\n\n const normalizedTxFeeAmount = maybeNormalizedTxFeeAmount\n ? new BigNumber(maybeNormalizedTxFeeAmount)\n : undefined;\n\n return {\n amount: normalizedTxFeeAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedTxFeeAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate &&\n normalizedTxFeeAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: Partial<TokenAmountValues>,\n totalEstimatedNetworkFee: Partial<TokenAmountValues>,\n {\n feeData: { txFee },\n destAsset: { assetId: destAssetId },\n }: QuoteResponseV1['quote'],\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (assetIdsMatch(txFee?.asset?.assetId, destAssetId)) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency &&\n totalEstimatedNetworkFee.valueInCurrency &&\n new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toFixed(),\n usd:\n toTokenAmount.usd &&\n totalEstimatedNetworkFee.usd &&\n new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toFixed(),\n };\n};\n\nexport const calcSwapRate = (sentAmount?: string, destTokenAmount?: string) =>\n destTokenAmount && sentAmount\n ? new BigNumber(destTokenAmount).div(sentAmount).toFixed()\n : undefined;\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency &&\n sentAmount.valueInCurrency &&\n new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toFixed(),\n usd:\n adjustedReturn.usd &&\n sentAmount.usd &&\n new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toFixed(),\n});\n\n/**\n * Calculates the slippage absolute value percentage based on the adjusted return and sent amount.\n *\n * @param adjustedReturn - Adjusted return value\n * @param sentAmount - Sent amount value\n * @returns the slippage in percentage\n */\nexport const calcSlippagePercentage = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n): string | null => {\n const cost = calcCost(adjustedReturn, sentAmount);\n\n if (cost.valueInCurrency && sentAmount.valueInCurrency) {\n return new BigNumber(cost.valueInCurrency)\n .div(sentAmount.valueInCurrency)\n .times(100)\n .abs()\n .toFixed();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toFixed();\n }\n\n return null;\n};\n\n/**\n * Returns the fiat price impact for a bridge quote — the difference between\n * the source input fiat amount and the destination output fiat amount\n *\n * @param quote - The active quote\n * @returns Formatted fiat impact string, or `undefined` when either fiat value is unavailable.\n */\nexport const calcPriceImpact = (\n quote?: DeepPartial<\n Pick<QuoteMetadata, 'sentAmount' | 'toTokenAmount'>\n > | null,\n) => {\n if (!quote?.sentAmount || !quote?.toTokenAmount) {\n return undefined;\n }\n\n const sourceFiat = quote.sentAmount.valueInCurrency;\n const destFiat = quote.toTokenAmount.valueInCurrency;\n const sourceUsd = quote.sentAmount.usd;\n const destUsd = quote.toTokenAmount.usd;\n\n const isSourceFiatValid = (value: unknown): value is string[] =>\n is(value, FloatStringSchema);\n\n const valueInCurrency =\n isSourceFiatValid(sourceFiat) && isSourceFiatValid(destFiat)\n ? new BigNumber(sourceFiat).minus(destFiat).abs().toFixed()\n : undefined;\n const usd =\n isSourceFiatValid(sourceUsd) && isSourceFiatValid(destUsd)\n ? new BigNumber(sourceUsd).minus(destUsd).abs().toFixed()\n : undefined;\n\n if (!valueInCurrency && !usd) {\n return undefined;\n }\n\n return {\n valueInCurrency,\n usd,\n };\n};\n\n/**\n * Calculates quote metadata, such as converted fiat amounts and fees,\n * based on the controller state and the quote response\n *\n * @param quote - The quote response to calculate the metadata for\n * @param options - The options for the calculation\n * @param options.bridgeFeesPerGas - The bridge fees per gas\n * @param options.srcTokenExchangeRate - The exchange rate for the source token\n * @param options.destTokenExchangeRate - The exchange rate for the destination token\n * @param options.nativeExchangeRate - The exchange rate for the native token\n * @returns The calculated metadata\n */\nexport const calcQuoteMetadata = (\n quote: QuoteResponseV1 | QuoteResponse,\n options: {\n bridgeFeesPerGas: null | {\n estimatedBaseFeeInDecGwei: string | null;\n feePerGasInDecGwei?: string;\n };\n srcTokenExchangeRate: ExchangeRate;\n destTokenExchangeRate: ExchangeRate;\n nativeExchangeRate: ExchangeRate;\n },\n): QuoteMetadata => {\n const {\n bridgeFeesPerGas = {},\n srcTokenExchangeRate = {},\n destTokenExchangeRate = {},\n nativeExchangeRate = {},\n } = options;\n\n const isQuoteV2 = isQuoteResponseV2(quote);\n const quoteV1 = isQuoteV2 ? toQuoteResponseV1(quote) : quote;\n\n const sentAmount = calcSentAmount(\n quoteV1.quote,\n srcTokenExchangeRate,\n isQuoteV2,\n );\n\n const toTokenAmount = calcToAmount(\n quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n const minToTokenAmount = calcToAmount(\n quoteV1.quote.minDestTokenAmount ?? quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n\n const includedTxFees = calcIncludedTxFees(\n quoteV1.quote,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n );\n\n let totalEstimatedNetworkFee, relayerFee, gasFee;\n\n if (isEvmQuoteResponse(quoteV1)) {\n relayerFee = calcRelayerFee(sentAmount, quoteV1, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quoteV1,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n // Uses total gasFee to calculate the total estimated network fee\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);\n } else {\n // Use the new generic function for all non-EVM chains\n totalEstimatedNetworkFee = calcNonEvmTotalNetworkFee(\n quoteV1,\n nativeExchangeRate,\n );\n gasFee = {\n total: totalEstimatedNetworkFee,\n };\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n quoteV1.quote,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n // The quote has not been updated at this point, so we need to calculate the price impact using sentAmount and toTokenAmount\n const priceImpact = calcPriceImpact({ sentAmount, toTokenAmount });\n\n return {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n /**\n This is the amount required to submit all the transactions.\n Includes the relayer fee or other native fees.\n Should be used for balance checks and tx submission.\n */\n totalNetworkFee: totalEstimatedNetworkFee,\n /**\n This contains gas fee estimates for the bridge transaction\n Does not include the relayer fee (if needed), just the gasLimit and effectiveGas returned by the bridge API.\n Should only be used for display purposes.\n */\n gasFee,\n ...includeIfTruthy(adjustedReturn, { adjustedReturn }),\n ...includeIfTruthy(cost, { cost }),\n ...includeIfTruthy(includedTxFees, { includedTxFees }),\n ...includeIfTruthy(relayerFee, { relayerFee }),\n ...includeIfTruthy(priceImpact, { priceImpact }),\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"calculators.js","sourceRoot":"","sources":["../../../src/utils/quote-metadata/calculators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n convertHexToDecimal,\n toHex,\n weiHexToGweiDec,\n} from '@metamask/controller-utils';\nimport { is } from '@metamask/superstruct';\nimport { BigNumber } from 'bignumber.js';\n\nimport { toQuoteResponseV1 } from '../../coercers/quote-response-v2-to-v1.js';\nimport type {\n L1GasFees,\n ExchangeRate,\n NonEvmFees,\n DeepPartial,\n} from '../../types.js';\nimport type { BridgeAsset } from '../../validators/bridge-asset.js';\nimport { FloatStringSchema } from '../../validators/number.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport { isQuoteResponseV2 } from '../../validators/quote-response.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport type { TxData } from '../../validators/trade.js';\nimport { assetIdsMatch } from '../assets.js';\nimport { isEvmQuoteResponse, isNativeAddress } from '../bridge.js';\nimport { calcNormalizedTokenAmount } from '../number-formatters.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\nimport type { QuoteMetadata, TokenAmountValues } from './types.js';\n\nexport const calcNonEvmTotalNetworkFee = (\n bridgeQuote: QuoteResponseV1 & NonEvmFees,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { nonEvmFeesInNative } = bridgeQuote;\n // Fees are now stored directly in native units (SOL, BTC) without conversion\n const feeInNative = nonEvmFeesInNative\n ? new BigNumber(nonEvmFeesInNative)\n : undefined;\n\n return {\n amount: feeInNative?.toFixed(),\n valueInCurrency: exchangeRate && feeInNative?.times(exchangeRate).toFixed(),\n usd: usdExchangeRate && feeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string | undefined,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const maybeNormalizedDestAmount = calcNormalizedTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n const normalizedDestAmount = maybeNormalizedDestAmount\n ? new BigNumber(maybeNormalizedDestAmount)\n : undefined;\n return {\n amount: normalizedDestAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedDestAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedDestAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData, intent }: QuoteResponseV1['quote'],\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n isQuoteV2: boolean = false,\n) => {\n // For intent-based swaps or converted V2 quote responses, srcTokenAmount is the total\n // fixed commitment the user makes to the protocol — the protocol fee is\n // already baked in. Adding feeData fees on top would double-count them.\n // For conventional swaps, srcTokenAmount is the net routing amount (fees\n // excluded), so the src-token fees must be added to get the wallet deduction.\n const sentAmount =\n intent || isQuoteV2\n ? new BigNumber(srcTokenAmount)\n : Object.values(feeData)\n .filter(\n (fee) =>\n fee?.amount &&\n assetIdsMatch(fee.asset?.assetId, srcAsset.assetId),\n )\n .reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const maybeNormalizedSentAmount = calcNormalizedTokenAmount(\n sentAmount,\n srcAsset.decimals,\n );\n const normalizedSentAmount = maybeNormalizedSentAmount\n ? new BigNumber(maybeNormalizedSentAmount)\n : undefined;\n\n return {\n amount: normalizedSentAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedSentAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedSentAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcBatchFees = (\n amount: string,\n asset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const maybeNormalizedAmount = calcNormalizedTokenAmount(\n amount,\n asset.decimals,\n );\n const normalizedAmount = maybeNormalizedAmount\n ? new BigNumber(maybeNormalizedAmount)\n : undefined;\n\n return {\n amount: normalizedAmount?.toFixed(),\n valueInCurrency: exchangeRate\n ? normalizedAmount?.times(exchangeRate).toFixed()\n : null,\n usd: usdExchangeRate\n ? normalizedAmount?.times(usdExchangeRate).toFixed()\n : null,\n asset,\n };\n};\n\nexport const calcRelayerFee = (\n sentAmount: ReturnType<typeof calcSentAmount>,\n quoteResponse: QuoteResponseV1<TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = trade.value\n ? new BigNumber(convertHexToDecimal(trade.value))\n : undefined;\n const maybeNormalizedRelayerFee = relayerFeeAmount\n ? calcNormalizedTokenAmount(relayerFeeAmount.toFixed(), 18)\n : undefined;\n let relayerFeeInNative = maybeNormalizedRelayerFee\n ? new BigNumber(maybeNormalizedRelayerFee)\n : undefined;\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.assetId)) {\n relayerFeeInNative = relayerFeeInNative?.minus(sentAmount.amount ?? '0');\n }\n\n if (relayerFeeInNative?.lte(0)) {\n return;\n }\n\n return {\n amount: relayerFeeInNative?.toFixed(),\n valueInCurrency:\n exchangeRate && relayerFeeInNative?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && relayerFeeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nconst calcTotalGasFee = ({\n approvalGasLimit,\n resetApprovalGasLimit,\n tradeGasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n}: {\n approvalGasLimit?: number | null;\n resetApprovalGasLimit?: number | null;\n tradeGasLimit?: number | null;\n l1GasFeesInHexWei?: string | null;\n feePerGasInDecGwei?: string;\n nativeToDisplayCurrencyExchangeRate?: string;\n nativeToUsdExchangeRate?: string;\n}) => {\n const totalGasLimitInDec =\n tradeGasLimit || approvalGasLimit || resetApprovalGasLimit\n ? new BigNumber(tradeGasLimit?.toFixed() ?? '0')\n .plus(approvalGasLimit?.toFixed() ?? '0')\n .plus(resetApprovalGasLimit?.toFixed() ?? '0')\n : undefined;\n\n const l1GasFeesInDecGWei = l1GasFeesInHexWei\n ? weiHexToGweiDec(toHex(l1GasFeesInHexWei))\n : undefined;\n\n const gasFeesInDecGwei = totalGasLimitInDec\n ? totalGasLimitInDec\n ?.times(feePerGasInDecGwei ?? '0')\n ?.plus(l1GasFeesInDecGWei ?? '0')\n : undefined;\n const gasFeesInDecEth = gasFeesInDecGwei?.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth?.times(nativeToDisplayCurrencyExchangeRate)\n : undefined;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth?.times(nativeToUsdExchangeRate)\n : undefined;\n\n return {\n amount: gasFeesInDecEth?.toFixed(),\n valueInCurrency: gasFeesInDisplayCurrency?.toFixed(),\n usd: gasFeesInUSD?.toFixed(),\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponseV1<TxData, TxData> & L1GasFees;\n feePerGasInDecGwei?: string;\n} & ExchangeRate) => {\n // Estimated total gas fee, including refunded fees (medium)\n const { amount, valueInCurrency, usd } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n return {\n total: {\n amount,\n valueInCurrency,\n usd,\n },\n };\n};\n\n/**\n * Calculates the total estimated network fees for the bridge transaction\n *\n * @param gasFee - The gas fee for the bridge transaction\n * @param gasFee.total - The fee to display to the user. If not available, this is equal to the gasLimit (total)\n * @param relayerFee - The relayer fee paid to bridge providers\n * @returns The total estimated network fee for the bridge transaction, including the relayer fee paid to bridge providers\n */\nexport const calcTotalEstimatedNetworkFee = (\n gasFee: { total?: Partial<TokenAmountValues> } | undefined,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n const { total: gasFeeToDisplay } = gasFee ?? {};\n return {\n amount:\n (gasFeeToDisplay?.amount ?? relayerFee?.amount) &&\n new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee?.amount ?? '0')\n .toFixed(),\n valueInCurrency:\n (gasFeeToDisplay?.valueInCurrency ?? relayerFee?.valueInCurrency) &&\n new BigNumber(gasFeeToDisplay?.valueInCurrency ?? '0')\n .plus(relayerFee?.valueInCurrency ?? '0')\n .toFixed(),\n usd:\n (gasFeeToDisplay?.usd ?? relayerFee?.usd) &&\n new BigNumber(gasFeeToDisplay?.usd ?? '0')\n .plus(relayerFee?.usd ?? '0')\n .toFixed(),\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n {\n gasIncluded,\n gasIncluded7702,\n srcAsset,\n feeData: { txFee },\n }: QuoteResponseV1['quote'],\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } = assetIdsMatch(\n txFee?.asset?.assetId,\n srcAsset.assetId,\n )\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const maybeNormalizedTxFeeAmount = calcNormalizedTokenAmount(\n txFee?.amount,\n txFee?.asset.decimals,\n );\n\n const normalizedTxFeeAmount = maybeNormalizedTxFeeAmount\n ? new BigNumber(maybeNormalizedTxFeeAmount)\n : undefined;\n\n return {\n amount: normalizedTxFeeAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedTxFeeAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate &&\n normalizedTxFeeAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: Partial<TokenAmountValues>,\n totalEstimatedNetworkFee: Partial<TokenAmountValues>,\n {\n feeData: { txFee },\n destAsset: { assetId: destAssetId },\n }: QuoteResponseV1['quote'],\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (assetIdsMatch(txFee?.asset?.assetId, destAssetId)) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency &&\n totalEstimatedNetworkFee.valueInCurrency &&\n new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toFixed(),\n usd:\n toTokenAmount.usd &&\n totalEstimatedNetworkFee.usd &&\n new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toFixed(),\n };\n};\n\nexport const calcSwapRate = (sentAmount?: string, destTokenAmount?: string) =>\n destTokenAmount && sentAmount\n ? new BigNumber(destTokenAmount).div(sentAmount).toFixed()\n : undefined;\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency &&\n sentAmount.valueInCurrency &&\n new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toFixed(),\n usd:\n adjustedReturn.usd &&\n sentAmount.usd &&\n new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toFixed(),\n});\n\n/**\n * Calculates the slippage absolute value percentage based on the adjusted return and sent amount.\n *\n * @param adjustedReturn - Adjusted return value\n * @param sentAmount - Sent amount value\n * @returns the slippage in percentage\n */\nexport const calcSlippagePercentage = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n): string | null => {\n const cost = calcCost(adjustedReturn, sentAmount);\n\n if (cost.valueInCurrency && sentAmount.valueInCurrency) {\n return new BigNumber(cost.valueInCurrency)\n .div(sentAmount.valueInCurrency)\n .times(100)\n .abs()\n .toFixed();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toFixed();\n }\n\n return null;\n};\n\n/**\n * Returns the fiat price impact for a bridge quote — the difference between\n * the source input fiat amount and the destination output fiat amount\n *\n * @param quote - The active quote\n * @returns Formatted fiat impact string, or `undefined` when either fiat value is unavailable.\n */\nexport const calcPriceImpact = (\n quote?: DeepPartial<\n Pick<QuoteMetadata, 'sentAmount' | 'toTokenAmount'>\n > | null,\n) => {\n if (!quote?.sentAmount || !quote?.toTokenAmount) {\n return;\n }\n\n const sourceFiat = quote.sentAmount.valueInCurrency;\n const destFiat = quote.toTokenAmount.valueInCurrency;\n const sourceUsd = quote.sentAmount.usd;\n const destUsd = quote.toTokenAmount.usd;\n\n const isSourceFiatValid = (value: unknown): value is string[] =>\n is(value, FloatStringSchema);\n\n const valueInCurrency =\n isSourceFiatValid(sourceFiat) && isSourceFiatValid(destFiat)\n ? new BigNumber(sourceFiat).minus(destFiat).abs().toFixed()\n : undefined;\n const usd =\n isSourceFiatValid(sourceUsd) && isSourceFiatValid(destUsd)\n ? new BigNumber(sourceUsd).minus(destUsd).abs().toFixed()\n : undefined;\n\n if (!valueInCurrency && !usd) {\n return;\n }\n\n return {\n valueInCurrency,\n usd,\n };\n};\n\n/**\n * Calculates quote metadata, such as converted fiat amounts and fees,\n * based on the controller state and the quote response\n *\n * @param quote - The quote response to calculate the metadata for\n * @param options - The options for the calculation\n * @param options.bridgeFeesPerGas - The bridge fees per gas\n * @param options.srcTokenExchangeRate - The exchange rate for the source token\n * @param options.destTokenExchangeRate - The exchange rate for the destination token\n * @param options.nativeExchangeRate - The exchange rate for the native token\n * @returns The calculated metadata\n */\nexport const calcQuoteMetadata = (\n quote: QuoteResponseV1 | QuoteResponse,\n options: {\n bridgeFeesPerGas: null | {\n estimatedBaseFeeInDecGwei: string | null;\n feePerGasInDecGwei?: string;\n };\n srcTokenExchangeRate: ExchangeRate;\n destTokenExchangeRate: ExchangeRate;\n nativeExchangeRate: ExchangeRate;\n },\n): QuoteMetadata => {\n const {\n bridgeFeesPerGas = {},\n srcTokenExchangeRate = {},\n destTokenExchangeRate = {},\n nativeExchangeRate = {},\n } = options;\n\n const isQuoteV2 = isQuoteResponseV2(quote);\n const quoteV1 = isQuoteV2 ? toQuoteResponseV1(quote) : quote;\n\n const sentAmount = calcSentAmount(\n quoteV1.quote,\n srcTokenExchangeRate,\n isQuoteV2,\n );\n\n const toTokenAmount = calcToAmount(\n quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n const minToTokenAmount = calcToAmount(\n quoteV1.quote.minDestTokenAmount ?? quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n\n const includedTxFees = calcIncludedTxFees(\n quoteV1.quote,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n );\n\n let totalEstimatedNetworkFee, relayerFee, gasFee;\n\n if (isEvmQuoteResponse(quoteV1)) {\n relayerFee = calcRelayerFee(sentAmount, quoteV1, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quoteV1,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n // Uses total gasFee to calculate the total estimated network fee\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);\n } else {\n // Use the new generic function for all non-EVM chains\n totalEstimatedNetworkFee = calcNonEvmTotalNetworkFee(\n quoteV1,\n nativeExchangeRate,\n );\n gasFee = {\n total: totalEstimatedNetworkFee,\n };\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n quoteV1.quote,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n // The quote has not been updated at this point, so we need to calculate the price impact using sentAmount and toTokenAmount\n const priceImpact = calcPriceImpact({ sentAmount, toTokenAmount });\n\n return {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n /**\n This is the amount required to submit all the transactions.\n Includes the relayer fee or other native fees.\n Should be used for balance checks and tx submission.\n */\n totalNetworkFee: totalEstimatedNetworkFee,\n /**\n This contains gas fee estimates for the bridge transaction\n Does not include the relayer fee (if needed), just the gasLimit and effectiveGas returned by the bridge API.\n Should only be used for display purposes.\n */\n gasFee,\n ...includeIfTruthy(adjustedReturn, { adjustedReturn }),\n ...includeIfTruthy(cost, { cost }),\n ...includeIfTruthy(includedTxFees, { includedTxFees }),\n ...includeIfTruthy(relayerFee, { relayerFee }),\n ...includeIfTruthy(priceImpact, { priceImpact }),\n };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-currency-values.d.ts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-currency-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAiBxE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,UACpB,aAAa,0BACI,SAAS,KAChC,WAAW,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"to-currency-values.d.ts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-currency-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAiBxE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,UACpB,aAAa,0BACI,SAAS,KAChC,WAAW,CAAC,aAAa,CA4D3B,CAAC"}
|
|
@@ -35,18 +35,17 @@ export const toCurrencyValues = (quote, usdToFiatExchangeRate) => {
|
|
|
35
35
|
minAmountValueInCurrency,
|
|
36
36
|
}),
|
|
37
37
|
},
|
|
38
|
-
feeData: feeData &&
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
},
|
|
38
|
+
feeData: feeData && {
|
|
39
|
+
...Object.fromEntries(Object.values(FeeType)
|
|
40
|
+
.filter((feeType) => feeData[feeType])
|
|
41
|
+
.map((feeType) => [
|
|
42
|
+
feeType,
|
|
43
|
+
feeData[feeType]?.map((fee) => toCurrency(fee, usdToFiatExchangeRate)),
|
|
44
|
+
])),
|
|
45
|
+
...(feeData.reserve && {
|
|
46
|
+
reserve: feeData.reserve.map((reserve) => toCurrency(reserve, usdToFiatExchangeRate) ?? {}),
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
50
49
|
...((priceImpactFiat ?? adjustedReturnFiat ?? costFiat) && {
|
|
51
50
|
priceData: {
|
|
52
51
|
...(priceImpactFiat && {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-currency-values.js","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-currency-values.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,MAAM,UAAU,GAAG,CACjB,GAAsD,EACtD,qBAAiC,EACqB,EAAE;IACxD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC;IAC3C,IAAI,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACjC,OAAO,EAAE,eAAe,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAoB,EACpB,qBAAiC,EACL,EAAE;IAC9B,MAAM,EACJ,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GACzC,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,CAAC;IAE9D,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,UAAU,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAEzD,MAAM,wBAAwB,GAAG,UAAU,CACzC;QACE,GAAG,EAAE,IAAI,CAAC,YAAY;QACtB,eAAe,EAAE,IAAI,CAAC,wBAAwB;KAC/C,EACD,qBAAqB,CACtB,EAAE,eAAe,CAAC;IAEnB,OAAO;QACL,KAAK,EAAE;YACL,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC;YAC3C,IAAI,EAAE;gBACJ,GAAG,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBAC1C,GAAG,CAAC,wBAAwB,IAAI;oBAC9B,wBAAwB;iBACzB,CAAC;aACH;YACD,OAAO,
|
|
1
|
+
{"version":3,"file":"to-currency-values.js","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-currency-values.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,MAAM,UAAU,GAAG,CACjB,GAAsD,EACtD,qBAAiC,EACqB,EAAE;IACxD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC;IAC3C,IAAI,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACjC,OAAO,EAAE,eAAe,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAoB,EACpB,qBAAiC,EACL,EAAE;IAC9B,MAAM,EACJ,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GACzC,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,CAAC;IAE9D,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,UAAU,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAEzD,MAAM,wBAAwB,GAAG,UAAU,CACzC;QACE,GAAG,EAAE,IAAI,CAAC,YAAY;QACtB,eAAe,EAAE,IAAI,CAAC,wBAAwB;KAC/C,EACD,qBAAqB,CACtB,EAAE,eAAe,CAAC;IAEnB,OAAO;QACL,KAAK,EAAE;YACL,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC;YAC3C,IAAI,EAAE;gBACJ,GAAG,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBAC1C,GAAG,CAAC,wBAAwB,IAAI;oBAC9B,wBAAwB;iBACzB,CAAC;aACH;YACD,OAAO,EAAE,OAAO,IAAI;gBAClB,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;qBACnB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;qBACrC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;oBAChB,OAAO;oBACP,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CACvC;iBACF,CAAC,CACL;gBACD,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI;oBACrB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,CAC9D;iBACF,CAAC;aACH;YACD,GAAG,CAAC,CAAC,eAAe,IAAI,kBAAkB,IAAI,QAAQ,CAAC,IAAI;gBACzD,SAAS,EAAE;oBACT,GAAG,CAAC,eAAe,IAAI;wBACrB,WAAW,EAAE,eAAe;qBAC7B,CAAC;oBACF,GAAG,CAAC,kBAAkB,IAAI;wBACxB,cAAc,EAAE,kBAAkB;qBACnC,CAAC;oBACF,GAAG,CAAC,QAAQ,IAAI;wBACd,IAAI,EAAE,QAAQ;qBACf,CAAC;iBACH;aACF,CAAC;SACH;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type { DeepPartial } from '../../types.js';\nimport type { AmountsAndAsset } from '../../validators/amount-and-asset.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { FeeType } from '../../validators/quote.js';\n\nconst toCurrency = (\n fee?: Pick<AmountsAndAsset, 'usd' | 'valueInCurrency'>,\n usdToFiatExchangeRate?: BigNumber,\n): Pick<AmountsAndAsset, 'valueInCurrency'> | undefined => {\n const { usd, valueInCurrency } = fee ?? {};\n if (usd && usdToFiatExchangeRate) {\n return { valueInCurrency: usdToFiatExchangeRate.times(usd).toFixed() };\n }\n if (valueInCurrency) {\n return { valueInCurrency };\n }\n return undefined;\n};\n\n/**\n * Builds a partial {@link QuoteResponse} object with fiat values derived from the usd values provided by the bridge-api\n *\n * @param quote - The quote response to calculate the metadata for\n * @param usdToFiatExchangeRate - The usd to fiat exchange rate\n * @returns The partial {@link QuoteResponse} object with fiat values\n */\nexport const toCurrencyValues = (\n quote: QuoteResponse,\n usdToFiatExchangeRate?: BigNumber,\n): DeepPartial<QuoteResponse> => {\n const {\n quote: { src, dest, feeData, priceData },\n } = quote;\n\n const { adjustedReturn, priceImpact, cost } = priceData ?? {};\n\n const priceImpactFiat = toCurrency(priceImpact, usdToFiatExchangeRate);\n const adjustedReturnFiat = toCurrency(adjustedReturn, usdToFiatExchangeRate);\n const costFiat = toCurrency(cost, usdToFiatExchangeRate);\n\n const minAmountValueInCurrency = toCurrency(\n {\n usd: dest.minAmountUsd,\n valueInCurrency: dest.minAmountValueInCurrency,\n },\n usdToFiatExchangeRate,\n )?.valueInCurrency;\n\n return {\n quote: {\n src: toCurrency(src, usdToFiatExchangeRate),\n dest: {\n ...toCurrency(dest, usdToFiatExchangeRate),\n ...(minAmountValueInCurrency && {\n minAmountValueInCurrency,\n }),\n },\n feeData: feeData && {\n ...Object.fromEntries(\n Object.values(FeeType)\n .filter((feeType) => feeData[feeType])\n .map((feeType) => [\n feeType,\n feeData[feeType]?.map((fee) =>\n toCurrency(fee, usdToFiatExchangeRate),\n ),\n ]),\n ),\n ...(feeData.reserve && {\n reserve: feeData.reserve.map(\n (reserve) => toCurrency(reserve, usdToFiatExchangeRate) ?? {},\n ),\n }),\n },\n ...((priceImpactFiat ?? adjustedReturnFiat ?? costFiat) && {\n priceData: {\n ...(priceImpactFiat && {\n priceImpact: priceImpactFiat,\n }),\n ...(adjustedReturnFiat && {\n adjustedReturn: adjustedReturnFiat,\n }),\n ...(costFiat && {\n cost: costFiat,\n }),\n },\n }),\n },\n };\n};\n"]}
|
package/dist/utils/swaps.js
CHANGED
package/dist/utils/swaps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swaps.js","sourceRoot":"","sources":["../../src/utils/swaps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAY,EACZ,QAAyB;IAEzB,IAAI,CAAC,QAAQ,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7C,CAAC,eAAe,EAAE,EAAE,CAClB,QAAQ,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,CAC3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAY;IAClD,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,QAAiB;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO
|
|
1
|
+
{"version":3,"file":"swaps.js","sourceRoot":"","sources":["../../src/utils/swaps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAY,EACZ,QAAyB;IAEzB,IAAI,CAAC,QAAQ,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7C,CAAC,eAAe,EAAE,EAAE,CAClB,QAAQ,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,CAC3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAY;IAClD,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,QAAiB;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,OAAO;QACL,aAAa,EAAE,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,qCAAqC,CAAC;AAWlE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAY,EACZ,OAAsB,EACtB,QAAiB;IAEjB,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAC5B,OAAO,KAAK,SAAS,CAAC,SAAS;QAC7B,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC;QACnC,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE9B,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,GAAG,UAAU,aAAa,iBAAiB,SAAS,CAAC;IAEtE,MAAM,MAAM,GAAiB,MAAM,OAAO,CAAC,QAAQ,EAAE;QACnD,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,OAAO,KAAK,CAAC,OAAO,KAAK,qBAAqB,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GACpB,+BAA+B,CAC7B,OAAuD,CACxD,CAAC;IAEJ,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtC,OAAO,cAAc,CAAC;AACxB,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nimport { CHAIN_IDS } from '../constants/chains.js';\nimport {\n ALLOWED_CONTRACT_ADDRESSES,\n SWAPS_CONTRACT_ADDRESSES,\n} from '../constants/swaps.js';\nimport {\n DEFAULT_TOKEN_ADDRESS,\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP,\n} from '../constants/tokens.js';\nimport type { FetchFunction } from '../types.js';\nimport { formatChainIdToDec } from './caip-formatters.js';\n\n/**\n * Checks if the given contract address is valid for the given chain ID.\n *\n * @param chainId - The chain ID.\n * @param contract - The contract address.\n * @returns True if the contract address is valid, false otherwise.\n */\nexport function isValidSwapsContractAddress(\n chainId: Hex,\n contract: Hex | undefined,\n): boolean {\n if (!contract || !ALLOWED_CONTRACT_ADDRESSES[chainId]) {\n return false;\n }\n return ALLOWED_CONTRACT_ADDRESSES[chainId].some(\n (allowedContract) =>\n contract.toLowerCase() === allowedContract.toLowerCase(),\n );\n}\n\n/**\n * Gets the swaps contract address for the given chain ID.\n *\n * @param chainId - The chain ID.\n * @returns The swaps contract address.\n */\nexport function getSwapsContractAddress(chainId: Hex): string {\n return SWAPS_CONTRACT_ADDRESSES[chainId];\n}\n\n/**\n * Gets the client ID header.\n *\n * @param clientId - The client ID.\n * @returns The client ID header.\n */\nfunction getClientIdHeader(clientId?: string) {\n if (!clientId) {\n return;\n }\n return {\n 'X-Client-Id': clientId,\n };\n}\n\nexport const API_BASE_URL = 'https://swap.api.cx.metamask.io';\nexport const DEV_BASE_URL = 'https://swap.dev-api.cx.metamask.io';\n\nexport type SwapsToken = {\n address: string;\n symbol: string;\n name?: string;\n decimals: number;\n iconUrl?: string;\n occurrences?: number;\n};\n\n/**\n * Fetches token metadata from API URL.\n *\n * @param chainId - Current chainId.\n * @param fetchFn - Fetch function.\n * @param clientId - Client id.\n * @returns Promise resolving to an object containing token metadata.\n */\nexport async function fetchTokens(\n chainId: Hex,\n fetchFn: FetchFunction,\n clientId?: string,\n): Promise<SwapsToken[]> {\n const [apiChainId, apiBaseUrl] =\n chainId === CHAIN_IDS.LOCALHOST\n ? [CHAIN_IDS.MAINNET, DEV_BASE_URL]\n : [chainId, API_BASE_URL];\n\n const apiDecimalChainId = formatChainIdToDec(apiChainId);\n const tokenUrl = `${apiBaseUrl}/networks/${apiDecimalChainId}/tokens`;\n\n const tokens: SwapsToken[] = await fetchFn(tokenUrl, {\n headers: getClientIdHeader(clientId),\n });\n\n const filteredTokens = tokens.filter((token) => {\n return token.address !== DEFAULT_TOKEN_ADDRESS;\n });\n\n const nativeSwapsToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n filteredTokens.push(nativeSwapsToken);\n return filteredTokens;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/bridge-controller",
|
|
3
|
-
"version": "81.3.
|
|
3
|
+
"version": "81.3.3-preview-c4789fdf4",
|
|
4
4
|
"description": "Manages bridge-related quote fetching functionality for MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@ethersproject/address": "^5.
|
|
53
|
-
"@ethersproject/bignumber": "^5.
|
|
54
|
-
"@ethersproject/constants": "^5.
|
|
52
|
+
"@ethersproject/address": "^5.8.0",
|
|
53
|
+
"@ethersproject/bignumber": "^5.8.0",
|
|
54
|
+
"@ethersproject/constants": "^5.8.0",
|
|
55
55
|
"@ethersproject/contracts": "^5.7.0",
|
|
56
|
-
"@ethersproject/providers": "^5.
|
|
56
|
+
"@ethersproject/providers": "^5.8.0",
|
|
57
57
|
"@metamask/accounts-controller": "^40.0.0",
|
|
58
|
-
"@metamask/assets-controller": "^
|
|
58
|
+
"@metamask/assets-controller": "^17.0.0",
|
|
59
59
|
"@metamask/assets-controllers": "^112.0.4",
|
|
60
60
|
"@metamask/base-controller": "^10.0.0",
|
|
61
61
|
"@metamask/controller-utils": "^13.0.0",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"@metamask/profile-sync-controller": "^33.0.0",
|
|
70
70
|
"@metamask/remote-feature-flag-controller": "^7.0.0",
|
|
71
71
|
"@metamask/snaps-controllers": "^19.0.0",
|
|
72
|
-
"@metamask/transaction-controller": "^72.0.
|
|
72
|
+
"@metamask/transaction-controller": "^72.0.1",
|
|
73
73
|
"@metamask/utils": "^12.0.0",
|
|
74
74
|
"bignumber.js": "^9.1.2",
|
|
75
75
|
"reselect": "^5.1.1",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"deepmerge": "^4.3.1",
|
|
85
85
|
"jest": "^30.4.2",
|
|
86
86
|
"jest-environment-jsdom": "^30.4.1",
|
|
87
|
-
"lodash-es": "^4.
|
|
87
|
+
"lodash-es": "^4.18.1",
|
|
88
88
|
"nock": "^13.5.6",
|
|
89
89
|
"rimraf": "^6.1.3",
|
|
90
90
|
"ts-jest": "^29.4.12",
|