@metamask-previews/bridge-controller 13.0.0-preview-5867b015 → 13.0.0-preview-493eed9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +0 -15
  2. package/dist/bridge-controller.cjs +4 -59
  3. package/dist/bridge-controller.cjs.map +1 -1
  4. package/dist/bridge-controller.d.cts +3 -2
  5. package/dist/bridge-controller.d.cts.map +1 -1
  6. package/dist/bridge-controller.d.mts +3 -2
  7. package/dist/bridge-controller.d.mts.map +1 -1
  8. package/dist/bridge-controller.mjs +5 -60
  9. package/dist/bridge-controller.mjs.map +1 -1
  10. package/dist/constants/bridge.cjs +0 -1
  11. package/dist/constants/bridge.cjs.map +1 -1
  12. package/dist/constants/bridge.d.cts.map +1 -1
  13. package/dist/constants/bridge.d.mts.map +1 -1
  14. package/dist/constants/bridge.mjs +0 -1
  15. package/dist/constants/bridge.mjs.map +1 -1
  16. package/dist/index.cjs +1 -13
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +1 -10
  19. package/dist/index.d.cts.map +1 -1
  20. package/dist/index.d.mts +1 -10
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +1 -10
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/types.cjs.map +1 -1
  25. package/dist/types.d.cts +14 -44
  26. package/dist/types.d.cts.map +1 -1
  27. package/dist/types.d.mts +14 -44
  28. package/dist/types.d.mts.map +1 -1
  29. package/dist/types.mjs.map +1 -1
  30. package/dist/utils/caip-formatters.cjs +1 -25
  31. package/dist/utils/caip-formatters.cjs.map +1 -1
  32. package/dist/utils/caip-formatters.d.cts +0 -10
  33. package/dist/utils/caip-formatters.d.cts.map +1 -1
  34. package/dist/utils/caip-formatters.d.mts +0 -10
  35. package/dist/utils/caip-formatters.d.mts.map +1 -1
  36. package/dist/utils/caip-formatters.mjs +2 -25
  37. package/dist/utils/caip-formatters.mjs.map +1 -1
  38. package/dist/utils/fetch.cjs +1 -61
  39. package/dist/utils/fetch.cjs.map +1 -1
  40. package/dist/utils/fetch.d.cts +1 -21
  41. package/dist/utils/fetch.d.cts.map +1 -1
  42. package/dist/utils/fetch.d.mts +1 -21
  43. package/dist/utils/fetch.d.mts.map +1 -1
  44. package/dist/utils/fetch.mjs +0 -59
  45. package/dist/utils/fetch.mjs.map +1 -1
  46. package/dist/utils/quote.cjs +1 -177
  47. package/dist/utils/quote.cjs.map +1 -1
  48. package/dist/utils/quote.d.cts +1 -62
  49. package/dist/utils/quote.d.cts.map +1 -1
  50. package/dist/utils/quote.d.mts +1 -62
  51. package/dist/utils/quote.d.mts.map +1 -1
  52. package/dist/utils/quote.mjs +0 -164
  53. package/dist/utils/quote.mjs.map +1 -1
  54. package/package.json +4 -8
  55. package/dist/selectors.cjs +0 -214
  56. package/dist/selectors.cjs.map +0 -1
  57. package/dist/selectors.d.cts +0 -1329
  58. package/dist/selectors.d.cts.map +0 -1
  59. package/dist/selectors.d.mts +0 -1329
  60. package/dist/selectors.d.mts.map +0 -1
  61. package/dist/selectors.mjs +0 -210
  62. package/dist/selectors.mjs.map +0 -1
  63. package/dist/utils/assets.cjs +0 -30
  64. package/dist/utils/assets.cjs.map +0 -1
  65. package/dist/utils/assets.d.cts +0 -9
  66. package/dist/utils/assets.d.cts.map +0 -1
  67. package/dist/utils/assets.d.mts +0 -9
  68. package/dist/utils/assets.d.mts.map +0 -1
  69. package/dist/utils/assets.mjs +0 -25
  70. package/dist/utils/assets.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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"}
@@ -1,210 +0,0 @@
1
- import { AddressZero } from "@ethersproject/constants";
2
- import { isStrictHexString } from "@metamask/utils";
3
- import $lodash from "lodash";
4
- const { orderBy } = $lodash;
5
- import { createSelector as createSelector_, createStructuredSelector as createStructuredSelector_ } from "reselect";
6
- import { RequestStatus, SortOrder } from "./types.mjs";
7
- import { getNativeAssetForChainId, isNativeAddress, isSolanaChainId } from "./utils/bridge.mjs";
8
- import { formatAddressToAssetId, formatChainIdToCaip, formatChainIdToHex } from "./utils/caip-formatters.mjs";
9
- import { calcAdjustedReturn, calcCost, calcEstimatedAndMaxTotalGasFee, calcRelayerFee, calcSentAmount, calcSolanaTotalNetworkFee, calcSwapRate, calcToAmount, calcTotalEstimatedNetworkFee, calcTotalMaxNetworkFee } from "./utils/quote.mjs";
10
- /**
11
- * Creates a structured selector for the bridge controller
12
- */
13
- const createStructuredBridgeSelector = createStructuredSelector_.withTypes();
14
- /**
15
- * Creates a typed selector for the bridge controller
16
- */
17
- const createBridgeSelector = createSelector_.withTypes();
18
- const getExchangeRateByChainIdAndAddress = (exchangeRateSources, chainId, address) => {
19
- if (!chainId || !address) {
20
- return {};
21
- }
22
- // TODO return usd exchange rate if user has opted into metrics
23
- const assetId = formatAddressToAssetId(address, chainId);
24
- if (!assetId) {
25
- return {};
26
- }
27
- const { assetExchangeRates, currencyRates, marketData, conversionRates } = exchangeRateSources;
28
- // If the asset exchange rate is available in the bridge controller, use it
29
- // This is defined if the token's rate is not available from the assets controllers
30
- const bridgeControllerRate = assetExchangeRates?.[assetId] ??
31
- assetExchangeRates?.[assetId.toLowerCase()];
32
- if (bridgeControllerRate?.exchangeRate) {
33
- return bridgeControllerRate;
34
- }
35
- // If the chain is a Solana chain, use the conversion rate from the multichain assets controller
36
- if (isSolanaChainId(chainId)) {
37
- const multichainAssetExchangeRate = conversionRates?.[assetId];
38
- if (multichainAssetExchangeRate) {
39
- return {
40
- exchangeRate: multichainAssetExchangeRate.rate,
41
- usdExchangeRate: undefined,
42
- };
43
- }
44
- return {};
45
- }
46
- // If the chain is an EVM chain, use the conversion rate from the currency rates controller
47
- if (isNativeAddress(address)) {
48
- const { symbol } = getNativeAssetForChainId(chainId);
49
- const evmNativeExchangeRate = currencyRates?.[symbol.toLowerCase()];
50
- if (evmNativeExchangeRate) {
51
- return {
52
- exchangeRate: evmNativeExchangeRate?.conversionRate?.toString(),
53
- usdExchangeRate: evmNativeExchangeRate?.usdConversionRate?.toString(),
54
- };
55
- }
56
- return {};
57
- }
58
- // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller
59
- const evmTokenExchangeRates = marketData?.[formatChainIdToHex(chainId)];
60
- const evmTokenExchangeRateForAddress = isStrictHexString(address)
61
- ? evmTokenExchangeRates?.[address]
62
- : null;
63
- if (evmTokenExchangeRateForAddress) {
64
- return {
65
- exchangeRate: evmTokenExchangeRateForAddress?.price.toString(),
66
- usdExchangeRate: undefined,
67
- };
68
- }
69
- return {};
70
- };
71
- /**
72
- * Selects the asset exchange rate for a given chain and address
73
- *
74
- * @param state The state of the bridge controller and its dependency controllers
75
- * @param chainId The chain ID of the asset
76
- * @param address The address of the asset
77
- * @returns The asset exchange rate for the given chain and address
78
- */
79
- export const selectExchangeRateByChainIdAndAddress = (state, chainId, address) => {
80
- return getExchangeRateByChainIdAndAddress(state, chainId, address);
81
- };
82
- /**
83
- * Checks whether an exchange rate is available for a given chain and address
84
- *
85
- * @param params The parameters to pass to {@link getExchangeRateByChainIdAndAddress}
86
- * @returns Whether an exchange rate is available for the given chain and address
87
- */
88
- export const selectIsAssetExchangeRateInState = (...params) => Boolean(getExchangeRateByChainIdAndAddress(...params)?.exchangeRate);
89
- // Selects cross-chain swap quotes including their metadata
90
- const selectBridgeQuotesWithMetadata = createBridgeSelector([
91
- ({ quotes }) => quotes,
92
- (_, { bridgeFeesPerGas }) => bridgeFeesPerGas,
93
- createBridgeSelector([
94
- (state) => state,
95
- ({ quoteRequest: { srcChainId } }) => srcChainId,
96
- ({ quoteRequest: { srcTokenAddress } }) => srcTokenAddress,
97
- ], selectExchangeRateByChainIdAndAddress),
98
- createBridgeSelector([
99
- (state) => state,
100
- ({ quoteRequest: { destChainId } }) => destChainId,
101
- ({ quoteRequest: { destTokenAddress } }) => destTokenAddress,
102
- ], selectExchangeRateByChainIdAndAddress),
103
- createBridgeSelector([(state) => state, ({ quoteRequest: { srcChainId } }) => srcChainId], (state, chainId) => selectExchangeRateByChainIdAndAddress(state, chainId, AddressZero)),
104
- ], (quotes, bridgeFeesPerGas, srcTokenExchangeRate, destTokenExchangeRate, nativeExchangeRate) => {
105
- const newQuotes = quotes.map((quote) => {
106
- const sentAmount = calcSentAmount(quote.quote, srcTokenExchangeRate);
107
- const toTokenAmount = calcToAmount(quote.quote, destTokenExchangeRate);
108
- let totalEstimatedNetworkFee, gasFee, totalMaxNetworkFee, relayerFee;
109
- if (isSolanaChainId(quote.quote.srcChainId)) {
110
- totalEstimatedNetworkFee = calcSolanaTotalNetworkFee(quote, nativeExchangeRate);
111
- gasFee = totalEstimatedNetworkFee;
112
- totalMaxNetworkFee = totalEstimatedNetworkFee;
113
- }
114
- else {
115
- relayerFee = calcRelayerFee(quote, nativeExchangeRate);
116
- gasFee = calcEstimatedAndMaxTotalGasFee({
117
- bridgeQuote: quote,
118
- ...bridgeFeesPerGas,
119
- ...nativeExchangeRate,
120
- });
121
- totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);
122
- totalMaxNetworkFee = calcTotalMaxNetworkFee(gasFee, relayerFee);
123
- }
124
- const adjustedReturn = calcAdjustedReturn(toTokenAmount, totalEstimatedNetworkFee);
125
- const cost = calcCost(adjustedReturn, sentAmount);
126
- return {
127
- ...quote,
128
- // QuoteMetadata fields
129
- sentAmount,
130
- toTokenAmount,
131
- swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),
132
- totalNetworkFee: totalEstimatedNetworkFee,
133
- totalMaxNetworkFee,
134
- gasFee,
135
- adjustedReturn,
136
- cost,
137
- };
138
- });
139
- return newQuotes;
140
- });
141
- const selectSortedBridgeQuotes = createBridgeSelector([
142
- selectBridgeQuotesWithMetadata,
143
- (_, { sortOrder }) => sortOrder,
144
- ], (quotesWithMetadata, sortOrder) => {
145
- switch (sortOrder) {
146
- case SortOrder.ETA_ASC:
147
- return orderBy(quotesWithMetadata, (quote) => quote.estimatedProcessingTimeInSeconds, 'asc');
148
- default:
149
- return orderBy(quotesWithMetadata, ({ cost }) => cost.valueInCurrency ? Number(cost.valueInCurrency) : 0, 'asc');
150
- }
151
- });
152
- const selectRecommendedQuote = createBridgeSelector([selectSortedBridgeQuotes], ([recommendedQuote]) => recommendedQuote);
153
- const selectActiveQuote = createBridgeSelector([
154
- selectRecommendedQuote,
155
- (_, { selectedQuote }) => selectedQuote,
156
- ], (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote);
157
- const selectIsQuoteGoingToRefresh = (state, { featureFlagsKey }) => state.quoteRequest.insufficientBal
158
- ? false
159
- : state.quotesRefreshCount <
160
- state.bridgeFeatureFlags[featureFlagsKey].maxRefreshCount;
161
- const selectQuoteRefreshRate = createBridgeSelector([
162
- ({ bridgeFeatureFlags }, { featureFlagsKey }) => bridgeFeatureFlags[featureFlagsKey],
163
- (state) => state.quoteRequest.srcChainId,
164
- ], (featureFlags, srcChainId) => (srcChainId
165
- ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate
166
- : featureFlags.refreshRate) ?? featureFlags.refreshRate);
167
- export const selectIsQuoteExpired = createBridgeSelector([
168
- selectIsQuoteGoingToRefresh,
169
- ({ quotesLastFetched }) => quotesLastFetched,
170
- selectQuoteRefreshRate,
171
- (_, __, currentTimeInMs) => currentTimeInMs,
172
- ], (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) => Boolean(!isQuoteGoingToRefresh &&
173
- quotesLastFetched &&
174
- currentTimeInMs - quotesLastFetched > refreshRate));
175
- /**
176
- * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.
177
- *
178
- * @param state - The state of the bridge controller and its dependency controllers
179
- * @param bridgeFeesPerGas - The merged client transaction and gas controller estimates for gas
180
- * @param sortOrder - The sort order of the quotes
181
- * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change
182
- * @param featureFlagsKey - The feature flags key for the client (e.g. `BridgeFeatureFlagsKey.EXTENSION_CONFIG`
183
- * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata
184
- *
185
- * @example
186
- * ```ts
187
- * const bridgeFeesPerGas = useSelector(getGasFeeEstimates);
188
- * const quotes = useSelector(state => selectBridgeQuotes(
189
- * state.metamask,
190
- * {
191
- * bridgeFeesPerGas,
192
- * sortOrder: state.bridge.sortOrder,
193
- * selectedQuote: state.bridge.selectedQuote,
194
- * featureFlagsKey: BridgeFeatureFlagsKey.EXTENSION_CONFIG,
195
- * }
196
- * ));
197
- * ```
198
- */
199
- export const selectBridgeQuotes = createStructuredBridgeSelector({
200
- sortedQuotes: selectSortedBridgeQuotes,
201
- recommendedQuote: selectRecommendedQuote,
202
- activeQuote: selectActiveQuote,
203
- quotesLastFetchedMs: (state) => state.quotesLastFetched,
204
- isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,
205
- quoteFetchError: (state) => state.quoteFetchError,
206
- quotesRefreshCount: (state) => state.quotesRefreshCount,
207
- quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,
208
- isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,
209
- });
210
- //# sourceMappingURL=selectors.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectors.mjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iCAAiC;AAOvD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB;;;AAEpD,OAAO,EACL,cAAc,IAAI,eAAe,EACjC,wBAAwB,IAAI,yBAAyB,EACtD,iBAAiB;AAUlB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,oBAAgB;AACnD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EAChB,2BAAuB;AACxB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EACnB,oCAAgC;AACjC,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,YAAY,EACZ,YAAY,EACZ,4BAA4B,EAC5B,sBAAsB,EACvB,0BAAsB;AAgBvB;;GAEG;AACH,MAAM,8BAA8B,GAClC,yBAAyB,CAAC,SAAS,EAAkB,CAAC;AACxD;;GAEG;AACH,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,EAAkB,CAAC;AAmBzE,MAAM,kCAAkC,GAAG,CACzC,mBAAgD,EAChD,OAA2C,EAC3C,OAAgD,EAClC,EAAE;IAChB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IACD,+DAA+D;IAC/D,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,CAAC;KACX;IAED,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,GACtE,mBAAmB,CAAC;IAEtB,2EAA2E;IAC3E,mFAAmF;IACnF,MAAM,oBAAoB,GACxB,kBAAkB,EAAE,CAAC,OAAO,CAAC;QAC7B,kBAAkB,EAAE,CAAC,OAAO,CAAC,WAAW,EAAmB,CAAC,CAAC;IAC/D,IAAI,oBAAoB,EAAE,YAAY,EAAE;QACtC,OAAO,oBAAoB,CAAC;KAC7B;IACD,gGAAgG;IAChG,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,2BAA2B,GAAG,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,2BAA2B,EAAE;YAC/B,OAAO;gBACL,YAAY,EAAE,2BAA2B,CAAC,IAAI;gBAC9C,eAAe,EAAE,SAAS;aAC3B,CAAC;SACH;QACD,OAAO,EAAE,CAAC;KACX;IACD,2FAA2F;IAC3F,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,qBAAqB,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,IAAI,qBAAqB,EAAE;YACzB,OAAO;gBACL,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,QAAQ,EAAE;gBAC/D,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,QAAQ,EAAE;aACtE,CAAC;SACH;QACD,OAAO,EAAE,CAAC;KACX;IACD,8HAA8H;IAC9H,MAAM,qBAAqB,GAAG,UAAU,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,8BAA8B,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC/D,CAAC,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,8BAA8B,EAAE;QAClC,OAAO;YACL,YAAY,EAAE,8BAA8B,EAAE,KAAK,CAAC,QAAQ,EAAE;YAC9D,eAAe,EAAE,SAAS;SAC3B,CAAC;KACH;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CACnD,KAAqB,EACrB,OAA2C,EAC3C,OAAgD,EAChD,EAAE;IACF,OAAO,kCAAkC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,GAAG,MAA6D,EAChE,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;AAE1E,2DAA2D;AAC3D,MAAM,8BAA8B,GAAG,oBAAoB,CACzD;IACE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM;IACtB,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAA4B,EAAE,EAAE,CAAC,gBAAgB;IACvE,oBAAoB,CAClB;QACE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;QAChB,CAAC,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU;QAChD,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe;KAC3D,EACD,qCAAqC,CACtC;IACD,oBAAoB,CAClB;QACE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;QAChB,CAAC,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW;QAClD,CAAC,EAAE,YAAY,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,gBAAgB;KAC7D,EACD,qCAAqC,CACtC;IACD,oBAAoB,CAClB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EACpE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACjB,qCAAqC,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CACrE;CACF,EACD,CACE,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,EAAE;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAEvE,IAAI,wBAAwB,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,CAAC;QAErE,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YAC3C,wBAAwB,GAAG,yBAAyB,CAClD,KAAK,EACL,kBAAkB,CACnB,CAAC;YACF,MAAM,GAAG,wBAAwB,CAAC;YAClC,kBAAkB,GAAG,wBAAwB,CAAC;SAC/C;aAAM;YACL,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YACvD,MAAM,GAAG,8BAA8B,CAAC;gBACtC,WAAW,EAAE,KAAK;gBAClB,GAAG,gBAAgB;gBACnB,GAAG,kBAAkB;aACtB,CAAC,CAAC;YACH,wBAAwB,GAAG,4BAA4B,CACrD,MAAM,EACN,UAAU,CACX,CAAC;YACF,kBAAkB,GAAG,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;SACjE;QAED,MAAM,cAAc,GAAG,kBAAkB,CACvC,aAAa,EACb,wBAAwB,CACzB,CAAC;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAElD,OAAO;YACL,GAAG,KAAK;YACR,uBAAuB;YACvB,UAAU;YACV,aAAa;YACb,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;YAC/D,eAAe,EAAE,wBAAwB;YACzC,kBAAkB;YAClB,MAAM;YACN,cAAc;YACd,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC,CACF,CAAC;AAEF,MAAM,wBAAwB,GAAG,oBAAoB,CACnD;IACE,8BAA8B;IAC9B,CAAC,CAAC,EAAE,EAAE,SAAS,EAA4B,EAAE,EAAE,CAAC,SAAS;CAC1D,EACD,CAAC,kBAAkB,EAAE,SAAS,EAAqC,EAAE;IACnE,QAAQ,SAAS,EAAE;QACjB,KAAK,SAAS,CAAC,OAAO;YACpB,OAAO,OAAO,CACZ,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gCAAgC,EACjD,KAAK,CACN,CAAC;QACJ;YACE,OAAO,OAAO,CACZ,kBAAkB,EAClB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACX,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EACzD,KAAK,CACN,CAAC;KACL;AACH,CAAC,CACF,CAAC;AAEF,MAAM,sBAAsB,GAAG,oBAAoB,CACjD,CAAC,wBAAwB,CAAC,EAC1B,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC,gBAAgB,CACzC,CAAC;AAEF,MAAM,iBAAiB,GAAG,oBAAoB,CAC5C;IACE,sBAAsB;IACtB,CAAC,CAAC,EAAE,EAAE,aAAa,EAA4B,EAAE,EAAE,CAAC,aAAa;CAClE,EACD,CAAC,gBAAgB,EAAE,aAAa,EAAE,EAAE,CAAC,aAAa,IAAI,gBAAgB,CACvE,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,KAAqB,EACrB,EAAE,eAAe,EAA4B,EAC7C,EAAE,CACF,KAAK,CAAC,YAAY,CAAC,eAAe;IAChC,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,KAAK,CAAC,kBAAkB;QACxB,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC;AAEhE,MAAM,sBAAsB,GAAG,oBAAoB,CACjD;IACE,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,eAAe,EAA4B,EAAE,EAAE,CACxE,kBAAkB,CAAC,eAAe,CAAC;IACrC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU;CACzC,EACD,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,CAC3B,CAAC,UAAU;IACT,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW;IACnE,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,WAAW,CAC5D,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CACtD;IACE,2BAA2B;IAC3B,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,iBAAiB;IAC5C,sBAAsB;IACtB,CAAC,CAAC,EAAE,EAAE,EAAE,eAAuB,EAAE,EAAE,CAAC,eAAe;CACpD,EACD,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,CACzE,OAAO,CACL,CAAC,qBAAqB;IACpB,iBAAiB;IACjB,eAAe,GAAG,iBAAiB,GAAG,WAAW,CACpD,CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;IAC/D,YAAY,EAAE,wBAAwB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,WAAW,EAAE,iBAAiB;IAC9B,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB;IACvD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,KAAK,aAAa,CAAC,OAAO;IACzE,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IACjD,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB;IACvD,uBAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,qBAAqB;IAC/D,qBAAqB,EAAE,2BAA2B;CACnD,CAAC,CAAC","sourcesContent":["import { AddressZero } from '@ethersproject/constants';\nimport type {\n CurrencyRateState,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n} from '@metamask/assets-controllers';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { isStrictHexString } from '@metamask/utils';\nimport { orderBy } from 'lodash';\nimport {\n createSelector as createSelector_,\n createStructuredSelector as createStructuredSelector_,\n} from 'reselect';\n\nimport type {\n BridgeControllerState,\n BridgeFeatureFlagsKey,\n ExchangeRate,\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteResponse,\n} from './types';\nimport { RequestStatus, SortOrder } from './types';\nimport {\n getNativeAssetForChainId,\n isNativeAddress,\n isSolanaChainId,\n} from './utils/bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport {\n calcAdjustedReturn,\n calcCost,\n calcEstimatedAndMaxTotalGasFee,\n calcRelayerFee,\n calcSentAmount,\n calcSolanaTotalNetworkFee,\n calcSwapRate,\n calcToAmount,\n calcTotalEstimatedNetworkFee,\n calcTotalMaxNetworkFee,\n} from './utils/quote';\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 */\nexport type BridgeAppState = BridgeControllerState &\n ExchangeRateControllerState & {\n participateInMetaMetrics: boolean;\n };\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 * The merged client transaction and gas controller estimates for gas\n */\ntype BridgeFeesPerGas = {\n estimatedBaseFeeInDecGwei: string;\n maxPriorityFeePerGasInDecGwei: string;\n maxFeePerGasInDecGwei: string;\n};\n/**\n * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\n bridgeFeesPerGas: BridgeFeesPerGas;\n sortOrder: SortOrder;\n selectedQuote: (QuoteResponse & QuoteMetadata) | null;\n featureFlagsKey: BridgeFeatureFlagsKey;\n};\n\nconst getExchangeRateByChainIdAndAddress = (\n exchangeRateSources: ExchangeRateControllerState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n): ExchangeRate => {\n if (!chainId || !address) {\n return {};\n }\n // TODO return usd exchange rate if user has opted into metrics\n const assetId = formatAddressToAssetId(address, chainId);\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] ??\n assetExchangeRates?.[assetId.toLowerCase() as CaipAssetType];\n if (bridgeControllerRate?.exchangeRate) {\n return bridgeControllerRate;\n }\n // If the chain is a Solana chain, use the conversion rate from the multichain assets controller\n if (isSolanaChainId(chainId)) {\n const multichainAssetExchangeRate = conversionRates?.[assetId];\n if (multichainAssetExchangeRate) {\n return {\n exchangeRate: multichainAssetExchangeRate.rate,\n usdExchangeRate: undefined,\n };\n }\n return {};\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.toLowerCase()];\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 const evmTokenExchangeRates = marketData?.[formatChainIdToHex(chainId)];\n const evmTokenExchangeRateForAddress = isStrictHexString(address)\n ? evmTokenExchangeRates?.[address]\n : null;\n if (evmTokenExchangeRateForAddress) {\n return {\n exchangeRate: evmTokenExchangeRateForAddress?.price.toString(),\n usdExchangeRate: undefined,\n };\n }\n\n return {};\n};\n\n/**\n * Selects the asset exchange rate for a given chain and address\n *\n * @param state The state of the bridge controller and its dependency controllers\n * @param chainId The chain ID of the asset\n * @param address The address of the asset\n * @returns The asset exchange rate for the given chain and address\n */\nexport const selectExchangeRateByChainIdAndAddress = (\n state: BridgeAppState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n) => {\n return getExchangeRateByChainIdAndAddress(state, chainId, address);\n};\n\n/**\n * Checks whether an exchange rate is available for a given chain and address\n *\n * @param params The parameters to pass to {@link getExchangeRateByChainIdAndAddress}\n * @returns Whether an exchange rate is available for the given chain and address\n */\nexport const selectIsAssetExchangeRateInState = (\n ...params: Parameters<typeof getExchangeRateByChainIdAndAddress>\n) => Boolean(getExchangeRateByChainIdAndAddress(...params)?.exchangeRate);\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n (_, { bridgeFeesPerGas }: BridgeQuotesClientParams) => bridgeFeesPerGas,\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { srcChainId } }) => srcChainId,\n ({ quoteRequest: { srcTokenAddress } }) => srcTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { destChainId } }) => destChainId,\n ({ quoteRequest: { destTokenAddress } }) => destTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [(state) => state, ({ quoteRequest: { srcChainId } }) => srcChainId],\n (state, chainId) =>\n selectExchangeRateByChainIdAndAddress(state, chainId, AddressZero),\n ),\n ],\n (\n quotes,\n bridgeFeesPerGas,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n nativeExchangeRate,\n ) => {\n const newQuotes = quotes.map((quote) => {\n const sentAmount = calcSentAmount(quote.quote, srcTokenExchangeRate);\n const toTokenAmount = calcToAmount(quote.quote, destTokenExchangeRate);\n\n let totalEstimatedNetworkFee, gasFee, totalMaxNetworkFee, relayerFee;\n\n if (isSolanaChainId(quote.quote.srcChainId)) {\n totalEstimatedNetworkFee = calcSolanaTotalNetworkFee(\n quote,\n nativeExchangeRate,\n );\n gasFee = totalEstimatedNetworkFee;\n totalMaxNetworkFee = totalEstimatedNetworkFee;\n } else {\n relayerFee = calcRelayerFee(quote, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quote,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(\n gasFee,\n relayerFee,\n );\n totalMaxNetworkFee = calcTotalMaxNetworkFee(gasFee, relayerFee);\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n return {\n ...quote,\n // QuoteMetadata fields\n sentAmount,\n toTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n totalNetworkFee: totalEstimatedNetworkFee,\n totalMaxNetworkFee,\n gasFee,\n adjustedReturn,\n cost,\n };\n });\n\n return newQuotes;\n },\n);\n\nconst selectSortedBridgeQuotes = createBridgeSelector(\n [\n selectBridgeQuotesWithMetadata,\n (_, { sortOrder }: BridgeQuotesClientParams) => sortOrder,\n ],\n (quotesWithMetadata, sortOrder): (QuoteResponse & QuoteMetadata)[] => {\n switch (sortOrder) {\n case SortOrder.ETA_ASC:\n return orderBy(\n quotesWithMetadata,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n );\n default:\n return orderBy(\n quotesWithMetadata,\n ({ cost }) =>\n cost.valueInCurrency ? Number(cost.valueInCurrency) : 0,\n 'asc',\n );\n }\n },\n);\n\nconst selectRecommendedQuote = createBridgeSelector(\n [selectSortedBridgeQuotes],\n ([recommendedQuote]) => recommendedQuote,\n);\n\nconst selectActiveQuote = createBridgeSelector(\n [\n selectRecommendedQuote,\n (_, { selectedQuote }: BridgeQuotesClientParams) => selectedQuote,\n ],\n (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote,\n);\n\nconst selectIsQuoteGoingToRefresh = (\n state: BridgeAppState,\n { featureFlagsKey }: BridgeQuotesClientParams,\n) =>\n state.quoteRequest.insufficientBal\n ? false\n : state.quotesRefreshCount <\n state.bridgeFeatureFlags[featureFlagsKey].maxRefreshCount;\n\nconst selectQuoteRefreshRate = createBridgeSelector(\n [\n ({ bridgeFeatureFlags }, { featureFlagsKey }: BridgeQuotesClientParams) =>\n bridgeFeatureFlags[featureFlagsKey],\n (state) => state.quoteRequest.srcChainId,\n ],\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 (_, __, 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 bridgeFeesPerGas - The merged client transaction and gas controller estimates for gas\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 * @param featureFlagsKey - The feature flags key for the client (e.g. `BridgeFeatureFlagsKey.EXTENSION_CONFIG`\n * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata\n *\n * @example\n * ```ts\n * const bridgeFeesPerGas = useSelector(getGasFeeEstimates);\n * const quotes = useSelector(state => selectBridgeQuotes(\n * state.metamask,\n * {\n * bridgeFeesPerGas,\n * sortOrder: state.bridge.sortOrder,\n * selectedQuote: state.bridge.selectedQuote,\n * featureFlagsKey: BridgeFeatureFlagsKey.EXTENSION_CONFIG,\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"]}
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toExchangeRates = exports.getAssetIdsForToken = void 0;
4
- const bridge_1 = require("./bridge.cjs");
5
- const caip_formatters_1 = require("./caip-formatters.cjs");
6
- const getAssetIdsForToken = (tokenAddress, chainId) => {
7
- const assetIdsToFetch = [];
8
- const assetId = (0, caip_formatters_1.formatAddressToAssetId)(tokenAddress, chainId);
9
- if (assetId) {
10
- assetIdsToFetch.push(assetId);
11
- (0, bridge_1.getNativeAssetForChainId)(chainId)?.assetId &&
12
- assetIdsToFetch.push((0, bridge_1.getNativeAssetForChainId)(chainId).assetId);
13
- }
14
- return assetIdsToFetch;
15
- };
16
- exports.getAssetIdsForToken = getAssetIdsForToken;
17
- const toExchangeRates = (currency, pricesByAssetId) => {
18
- const exchangeRates = Object.entries(pricesByAssetId).reduce((acc, [assetId, prices]) => {
19
- if (prices) {
20
- acc[assetId] = {
21
- exchangeRate: prices[currency],
22
- usdExchangeRate: prices.usd,
23
- };
24
- }
25
- return acc;
26
- }, {});
27
- return exchangeRates;
28
- };
29
- exports.toExchangeRates = toExchangeRates;
30
- //# sourceMappingURL=assets.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.cjs","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":";;;AAEA,yCAAoD;AACpD,2DAA2D;AAGpD,MAAM,mBAAmB,GAAG,CACjC,YAAoD,EACpD,OAA0C,EAC1C,EAAE;IACF,MAAM,eAAe,GAAoB,EAAE,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAA,wCAAsB,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,OAAO,EAAE;QACX,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAA,iCAAwB,EAAC,OAAO,CAAC,EAAE,OAAO;YACxC,eAAe,CAAC,IAAI,CAAC,IAAA,iCAAwB,EAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;KACnE;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B;AAEK,MAAM,eAAe,GAAG,CAC7B,QAAgB,EAChB,eAEC,EACD,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;QACzB,IAAI,MAAM,EAAE;YACV,GAAG,CAAC,OAAwB,CAAC,GAAG;gBAC9B,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC9B,eAAe,EAAE,MAAM,CAAC,GAAG;aAC5B,CAAC;SACH;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAyC,CAC1C,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport { getNativeAssetForChainId } from './bridge';\nimport { formatAddressToAssetId } from './caip-formatters';\nimport type { ExchangeRate, GenericQuoteRequest } from '../types';\n\nexport const getAssetIdsForToken = (\n tokenAddress: GenericQuoteRequest['srcTokenAddress'],\n chainId: GenericQuoteRequest['srcChainId'],\n) => {\n const assetIdsToFetch: CaipAssetType[] = [];\n\n const assetId = formatAddressToAssetId(tokenAddress, chainId);\n if (assetId) {\n assetIdsToFetch.push(assetId);\n getNativeAssetForChainId(chainId)?.assetId &&\n assetIdsToFetch.push(getNativeAssetForChainId(chainId).assetId);\n }\n\n return assetIdsToFetch;\n};\n\nexport const toExchangeRates = (\n currency: string,\n pricesByAssetId: {\n [assetId: CaipAssetType]: { [currency: string]: string } | undefined;\n },\n) => {\n const exchangeRates = Object.entries(pricesByAssetId).reduce(\n (acc, [assetId, prices]) => {\n if (prices) {\n acc[assetId as CaipAssetType] = {\n exchangeRate: prices[currency],\n usdExchangeRate: prices.usd,\n };\n }\n return acc;\n },\n {} as Record<CaipAssetType, ExchangeRate>,\n );\n return exchangeRates;\n};\n"]}
@@ -1,9 +0,0 @@
1
- import type { CaipAssetType } from "@metamask/utils";
2
- import type { ExchangeRate, GenericQuoteRequest } from "../types.cjs";
3
- export declare const getAssetIdsForToken: (tokenAddress: GenericQuoteRequest['srcTokenAddress'], chainId: GenericQuoteRequest['srcChainId']) => `${string}:${string}/${string}:${string}`[];
4
- export declare const toExchangeRates: (currency: string, pricesByAssetId: {
5
- [assetId: `${string}:${string}/${string}:${string}`]: {
6
- [currency: string]: string;
7
- } | undefined;
8
- }) => Record<`${string}:${string}/${string}:${string}`, ExchangeRate>;
9
- //# sourceMappingURL=assets.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.d.cts","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAiB;AAElE,eAAO,MAAM,mBAAmB,iBAChB,mBAAmB,CAAC,iBAAiB,CAAC,WAC3C,mBAAmB,CAAC,YAAY,CAAC,gDAY3C,CAAC;AAEF,eAAO,MAAM,eAAe,aAChB,MAAM;;;;qEAkBjB,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { CaipAssetType } from "@metamask/utils";
2
- import type { ExchangeRate, GenericQuoteRequest } from "../types.mjs";
3
- export declare const getAssetIdsForToken: (tokenAddress: GenericQuoteRequest['srcTokenAddress'], chainId: GenericQuoteRequest['srcChainId']) => `${string}:${string}/${string}:${string}`[];
4
- export declare const toExchangeRates: (currency: string, pricesByAssetId: {
5
- [assetId: `${string}:${string}/${string}:${string}`]: {
6
- [currency: string]: string;
7
- } | undefined;
8
- }) => Record<`${string}:${string}/${string}:${string}`, ExchangeRate>;
9
- //# sourceMappingURL=assets.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.d.mts","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAiB;AAElE,eAAO,MAAM,mBAAmB,iBAChB,mBAAmB,CAAC,iBAAiB,CAAC,WAC3C,mBAAmB,CAAC,YAAY,CAAC,gDAY3C,CAAC;AAEF,eAAO,MAAM,eAAe,aAChB,MAAM;;;;qEAkBjB,CAAC"}
@@ -1,25 +0,0 @@
1
- import { getNativeAssetForChainId } from "./bridge.mjs";
2
- import { formatAddressToAssetId } from "./caip-formatters.mjs";
3
- export const getAssetIdsForToken = (tokenAddress, chainId) => {
4
- const assetIdsToFetch = [];
5
- const assetId = formatAddressToAssetId(tokenAddress, chainId);
6
- if (assetId) {
7
- assetIdsToFetch.push(assetId);
8
- getNativeAssetForChainId(chainId)?.assetId &&
9
- assetIdsToFetch.push(getNativeAssetForChainId(chainId).assetId);
10
- }
11
- return assetIdsToFetch;
12
- };
13
- export const toExchangeRates = (currency, pricesByAssetId) => {
14
- const exchangeRates = Object.entries(pricesByAssetId).reduce((acc, [assetId, prices]) => {
15
- if (prices) {
16
- acc[assetId] = {
17
- exchangeRate: prices[currency],
18
- usdExchangeRate: prices.usd,
19
- };
20
- }
21
- return acc;
22
- }, {});
23
- return exchangeRates;
24
- };
25
- //# sourceMappingURL=assets.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.mjs","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,qBAAiB;AACpD,OAAO,EAAE,sBAAsB,EAAE,8BAA0B;AAG3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,YAAoD,EACpD,OAA0C,EAC1C,EAAE;IACF,MAAM,eAAe,GAAoB,EAAE,CAAC;IAE5C,MAAM,OAAO,GAAG,sBAAsB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,OAAO,EAAE;QACX,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,wBAAwB,CAAC,OAAO,CAAC,EAAE,OAAO;YACxC,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;KACnE;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAgB,EAChB,eAEC,EACD,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;QACzB,IAAI,MAAM,EAAE;YACV,GAAG,CAAC,OAAwB,CAAC,GAAG;gBAC9B,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC9B,eAAe,EAAE,MAAM,CAAC,GAAG;aAC5B,CAAC;SACH;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAyC,CAC1C,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport { getNativeAssetForChainId } from './bridge';\nimport { formatAddressToAssetId } from './caip-formatters';\nimport type { ExchangeRate, GenericQuoteRequest } from '../types';\n\nexport const getAssetIdsForToken = (\n tokenAddress: GenericQuoteRequest['srcTokenAddress'],\n chainId: GenericQuoteRequest['srcChainId'],\n) => {\n const assetIdsToFetch: CaipAssetType[] = [];\n\n const assetId = formatAddressToAssetId(tokenAddress, chainId);\n if (assetId) {\n assetIdsToFetch.push(assetId);\n getNativeAssetForChainId(chainId)?.assetId &&\n assetIdsToFetch.push(getNativeAssetForChainId(chainId).assetId);\n }\n\n return assetIdsToFetch;\n};\n\nexport const toExchangeRates = (\n currency: string,\n pricesByAssetId: {\n [assetId: CaipAssetType]: { [currency: string]: string } | undefined;\n },\n) => {\n const exchangeRates = Object.entries(pricesByAssetId).reduce(\n (acc, [assetId, prices]) => {\n if (prices) {\n acc[assetId as CaipAssetType] = {\n exchangeRate: prices[currency],\n usdExchangeRate: prices.usd,\n };\n }\n return acc;\n },\n {} as Record<CaipAssetType, ExchangeRate>,\n );\n return exchangeRates;\n};\n"]}