@@ -9,12 +9,12 @@ import { createSelector } from 'reselect';
9
9
import type { GasFeeEstimates } from '@metamask/gas-fee-controller' ;
10
10
import { BigNumber } from 'bignumber.js' ;
11
11
import { calcTokenAmount } from '@metamask/notification-services-controller/push-services' ;
12
- ///: BEGIN:ONLY_INCLUDE_IF(solana-swaps)
13
12
import {
14
13
MultichainNetworks ,
14
+ ///: BEGIN:ONLY_INCLUDE_IF(solana-swaps)
15
15
MULTICHAIN_PROVIDER_CONFIGS ,
16
+ ///: END:ONLY_INCLUDE_IF
16
17
} from '../../../shared/constants/multichain/networks' ;
17
- ///: END:ONLY_INCLUDE_IF
18
18
import {
19
19
getIsBridgeEnabled ,
20
20
getMarketData ,
@@ -60,12 +60,14 @@ import {
60
60
FEATURED_RPCS ,
61
61
} from '../../../shared/constants/network' ;
62
62
import {
63
+ getMultichainCoinRates ,
63
64
getMultichainProviderConfig ,
64
65
getImageForChainId ,
65
66
} from '../../selectors/multichain' ;
67
+ import { getAssetsRates } from '../../selectors/assets' ;
66
68
import {
67
- exchangeRatesFromNativeAndCurrencyRates ,
68
69
exchangeRateFromMarketData ,
70
+ exchangeRatesFromNativeAndCurrencyRates ,
69
71
tokenPriceInNativeAsset ,
70
72
} from './utils' ;
71
73
import type { BridgeState } from './bridge' ;
@@ -227,27 +229,43 @@ export const getBridgeSortOrder = (state: BridgeAppState) =>
227
229
export const getFromTokenConversionRate = createSelector (
228
230
getFromChain ,
229
231
getMarketData ,
232
+ getAssetsRates ,
230
233
getFromToken ,
231
234
getUSDConversionRate ,
235
+ getMultichainCoinRates ,
232
236
getConversionRate ,
233
237
( state ) => state . bridge . fromTokenExchangeRate ,
234
238
(
235
239
fromChain ,
236
240
marketData ,
241
+ assetsRates ,
237
242
fromToken ,
238
243
nativeToUsdRate ,
244
+ nonEvmNativeToUsdRate ,
239
245
nativeToCurrencyRate ,
240
246
fromTokenExchangeRate ,
241
247
) => {
242
- if ( fromChain ?. chainId && fromToken && marketData ) {
248
+ if ( fromChain ?. chainId && fromToken ) {
249
+ if ( fromChain . chainId === MultichainNetworks . SOLANA ) {
250
+ // For SOLANA tokens, we use the conversion rates provided by the multichain rates controller
251
+ const tokenToNativeAssetRate = tokenPriceInNativeAsset (
252
+ assetsRates [ fromToken . address ] ?. rate ,
253
+ nonEvmNativeToUsdRate . sol . conversionRate ,
254
+ ) ;
255
+ return exchangeRatesFromNativeAndCurrencyRates (
256
+ tokenToNativeAssetRate ,
257
+ nonEvmNativeToUsdRate . sol . conversionRate ,
258
+ nonEvmNativeToUsdRate . sol . usdConversionRate ,
259
+ ) ;
260
+ }
261
+ // For EVM tokens, we use the market data to get the exchange rate
243
262
const tokenToNativeAssetRate =
244
263
exchangeRateFromMarketData (
245
264
fromChain . chainId ,
246
265
fromToken . address ,
247
266
marketData ,
248
267
) ??
249
268
tokenPriceInNativeAsset ( fromTokenExchangeRate , nativeToCurrencyRate ) ;
250
-
251
269
return exchangeRatesFromNativeAndCurrencyRates (
252
270
tokenToNativeAssetRate ,
253
271
nativeToCurrencyRate ,
0 commit comments