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
69 changes: 32 additions & 37 deletions packages/assets-controllers/src/TokensController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,11 @@ import {
ChainId,
ORIGIN_METAMASK,
convertHexToDecimal,
NetworkType,
toHex,
NetworksTicker,
InfuraNetworkType,
} from '@metamask/controller-utils';
import type {
NetworkClientConfiguration,
NetworkClientId,
ProviderConfig,
} from '@metamask/network-controller';
import { defaultState as defaultNetworkState } from '@metamask/network-controller';
import type { PreferencesState } from '@metamask/preferences-controller';
Expand Down Expand Up @@ -61,17 +58,6 @@ const uuidV1Mock = jest.mocked(uuidV1);
const ERC20StandardMock = jest.mocked(ERC20Standard);
const ERC1155StandardMock = jest.mocked(ERC1155Standard);

const SEPOLIA = {
chainId: toHex(11155111),
type: NetworkType.sepolia,
ticker: NetworksTicker.sepolia,
};
const GOERLI = {
chainId: toHex(5),
type: NetworkType.goerli,
ticker: NetworksTicker.goerli,
};

describe('TokensController', () => {
beforeEach(() => {
uuidV1Mock.mockReturnValue('9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d');
Expand Down Expand Up @@ -321,17 +307,17 @@ describe('TokensController', () => {

it('should add token by network', async () => {
await withController(async ({ controller, changeNetwork }) => {
changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x01',
symbol: 'bar',
decimals: 2,
});

changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });
expect(controller.state.tokens).toHaveLength(0);

changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
expect(controller.state.tokens[0]).toStrictEqual({
address: '0x01',
decimals: 2,
Expand Down Expand Up @@ -472,13 +458,13 @@ describe('TokensController', () => {
ContractMock.mockReturnValue(
buildMockEthersERC721Contract({ supportsInterface: false }),
);
changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x02',
symbol: 'baz',
decimals: 2,
});
changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });
await controller.addToken({
address: '0x01',
symbol: 'bar',
Expand All @@ -488,7 +474,7 @@ describe('TokensController', () => {
controller.ignoreTokens(['0x01']);
expect(controller.state.tokens).toHaveLength(0);

changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
expect(controller.state.tokens[0]).toStrictEqual({
address: '0x02',
decimals: 2,
Expand Down Expand Up @@ -544,7 +530,7 @@ describe('TokensController', () => {
...getDefaultPreferencesState(),
selectedAddress,
});
changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x01',
symbol: 'bar',
Expand Down Expand Up @@ -591,7 +577,7 @@ describe('TokensController', () => {
...getDefaultPreferencesState(),
selectedAddress,
});
changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x01',
symbol: 'bar',
Expand Down Expand Up @@ -629,7 +615,7 @@ describe('TokensController', () => {
...getDefaultPreferencesState(),
selectedAddress: selectedAddress1,
});
changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x01',
symbol: 'bar',
Expand All @@ -641,7 +627,7 @@ describe('TokensController', () => {
expect(controller.state.tokens).toHaveLength(0);
expect(controller.state.ignoredTokens).toStrictEqual(['0x01']);

changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });
expect(controller.state.ignoredTokens).toHaveLength(0);

await controller.addToken({
Expand Down Expand Up @@ -903,7 +889,7 @@ describe('TokensController', () => {
symbol: 'LINK',
decimals: 18,
});
changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });

await expect(addTokenPromise).rejects.toThrow(
'TokensController Error: Switched networks while adding token',
Expand Down Expand Up @@ -992,9 +978,12 @@ describe('TokensController', () => {
);

// The currently configured chain + address
const CONFIGURED_CHAIN = SEPOLIA;
const CONFIGURED_CHAIN = ChainId.sepolia;
const CONFIGURED_NETWORK_CLIENT_ID = InfuraNetworkType.sepolia;
const CONFIGURED_ADDRESS = '0xConfiguredAddress';
changeNetwork(CONFIGURED_CHAIN);
changeNetwork({
selectedNetworkClientId: CONFIGURED_NETWORK_CLIENT_ID,
});
triggerPreferencesStateChange({
...getDefaultPreferencesState(),
selectedAddress: CONFIGURED_ADDRESS,
Expand Down Expand Up @@ -1046,12 +1035,12 @@ describe('TokensController', () => {

// Expect tokens under the correct chain + account
expect(controller.state.allTokens).toStrictEqual({
[CONFIGURED_CHAIN.chainId]: {
[CONFIGURED_CHAIN]: {
[CONFIGURED_ADDRESS]: [addedTokenConfiguredAccount],
},
});
expect(controller.state.allDetectedTokens).toStrictEqual({
[CONFIGURED_CHAIN.chainId]: {
[CONFIGURED_CHAIN]: {
[CONFIGURED_ADDRESS]: [detectedTokenConfiguredAccount],
},
[OTHER_CHAIN]: {
Expand Down Expand Up @@ -1939,7 +1928,7 @@ describe('TokensController', () => {
buildMockEthersERC721Contract({ supportsInterface: false }),
);

changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
await controller.addToken({
address: '0x01',
symbol: 'A',
Expand All @@ -1952,7 +1941,7 @@ describe('TokensController', () => {
});
const initialTokensFirst = controller.state.tokens;

changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });
await controller.addToken({
address: '0x03',
symbol: 'C',
Expand Down Expand Up @@ -2009,10 +1998,10 @@ describe('TokensController', () => {
},
]);

changeNetwork(SEPOLIA);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.sepolia });
expect(initialTokensFirst).toStrictEqual(controller.state.tokens);

changeNetwork(GOERLI);
changeNetwork({ selectedNetworkClientId: InfuraNetworkType.goerli });
expect(initialTokensSecond).toStrictEqual(controller.state.tokens);
});
});
Expand Down Expand Up @@ -2179,7 +2168,9 @@ type WithControllerCallback<ReturnValue> = ({
triggerPreferencesStateChange,
}: {
controller: TokensController;
changeNetwork: (providerConfig: ProviderConfig) => void;
changeNetwork: (networkControllerState: {
selectedNetworkClientId: NetworkClientId;
}) => void;
messenger: UnrestrictedMessenger;
approvalController: ApprovalController;
triggerPreferencesStateChange: (state: PreferencesState) => void;
Expand Down Expand Up @@ -2259,10 +2250,14 @@ async function withController<ReturnValue>(
messenger.publish('PreferencesController:stateChange', state, []);
};

const changeNetwork = (providerConfig: ProviderConfig) => {
const changeNetwork = ({
selectedNetworkClientId,
}: {
selectedNetworkClientId: NetworkClientId;
}) => {
messenger.publish('NetworkController:networkDidChange', {
...defaultNetworkState,
providerConfig,
selectedNetworkClientId,
});
};

Expand Down
11 changes: 8 additions & 3 deletions packages/assets-controllers/src/TokensController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,11 +260,16 @@ export class TokensController extends BaseController<
* Handles the event when the network changes.
*
* @param networkState - The changed network state.
* @param networkState.providerConfig - RPC URL and network name provider settings of the currently connected network
* @param networkState.selectedNetworkClientId - The ID of the currently
* selected network client.
*/
#onNetworkDidChange({ providerConfig }: NetworkState) {
#onNetworkDidChange({ selectedNetworkClientId }: NetworkState) {
const selectedNetworkClient = this.messagingSystem.call(
'NetworkController:getNetworkClientById',
selectedNetworkClientId,
);
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
const { chainId } = providerConfig;
const { chainId } = selectedNetworkClient.configuration;
this.#abortController.abort();
this.#abortController = new AbortController();
this.#chainId = chainId;
Expand Down