Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use network provider state, instead of CurrencyRateController state, to select 'nativeCurrency' #17450

Merged
merged 6 commits into from
Jan 27, 2023

Conversation

danjm
Copy link
Contributor

@danjm danjm commented Jan 27, 2023

Alternative fix for #17429

I think this works because state.metamask.nativeCurrency is always set from the provider config: https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/metamask-controller.js#L1020-L1028

Further explanation:

The bug from the user perspective is that if the "Show balance and token price checker" is off, then the network logo and "currency symbol" / "network ticker" will be incorrect after switching networks.

The reason for that is that we don't execute any of the code in the in CurrencyRateController updateExchangeRates function if that toggle is off. That code updates the nativeCurrency property in state, and that property is used throughout the UI to decide which logo and "currency symbol" / "network ticker" to show.

The nativeCurrency property is, however, always set using data from the network provider state. This happens in the metamask controller on two occasions: when the CurrencyRateController is initialized, and when the network changes. So, I believe we can safely replace all references to state.metamask.nativeCurrency with state.metamask.provider.ticker, and it will be functionally equivalent.

@danjm danjm marked this pull request as ready for review January 27, 2023 00:18
@danjm danjm requested a review from a team as a code owner January 27, 2023 00:18
@danjm danjm requested a review from adonesky1 January 27, 2023 00:18
@github-actions
Copy link
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot
Copy link
Collaborator

Builds ready [8d80a46]
Page Load Metrics (1516 ± 159 ms)
PlatformPageMetricMin (ms)Max (ms)Average (ms)StandardDeviation (ms)MarginOfError (ms)
ChromeHomefirstPaint1072051512612
domContentLoaded113524541485323155
load113524871516331159
domInteractive113524541485323155
Bundle size diffs
  • background: 0 bytes
  • ui: -4 bytes
  • common: 0 bytes

(state) => state.metamask,
);
const { provider, unapprovedTxs } = useSelector((state) => state.metamask);
const nativeCurrency = provider.ticker;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These selectors can be used here: getUnapprovedTransactions, getProvider.

jpuri
jpuri previously approved these changes Jan 27, 2023
Copy link
Contributor

@jpuri jpuri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work on test coverage, I left a small feedback. Looks good otherwise.

NiranjanaBinoy
NiranjanaBinoy previously approved these changes Jan 27, 2023
Copy link
Contributor

@NiranjanaBinoy NiranjanaBinoy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@@ -307,7 +307,7 @@ export function getConversionRate(state) {
}

export function getNativeCurrency(state) {
return state.metamask.nativeCurrency;
return state.metamask.provider.ticker;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should not do this when the currencyratecontroller is being used (i.e. the toggle is on). Because it could make the conversion rate and the native currency be out of sync.

@danjm
Copy link
Contributor Author

danjm commented Jan 27, 2023

To do: ensure that conversion rate dependent values are never shown when the currency rate is loading

  • Create a ticket for this

@danjm danjm added the DO-NOT-MERGE Pull requests that should not be merged label Jan 27, 2023
@danjm danjm dismissed stale reviews from NiranjanaBinoy and jpuri via 49b65ad January 27, 2023 15:25
@danjm danjm removed the DO-NOT-MERGE Pull requests that should not be merged label Jan 27, 2023
@@ -307,7 +308,10 @@ export function getConversionRate(state) {
}

export function getNativeCurrency(state) {
return state.metamask.nativeCurrency;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jpuri @NiranjanaBinoy I updated this since your last review. The problem was pointed out to me by Mark. state.metamask.nativeCurrency is always set after the conversionRate updates. So if we stopped using it, the nativeCurrency and conversionRate could get out of sync, showing the user incorrect data.

I have changed the code so that we still use the nativeCurrency, but only when the useCurrencyRateCheck setting is on. When it is off, which is required for the bug we are trying to fix, we don't show converted values, so the concern about nativeCurrency and conversionRate being out of sync does not matter

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just wondering if it is ok to use state.metamask.provider.ticker always

Copy link
Member

@Gudahtt Gudahtt Jan 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To add more detail: currently last I checked, we were showing the old network currency and currency rate after switching, until the new rate has been loaded. This is pretty confusing, but we're using the CurrencyRateController nativeCurrency state in this situation so we can at least be confident the symbol we're showing next to the rate matches the rate.

Ideally we would show no fiat value while currency rates are loading. That would be less confusing. Once we do that, I think it would be safe to always use state.metamask.provider.ticker for the current currency.

But until we make that improvement, there is this tradeoff to consider.

NiranjanaBinoy
NiranjanaBinoy previously approved these changes Jan 27, 2023
jpuri
jpuri previously approved these changes Jan 27, 2023
@danjm danjm dismissed stale reviews from jpuri and NiranjanaBinoy via f8c4120 January 27, 2023 15:38
jpuri
jpuri previously approved these changes Jan 27, 2023
@metamaskbot
Copy link
Collaborator

Builds ready [c07ef73]
Page Load Metrics (1544 ± 174 ms)
PlatformPageMetricMin (ms)Max (ms)Average (ms)StandardDeviation (ms)MarginOfError (ms)
ChromeHomefirstPaint942201413115
domContentLoaded106821861504363174
load108422291544363174
domInteractive106821861504363174
Bundle size diffs
  • background: 0 bytes
  • ui: 54 bytes
  • common: 0 bytes

@danjm danjm merged commit 7a77c82 into develop Jan 27, 2023
@danjm danjm deleted the fix-native-currency branch January 27, 2023 17:17
@github-actions github-actions bot locked and limited conversation to collaborators Jan 27, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants