Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/bridge-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed

- Fix `usd_amount_source`, `usd_quoted_gas`, and `usd_quoted_return` metrics fields being empty for non-EVM chains by deriving USD exchange rates from multichain asset rates ([#7899](https://github.com/MetaMask/core/pull/7899))

## [66.1.1]

### Fixed
Expand Down
43 changes: 41 additions & 2 deletions packages/bridge-controller/src/selectors.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ describe('Bridge Selectors', () => {
},
currencyRates: {
ETH: {
conversionRate: 2468.12,
usdConversionRate: 1800,
conversionRate: 2468.12, // ETH rate in the user's selected currency
usdConversionRate: 1800, // ETH rate in USD
},
},
marketData: {
Expand Down Expand Up @@ -101,12 +101,51 @@ describe('Bridge Selectors', () => {
SolScope.Mainnet,
'789',
);
// usdExchangeRate = rate * (usdConversionRate / conversionRate) = 4.0 * (1800 / 2468.12)
expect(result).toStrictEqual({
exchangeRate: '4.0',
usdExchangeRate: new BigNumber('4.0')
.times(new BigNumber(1800).div(2468.12))
.toString(),
});
});

it('should return undefined usdExchangeRate for Solana when currencyRates is empty', () => {
const result = selectExchangeRateByChainIdAndAddress(
{
...mockExchangeRateSources,
currencyRates: {},
} as unknown as BridgeAppState,
SolScope.Mainnet,
'789',
);
expect(result).toStrictEqual({
exchangeRate: '4.0',
usdExchangeRate: undefined,
});
});

it('should return rate as usdExchangeRate for Solana when user currency is USD', () => {
const result = selectExchangeRateByChainIdAndAddress(
{
...mockExchangeRateSources,
currencyRates: {
ETH: {
conversionRate: 1800,
usdConversionRate: 1800,
},
},
} as unknown as BridgeAppState,
SolScope.Mainnet,
'789',
);
// When user currency is USD, conversionRate === usdConversionRate, ratio is 1
expect(result).toStrictEqual({
exchangeRate: '4.0',
usdExchangeRate: '4',
});
});

it('should handle EVM native asset rates', () => {
const result = selectExchangeRateByChainIdAndAddress(
mockExchangeRateSources,
Expand Down
19 changes: 18 additions & 1 deletion packages/bridge-controller/src/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,26 @@ const getExchangeRateByChainIdAndAddress = (
if (isNonEvmChainId(chainId)) {
const multichainAssetExchangeRate = conversionRates?.[assetId];
if (multichainAssetExchangeRate) {
// The multichain rate is denominated in the user's selected currency.
// To get a USD rate, find the user's-currency-to-USD conversion factor from any EVM native currency rate.
const nativeCurrencyRate = Object.values(currencyRates ?? {}).find(
(rate) => rate?.conversionRate && rate?.usdConversionRate,
);
const usersCurrencyToUsdRate =
nativeCurrencyRate?.conversionRate &&
nativeCurrencyRate?.usdConversionRate
? new BigNumber(nativeCurrencyRate.usdConversionRate).div(
nativeCurrencyRate.conversionRate,
)
: undefined;
const usdExchangeRate = usersCurrencyToUsdRate
? new BigNumber(multichainAssetExchangeRate.rate)
.times(usersCurrencyToUsdRate)
.toString()
: undefined;
return {
exchangeRate: multichainAssetExchangeRate.rate,
usdExchangeRate: undefined,
usdExchangeRate,
};
}
return {};
Expand Down
4 changes: 4 additions & 0 deletions packages/bridge-status-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed

- Fix `usd_amount_source` default value in EVM transaction metrics properties from `100` to `0` ([#7899](https://github.com/MetaMask/core/pull/7899))

## [66.0.2]

### Changed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5027,7 +5027,7 @@ exports[`BridgeStatusController subscription handlers TransactionController:tran
"token_symbol_source": "",
"usd_actual_gas": 0,
"usd_actual_return": 0,
"usd_amount_source": 100,
"usd_amount_source": 0,
"usd_quoted_gas": 0,
"usd_quoted_return": 0,
},
Expand Down Expand Up @@ -5064,7 +5064,7 @@ exports[`BridgeStatusController subscription handlers TransactionController:tran
"token_symbol_source": "",
"usd_actual_gas": 0,
"usd_actual_return": 0,
"usd_amount_source": 100,
"usd_amount_source": 0,
"usd_quoted_gas": 0,
"usd_quoted_return": 0,
},
Expand Down Expand Up @@ -5150,7 +5150,7 @@ exports[`BridgeStatusController subscription handlers TransactionController:tran
"token_symbol_source": "",
"usd_actual_gas": 0,
"usd_actual_return": 0,
"usd_amount_source": 100,
"usd_amount_source": 0,
"usd_quoted_gas": 0,
"usd_quoted_return": 0,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,7 @@ describe('metrics utils', () => {
chain_id_destination: 'eip155:1',
token_symbol_source: 'ETH',
token_symbol_destination: 'USDC',
usd_amount_source: 100,
usd_amount_source: 0,
source_transaction: 'COMPLETE',
stx_enabled: false,
token_address_source: 'eip155:1/slip44:60',
Expand Down
2 changes: 1 addition & 1 deletion packages/bridge-status-controller/src/utils/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ export const getEVMTxPropertiesFromTransactionMeta = (
chain_id_destination: formatChainIdToCaip(transactionMeta.chainId),
token_symbol_source: transactionMeta.sourceTokenSymbol ?? '',
token_symbol_destination: transactionMeta.destinationTokenSymbol ?? '',
usd_amount_source: 100,
usd_amount_source: 0,
stx_enabled: false,
token_address_source:
formatAddressToAssetId(
Expand Down
Loading