Skip to content

Commit

Permalink
Fix initial native currency TokenRatesController configuration (#1497)
Browse files Browse the repository at this point in the history
The `TokenRatesController` was always initialized with `eth` as the
default `nativeCurrency` configuration. This could result in the wrong
rates being retrieved if the current network has a different currency
symbol.

The constructor has been updated to require a `ticker` parameter, used
to initialize the `nativeCurrency` configuation for the current
network at time of construction.
  • Loading branch information
Gudahtt authored and MajorLift committed Oct 11, 2023
1 parent bd0a485 commit 2018899
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
20 changes: 16 additions & 4 deletions packages/assets-controllers/src/TokenRatesController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
NetworkControllerMessenger,
} from '@metamask/network-controller';
import { ControllerMessenger } from '@metamask/base-controller';
import { toHex } from '@metamask/controller-utils';
import { NetworksTicker, toHex } from '@metamask/controller-utils';
import { TokenRatesController } from './TokenRatesController';
import {
TokensController,
Expand Down Expand Up @@ -120,6 +120,7 @@ describe('TokenRatesController', () => {
it('should set default state', () => {
const controller = new TokenRatesController({
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
Expand All @@ -132,14 +133,15 @@ describe('TokenRatesController', () => {
it('should initialize with the default config', () => {
const controller = new TokenRatesController({
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
});
expect(controller.config).toStrictEqual({
disabled: false,
interval: 180000,
nativeCurrency: 'eth',
nativeCurrency: NetworksTicker.mainnet,
chainId: toHex(1),
tokens: [],
threshold: 21600000,
Expand All @@ -149,6 +151,7 @@ describe('TokenRatesController', () => {
it('should throw when tokens property is accessed', () => {
const controller = new TokenRatesController({
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
Expand All @@ -165,6 +168,7 @@ describe('TokenRatesController', () => {
new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: jest.fn(),
onCurrencyRateStateChange: jest.fn(),
onNetworkStateChange: jest.fn(),
Expand All @@ -188,6 +192,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
Expand All @@ -207,6 +212,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
Expand Down Expand Up @@ -241,6 +247,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: (listener) => tokensController.subscribe(listener),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: (listener) =>
Expand Down Expand Up @@ -269,6 +276,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange: sinon.stub(),
Expand Down Expand Up @@ -298,6 +306,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange,
onCurrencyRateStateChange,
onNetworkStateChange,
Expand Down Expand Up @@ -325,6 +334,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange,
onCurrencyRateStateChange,
onNetworkStateChange,
Expand Down Expand Up @@ -375,13 +385,13 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(137),
ticker: 'MATIC',
onTokensStateChange,
onCurrencyRateStateChange: sinon.stub(),
onNetworkStateChange,
},
{ interval: 10 },
);
await controller.configure({ nativeCurrency: 'MATIC' });

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await tokenStateChangeListener!({
Expand Down Expand Up @@ -438,6 +448,7 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange,
onNetworkStateChange,
onCurrencyRateStateChange: sinon.stub(),
Expand Down Expand Up @@ -511,11 +522,12 @@ describe('TokenRatesController', () => {
const controller = new TokenRatesController(
{
chainId: toHex(1),
ticker: NetworksTicker.mainnet,
onTokensStateChange,
onNetworkStateChange: sinon.stub(),
onCurrencyRateStateChange: sinon.stub(),
},
{ interval: 10, nativeCurrency: 'ETH' },
{ interval: 10 },
);

expect(controller.state.contractExchangeRates).toStrictEqual({});
Expand Down
5 changes: 4 additions & 1 deletion packages/assets-controllers/src/TokenRatesController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ export class TokenRatesController extends BaseController<
*
* @param options - The controller options.
* @param options.chainId - The chain ID of the current network.
* @param options.ticker - The ticker for the current network.
* @param options.onTokensStateChange - Allows subscribing to token controller state changes.
* @param options.onCurrencyRateStateChange - Allows subscribing to currency rate controller state changes.
* @param options.onNetworkStateChange - Allows subscribing to network state changes.
Expand All @@ -177,11 +178,13 @@ export class TokenRatesController extends BaseController<
constructor(
{
chainId: initialChainId,
ticker: initialTicker,
onTokensStateChange,
onCurrencyRateStateChange,
onNetworkStateChange,
}: {
chainId: Hex;
ticker: string;
onTokensStateChange: (
listener: (tokensState: TokensState) => void,
) => void;
Expand All @@ -199,7 +202,7 @@ export class TokenRatesController extends BaseController<
this.defaultConfig = {
disabled: false,
interval: 3 * 60 * 1000,
nativeCurrency: 'eth',
nativeCurrency: initialTicker,
chainId: initialChainId,
tokens: [],
threshold: 6 * 60 * 60 * 1000,
Expand Down

0 comments on commit 2018899

Please sign in to comment.