@metamask-previews/bridge-controller 13.0.0-preview-23d1c73f → 13.0.0-preview-1634185

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 -16
  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 +3 -7
  55. package/dist/selectors.cjs +0 -224
  56. package/dist/selectors.cjs.map +0 -1
  57. package/dist/selectors.d.cts +0 -1506
  58. package/dist/selectors.d.cts.map +0 -1
  59. package/dist/selectors.d.mts +0 -1506
  60. package/dist/selectors.d.mts.map +0 -1
  61. package/dist/selectors.mjs +0 -220
  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,220 +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 { BRIDGE_PREFERRED_GAS_ESTIMATE } from "./constants/bridge.mjs";
7
- import { RequestStatus, SortOrder } from "./types.mjs";
8
- import { getNativeAssetForChainId, isNativeAddress, isSolanaChainId } from "./utils/bridge.mjs";
9
- import { formatAddressToAssetId, formatChainIdToCaip, formatChainIdToHex } from "./utils/caip-formatters.mjs";
10
- import { calcAdjustedReturn, calcCost, calcEstimatedAndMaxTotalGasFee, calcRelayerFee, calcSentAmount, calcSolanaTotalNetworkFee, calcSwapRate, calcToAmount, calcTotalEstimatedNetworkFee, calcTotalMaxNetworkFee } from "./utils/quote.mjs";
11
- /**
12
- * Creates a structured selector for the bridge controller
13
- */
14
- const createStructuredBridgeSelector = createStructuredSelector_.withTypes();
15
- /**
16
- * Creates a typed selector for the bridge controller
17
- */
18
- const createBridgeSelector = createSelector_.withTypes();
19
- const getExchangeRateByChainIdAndAddress = (exchangeRateSources, chainId, address) => {
20
- if (!chainId || !address) {
21
- return {};
22
- }
23
- // TODO return usd exchange rate if user has opted into metrics
24
- const assetId = formatAddressToAssetId(address, chainId);
25
- if (!assetId) {
26
- return {};
27
- }
28
- const { assetExchangeRates, currencyRates, marketData, conversionRates } = exchangeRateSources;
29
- // If the asset exchange rate is available in the bridge controller, use it
30
- // This is defined if the token's rate is not available from the assets controllers
31
- const bridgeControllerRate = assetExchangeRates?.[assetId] ??
32
- assetExchangeRates?.[assetId.toLowerCase()];
33
- if (bridgeControllerRate?.exchangeRate) {
34
- return bridgeControllerRate;
35
- }
36
- // If the chain is a Solana chain, use the conversion rate from the multichain assets controller
37
- if (isSolanaChainId(chainId)) {
38
- const multichainAssetExchangeRate = conversionRates?.[assetId];
39
- if (multichainAssetExchangeRate) {
40
- return {
41
- exchangeRate: multichainAssetExchangeRate.rate,
42
- usdExchangeRate: undefined,
43
- };
44
- }
45
- return {};
46
- }
47
- // If the chain is an EVM chain, use the conversion rate from the currency rates controller
48
- if (isNativeAddress(address)) {
49
- const { symbol } = getNativeAssetForChainId(chainId);
50
- const evmNativeExchangeRate = currencyRates?.[symbol.toLowerCase()];
51
- if (evmNativeExchangeRate) {
52
- return {
53
- exchangeRate: evmNativeExchangeRate?.conversionRate?.toString(),
54
- usdExchangeRate: evmNativeExchangeRate?.usdConversionRate?.toString(),
55
- };
56
- }
57
- return {};
58
- }
59
- // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller
60
- const evmTokenExchangeRates = marketData?.[formatChainIdToHex(chainId)];
61
- const evmTokenExchangeRateForAddress = isStrictHexString(address)
62
- ? evmTokenExchangeRates?.[address]
63
- : null;
64
- if (evmTokenExchangeRateForAddress) {
65
- return {
66
- exchangeRate: evmTokenExchangeRateForAddress?.price.toString(),
67
- usdExchangeRate: undefined,
68
- };
69
- }
70
- return {};
71
- };
72
- /**
73
- * Selects the asset exchange rate for a given chain and address
74
- *
75
- * @param state The state of the bridge controller and its dependency controllers
76
- * @param chainId The chain ID of the asset
77
- * @param address The address of the asset
78
- * @returns The asset exchange rate for the given chain and address
79
- */
80
- export const selectExchangeRateByChainIdAndAddress = (state, chainId, address) => {
81
- return getExchangeRateByChainIdAndAddress(state, chainId, address);
82
- };
83
- /**
84
- * Checks whether an exchange rate is available for a given chain and address
85
- *
86
- * @param params The parameters to pass to {@link getExchangeRateByChainIdAndAddress}
87
- * @returns Whether an exchange rate is available for the given chain and address
88
- */
89
- export const selectIsAssetExchangeRateInState = (...params) => Boolean(getExchangeRateByChainIdAndAddress(...params)?.exchangeRate);
90
- /**
91
- * Selects the gas fee estimates from the gas fee controller. All potential networks
92
- * support EIP1559 gas fees so assume that gasFeeEstimates is of type GasFeeEstimates
93
- *
94
- * @returns The gas fee estimates in decGWEI
95
- */
96
- const selectBridgeFeesPerGas = createStructuredBridgeSelector({
97
- estimatedBaseFeeInDecGwei: ({ gasFeeEstimates }) => gasFeeEstimates?.estimatedBaseFee,
98
- maxPriorityFeePerGasInDecGwei: ({ gasFeeEstimates }) => gasFeeEstimates?.[BRIDGE_PREFERRED_GAS_ESTIMATE]
99
- ?.suggestedMaxPriorityFeePerGas,
100
- maxFeePerGasInDecGwei: ({ gasFeeEstimates }) => gasFeeEstimates?.high?.suggestedMaxFeePerGas,
101
- });
102
- // Selects cross-chain swap quotes including their metadata
103
- const selectBridgeQuotesWithMetadata = createBridgeSelector([
104
- ({ quotes }) => quotes,
105
- selectBridgeFeesPerGas,
106
- createBridgeSelector([
107
- (state) => state,
108
- ({ quoteRequest: { srcChainId } }) => srcChainId,
109
- ({ quoteRequest: { srcTokenAddress } }) => srcTokenAddress,
110
- ], selectExchangeRateByChainIdAndAddress),
111
- createBridgeSelector([
112
- (state) => state,
113
- ({ quoteRequest: { destChainId } }) => destChainId,
114
- ({ quoteRequest: { destTokenAddress } }) => destTokenAddress,
115
- ], selectExchangeRateByChainIdAndAddress),
116
- createBridgeSelector([(state) => state, ({ quoteRequest: { srcChainId } }) => srcChainId], (state, chainId) => selectExchangeRateByChainIdAndAddress(state, chainId, AddressZero)),
117
- ], (quotes, bridgeFeesPerGas, srcTokenExchangeRate, destTokenExchangeRate, nativeExchangeRate) => {
118
- const newQuotes = quotes.map((quote) => {
119
- const sentAmount = calcSentAmount(quote.quote, srcTokenExchangeRate);
120
- const toTokenAmount = calcToAmount(quote.quote, destTokenExchangeRate);
121
- let totalEstimatedNetworkFee, gasFee, totalMaxNetworkFee, relayerFee;
122
- if (isSolanaChainId(quote.quote.srcChainId)) {
123
- totalEstimatedNetworkFee = calcSolanaTotalNetworkFee(quote, nativeExchangeRate);
124
- gasFee = totalEstimatedNetworkFee;
125
- totalMaxNetworkFee = totalEstimatedNetworkFee;
126
- }
127
- else {
128
- relayerFee = calcRelayerFee(quote, nativeExchangeRate);
129
- gasFee = calcEstimatedAndMaxTotalGasFee({
130
- bridgeQuote: quote,
131
- ...bridgeFeesPerGas,
132
- ...nativeExchangeRate,
133
- });
134
- totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);
135
- totalMaxNetworkFee = calcTotalMaxNetworkFee(gasFee, relayerFee);
136
- }
137
- const adjustedReturn = calcAdjustedReturn(toTokenAmount, totalEstimatedNetworkFee);
138
- const cost = calcCost(adjustedReturn, sentAmount);
139
- return {
140
- ...quote,
141
- // QuoteMetadata fields
142
- sentAmount,
143
- toTokenAmount,
144
- swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),
145
- totalNetworkFee: totalEstimatedNetworkFee,
146
- totalMaxNetworkFee,
147
- gasFee,
148
- adjustedReturn,
149
- cost,
150
- };
151
- });
152
- return newQuotes;
153
- });
154
- const selectSortedBridgeQuotes = createBridgeSelector([
155
- selectBridgeQuotesWithMetadata,
156
- (_, { sortOrder }) => sortOrder,
157
- ], (quotesWithMetadata, sortOrder) => {
158
- switch (sortOrder) {
159
- case SortOrder.ETA_ASC:
160
- return orderBy(quotesWithMetadata, (quote) => quote.estimatedProcessingTimeInSeconds, 'asc');
161
- default:
162
- return orderBy(quotesWithMetadata, ({ cost }) => cost.valueInCurrency ? Number(cost.valueInCurrency) : 0, 'asc');
163
- }
164
- });
165
- const selectRecommendedQuote = createBridgeSelector([selectSortedBridgeQuotes], ([recommendedQuote]) => recommendedQuote);
166
- const selectActiveQuote = createBridgeSelector([
167
- selectRecommendedQuote,
168
- (_, { selectedQuote }) => selectedQuote,
169
- ], (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote);
170
- const selectIsQuoteGoingToRefresh = (state, { featureFlagsKey }) => state.quoteRequest.insufficientBal
171
- ? false
172
- : state.quotesRefreshCount <
173
- state.bridgeFeatureFlags[featureFlagsKey].maxRefreshCount;
174
- const selectQuoteRefreshRate = createBridgeSelector([
175
- ({ bridgeFeatureFlags }, { featureFlagsKey }) => bridgeFeatureFlags[featureFlagsKey],
176
- (state) => state.quoteRequest.srcChainId,
177
- ], (featureFlags, srcChainId) => (srcChainId
178
- ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate
179
- : featureFlags.refreshRate) ?? featureFlags.refreshRate);
180
- export const selectIsQuoteExpired = createBridgeSelector([
181
- selectIsQuoteGoingToRefresh,
182
- ({ quotesLastFetched }) => quotesLastFetched,
183
- selectQuoteRefreshRate,
184
- (_, __, currentTimeInMs) => currentTimeInMs,
185
- ], (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) => Boolean(!isQuoteGoingToRefresh &&
186
- quotesLastFetched &&
187
- currentTimeInMs - quotesLastFetched > refreshRate));
188
- /**
189
- * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.
190
- *
191
- * @param state - The state of the bridge controller and its dependency controllers
192
- * @param sortOrder - The sort order of the quotes
193
- * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change
194
- * @param featureFlagsKey - The feature flags key for the client (e.g. `BridgeFeatureFlagsKey.EXTENSION_CONFIG`
195
- * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata
196
- *
197
- * @example
198
- * ```ts
199
- * const quotes = useSelector(state => selectBridgeQuotes(
200
- * state.metamask,
201
- * {
202
- * sortOrder: state.bridge.sortOrder,
203
- * selectedQuote: state.bridge.selectedQuote,
204
- * featureFlagsKey: BridgeFeatureFlagsKey.EXTENSION_CONFIG,
205
- * }
206
- * ));
207
- * ```
208
- */
209
- export const selectBridgeQuotes = createStructuredBridgeSelector({
210
- sortedQuotes: selectSortedBridgeQuotes,
211
- recommendedQuote: selectRecommendedQuote,
212
- activeQuote: selectActiveQuote,
213
- quotesLastFetchedMs: (state) => state.quotesLastFetched,
214
- isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,
215
- quoteFetchError: (state) => state.quoteFetchError,
216
- quotesRefreshCount: (state) => state.quotesRefreshCount,
217
- quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,
218
- isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,
219
- });
220
- //# 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;AAQvD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB;;;AAEpD,OAAO,EACL,cAAc,IAAI,eAAe,EACjC,wBAAwB,IAAI,yBAAyB,EACtD,iBAAiB;AAElB,OAAO,EAAE,6BAA6B,EAAE,+BAA2B;AASnE,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;AAiBvB;;GAEG;AACH,MAAM,8BAA8B,GAClC,yBAAyB,CAAC,SAAS,EAAkB,CAAC;AACxD;;GAEG;AACH,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,EAAkB,CAAC;AAUzE,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;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;IAC5D,yBAAyB,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CACjD,eAAe,EAAE,gBAAgB;IACnC,6BAA6B,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CACrD,eAAe,EAAE,CAAC,6BAA6B,CAAC;QAC9C,EAAE,6BAA6B;IACnC,qBAAqB,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAC7C,eAAe,EAAE,IAAI,EAAE,qBAAqB;CAC/C,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,8BAA8B,GAAG,oBAAoB,CACzD;IACE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM;IACtB,sBAAsB;IACtB,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;;;;;;;;;;;;;;;;;;;;GAoBG;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 { GasFeeEstimates } from '@metamask/gas-fee-controller';\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 { BRIDGE_PREFERRED_GAS_ESTIMATE } from './constants/bridge';\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 gasFeeEstimates: GasFeeEstimates;\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 * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\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/**\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 * @returns The gas fee estimates in decGWEI\n */\nconst selectBridgeFeesPerGas = createStructuredBridgeSelector({\n estimatedBaseFeeInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.estimatedBaseFee,\n maxPriorityFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.[BRIDGE_PREFERRED_GAS_ESTIMATE]\n ?.suggestedMaxPriorityFeePerGas,\n maxFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.high?.suggestedMaxFeePerGas,\n});\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectBridgeFeesPerGas,\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 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 quotes = useSelector(state => selectBridgeQuotes(\n * state.metamask,\n * {\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"]}