Skip to content

Commit ad69fb3

Browse files
committed
stash
1 parent e1a71e5 commit ad69fb3

File tree

5 files changed

+174
-176
lines changed

5 files changed

+174
-176
lines changed

packages/assets-controllers/src/AssetsContractController.test.ts

Lines changed: 85 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,24 @@ import {
99
} from '@metamask/controller-utils';
1010
import HttpProvider from '@metamask/ethjs-provider-http';
1111
import type {
12-
NetworkClientId,
13-
NetworkControllerMessenger,
1412
Provider,
13+
NetworkClientId,
14+
NetworkControllerEvents,
15+
NetworkControllerActions,
1516
} from '@metamask/network-controller';
1617
import {
1718
NetworkController,
1819
NetworkClientType,
1920
} from '@metamask/network-controller';
20-
import {
21-
getDefaultPreferencesState,
22-
type PreferencesState,
23-
} from '@metamask/preferences-controller';
21+
import { getDefaultPreferencesState } from '@metamask/preferences-controller';
2422
import assert from 'assert';
2523

2624
import { mockNetwork } from '../../../tests/mock-network';
2725
import { buildInfuraNetworkClientConfiguration } from '../../network-controller/tests/helpers';
26+
import type {
27+
AllowedActions as AssetsContractAllowedActions,
28+
AllowedEvents as AssetsContractAllowedEvents
29+
} from './AssetsContractController';
2830
import {
2931
AssetsContractController,
3032
MISSING_PROVIDER_ERROR,
@@ -65,70 +67,71 @@ async function setupAssetContractControllers({
6567
} = {}) {
6668
const networkClientConfiguration = {
6769
type: NetworkClientType.Infura,
68-
network: 'mainnet',
70+
network: NetworkType.mainnet,
6971
infuraProjectId,
7072
chainId: BUILT_IN_NETWORKS.mainnet.chainId,
7173
ticker: BUILT_IN_NETWORKS.mainnet.ticker,
7274
} as const;
7375
let provider: Provider;
7476

75-
const messenger: NetworkControllerMessenger =
76-
new ControllerMessenger().getRestricted({
77-
name: 'NetworkController',
78-
allowedActions: [],
79-
allowedEvents: [],
80-
});
77+
const controllerMessenger = new ControllerMessenger<
78+
NetworkControllerActions | AssetsContractAllowedActions,
79+
NetworkControllerEvents | AssetsContractAllowedEvents
80+
>();
81+
const networkMessenger = controllerMessenger.getRestricted({
82+
name: 'NetworkController',
83+
allowedActions: [],
84+
allowedEvents: [],
85+
});
8186
const networkController = new NetworkController({
8287
infuraProjectId,
83-
messenger,
88+
messenger: networkMessenger,
8489
trackMetaMetricsEvent: jest.fn(),
8590
});
8691
if (useNetworkControllerProvider) {
8792
await networkController.initializeProvider();
8893
const selectedNetworkClient = networkController.getSelectedNetworkClient();
8994
assert(selectedNetworkClient, 'No network is selected');
9095
provider = selectedNetworkClient.provider;
96+
97+
controllerMessenger.unregisterActionHandler('NetworkController:getNetworkClientById');
98+
controllerMessenger.registerActionHandler(
99+
'NetworkController:getNetworkClientById',
100+
// @ts-expect-error TODO: remove this annotation once the `Eip1193Provider` class is released
101+
(networkClientId: NetworkClientId) => {
102+
return {
103+
...networkController.getNetworkClientById(networkClientId),
104+
provider,
105+
}
106+
}
107+
);
91108
} else {
92109
provider = new HttpProvider(
93110
`https://mainnet.infura.io/v3/${infuraProjectId}`,
94111
);
95112
}
96113

97-
const getNetworkClientById = useNetworkControllerProvider
98-
? networkController.getNetworkClientById.bind(networkController)
99-
: (networkClientId: NetworkClientId) =>
100-
({
101-
...networkController.getNetworkClientById(networkClientId),
102-
provider,
103-
// TODO: Replace `any` with type
104-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
105-
} as any);
106-
107-
const preferencesStateChangeListeners: ((state: PreferencesState) => void)[] =
108-
[];
114+
const assetsContractMessenger = controllerMessenger.getRestricted({
115+
name: 'AssetsContractController',
116+
allowedActions: ['NetworkController:getNetworkClientById'],
117+
allowedEvents: [
118+
'PreferencesController:stateChange',
119+
'NetworkController:networkDidChange',
120+
],
121+
});
109122
const assetsContract = new AssetsContractController({
110123
chainId: ChainId.mainnet,
111-
onPreferencesStateChange: (listener) => {
112-
preferencesStateChangeListeners.push(listener);
113-
},
114-
onNetworkDidChange: (listener) =>
115-
messenger.subscribe('NetworkController:networkDidChange', listener),
116-
getNetworkClientById,
124+
messenger: assetsContractMessenger,
117125
...options,
118126
});
119127

120128
return {
121-
messenger,
129+
messenger: controllerMessenger,
122130
network: networkController,
123131
assetsContract,
124132
provider,
125133
networkClientConfiguration,
126134
infuraProjectId,
127-
triggerPreferencesStateChange: (state: PreferencesState) => {
128-
for (const listener of preferencesStateChangeListeners) {
129-
listener(state);
130-
}
131-
},
132135
};
133136
}
134137

@@ -170,32 +173,41 @@ export { setupAssetContractControllers, mockNetworkWithDefaultChainId };
170173
describe('AssetsContractController', () => {
171174
it('should set default config', async () => {
172175
const { assetsContract, messenger } = await setupAssetContractControllers();
173-
expect(assetsContract.config).toStrictEqual({
176+
expect({
177+
chainId: assetsContract.chainId,
178+
ipfsGateway: assetsContract.ipfsGateway,
179+
}).toStrictEqual({
174180
chainId: SupportedTokenDetectionNetworks.mainnet,
175181
ipfsGateway: IPFS_DEFAULT_GATEWAY_URL,
176-
provider: undefined,
177182
});
178183
messenger.clearEventSubscriptions('NetworkController:networkDidChange');
179184
});
180185

181186
it('should update the ipfsGateWay config value when this value is changed in the preferences controller', async () => {
182-
const { assetsContract, messenger, triggerPreferencesStateChange } =
183-
await setupAssetContractControllers();
184-
expect(assetsContract.config).toStrictEqual({
187+
const { assetsContract, messenger } = await setupAssetContractControllers();
188+
expect({
189+
chainId: assetsContract.chainId,
190+
ipfsGateway: assetsContract.ipfsGateway,
191+
}).toStrictEqual({
185192
chainId: SupportedTokenDetectionNetworks.mainnet,
186193
ipfsGateway: IPFS_DEFAULT_GATEWAY_URL,
187-
provider: undefined,
188194
});
189195

190-
triggerPreferencesStateChange({
191-
...getDefaultPreferencesState(),
192-
ipfsGateway: 'newIPFSGateWay',
193-
});
196+
messenger.publish(
197+
'PreferencesController:stateChange',
198+
{
199+
...getDefaultPreferencesState(),
200+
ipfsGateway: 'newIPFSGateWay',
201+
},
202+
[],
203+
);
194204

195-
expect(assetsContract.config).toStrictEqual({
205+
expect({
206+
chainId: assetsContract.chainId,
207+
ipfsGateway: assetsContract.ipfsGateway,
208+
}).toStrictEqual({
196209
ipfsGateway: 'newIPFSGateWay',
197210
chainId: SupportedTokenDetectionNetworks.mainnet,
198-
provider: undefined,
199211
});
200212

201213
messenger.clearEventSubscriptions('NetworkController:networkDidChange');
@@ -211,7 +223,7 @@ describe('AssetsContractController', () => {
211223

212224
it('should throw missing provider error when getting ERC-20 token balance when missing provider', async () => {
213225
const { assetsContract, messenger } = await setupAssetContractControllers();
214-
assetsContract.configure({ provider: undefined });
226+
assetsContract.provider = undefined;
215227
await expect(
216228
assetsContract.getERC20BalanceOf(
217229
ERC20_UNI_ADDRESS,
@@ -223,7 +235,7 @@ describe('AssetsContractController', () => {
223235

224236
it('should throw missing provider error when getting ERC-20 token decimal when missing provider', async () => {
225237
const { assetsContract, messenger } = await setupAssetContractControllers();
226-
assetsContract.configure({ provider: undefined });
238+
assetsContract.provider = undefined;
227239
await expect(
228240
assetsContract.getERC20TokenDecimals(ERC20_UNI_ADDRESS),
229241
).rejects.toThrow(MISSING_PROVIDER_ERROR);
@@ -233,7 +245,7 @@ describe('AssetsContractController', () => {
233245
it('should get balance of ERC-20 token contract correctly', async () => {
234246
const { assetsContract, messenger, provider, networkClientConfiguration } =
235247
await setupAssetContractControllers();
236-
assetsContract.configure({ provider });
248+
assetsContract.provider = provider;
237249
mockNetworkWithDefaultChainId({
238250
networkClientConfiguration,
239251
mocks: [
@@ -287,7 +299,7 @@ describe('AssetsContractController', () => {
287299
it('should get ERC-721 NFT tokenId correctly', async () => {
288300
const { assetsContract, messenger, provider, networkClientConfiguration } =
289301
await setupAssetContractControllers();
290-
assetsContract.configure({ provider });
302+
assetsContract.provider = provider;
291303
mockNetworkWithDefaultChainId({
292304
networkClientConfiguration,
293305
mocks: [
@@ -320,7 +332,7 @@ describe('AssetsContractController', () => {
320332

321333
it('should throw missing provider error when getting ERC-721 token standard and details when missing provider', async () => {
322334
const { assetsContract, messenger } = await setupAssetContractControllers();
323-
assetsContract.configure({ provider: undefined });
335+
assetsContract.provider = undefined;
324336
await expect(
325337
assetsContract.getTokenStandardAndDetails(
326338
ERC20_UNI_ADDRESS,
@@ -333,7 +345,7 @@ describe('AssetsContractController', () => {
333345
it('should throw contract standard error when getting ERC-20 token standard and details when provided with invalid ERC-20 address', async () => {
334346
const { assetsContract, messenger, provider } =
335347
await setupAssetContractControllers();
336-
assetsContract.configure({ provider });
348+
assetsContract.provider = provider;
337349
const error = 'Unable to determine contract standard';
338350
await expect(
339351
assetsContract.getTokenStandardAndDetails(
@@ -347,7 +359,7 @@ describe('AssetsContractController', () => {
347359
it('should get ERC-721 token standard and details', async () => {
348360
const { assetsContract, messenger, provider, networkClientConfiguration } =
349361
await setupAssetContractControllers();
350-
assetsContract.configure({ provider });
362+
assetsContract.provider = provider;
351363
mockNetworkWithDefaultChainId({
352364
networkClientConfiguration,
353365
mocks: [
@@ -412,7 +424,7 @@ describe('AssetsContractController', () => {
412424
it('should get ERC-1155 token standard and details', async () => {
413425
const { assetsContract, messenger, provider, networkClientConfiguration } =
414426
await setupAssetContractControllers();
415-
assetsContract.configure({ provider });
427+
assetsContract.provider = provider;
416428
mockNetworkWithDefaultChainId({
417429
networkClientConfiguration,
418430
mocks: [
@@ -497,7 +509,7 @@ describe('AssetsContractController', () => {
497509
it('should get ERC-20 token standard and details', async () => {
498510
const { assetsContract, messenger, provider, networkClientConfiguration } =
499511
await setupAssetContractControllers();
500-
assetsContract.configure({ provider });
512+
assetsContract.provider = provider;
501513
mockNetworkWithDefaultChainId({
502514
networkClientConfiguration,
503515
mocks: [
@@ -594,7 +606,7 @@ describe('AssetsContractController', () => {
594606
it('should get ERC-721 NFT tokenURI correctly', async () => {
595607
const { assetsContract, messenger, provider, networkClientConfiguration } =
596608
await setupAssetContractControllers();
597-
assetsContract.configure({ provider });
609+
assetsContract.provider = provider;
598610
mockNetworkWithDefaultChainId({
599611
networkClientConfiguration,
600612
mocks: [
@@ -643,7 +655,7 @@ describe('AssetsContractController', () => {
643655
it('should not throw an error when address given does not support NFT Metadata interface', async () => {
644656
const { assetsContract, messenger, provider, networkClientConfiguration } =
645657
await setupAssetContractControllers();
646-
assetsContract.configure({ provider });
658+
assetsContract.provider = provider;
647659
const errorLogSpy = jest
648660
.spyOn(console, 'error')
649661
.mockImplementationOnce(() => {
@@ -701,7 +713,7 @@ describe('AssetsContractController', () => {
701713
it('should get ERC-721 NFT name', async () => {
702714
const { assetsContract, messenger, provider, networkClientConfiguration } =
703715
await setupAssetContractControllers();
704-
assetsContract.configure({ provider });
716+
assetsContract.provider = provider;
705717
mockNetworkWithDefaultChainId({
706718
networkClientConfiguration,
707719
mocks: [
@@ -731,7 +743,7 @@ describe('AssetsContractController', () => {
731743
it('should get ERC-721 NFT symbol', async () => {
732744
const { assetsContract, messenger, provider, networkClientConfiguration } =
733745
await setupAssetContractControllers();
734-
assetsContract.configure({ provider });
746+
assetsContract.provider = provider;
735747
mockNetworkWithDefaultChainId({
736748
networkClientConfiguration,
737749
mocks: [
@@ -771,7 +783,7 @@ describe('AssetsContractController', () => {
771783
it('should get ERC-20 token decimals', async () => {
772784
const { assetsContract, messenger, provider, networkClientConfiguration } =
773785
await setupAssetContractControllers();
774-
assetsContract.configure({ provider });
786+
assetsContract.provider = provider;
775787
mockNetworkWithDefaultChainId({
776788
networkClientConfiguration,
777789
mocks: [
@@ -803,7 +815,7 @@ describe('AssetsContractController', () => {
803815
it('should get ERC-20 token name', async () => {
804816
const { assetsContract, messenger, provider, networkClientConfiguration } =
805817
await setupAssetContractControllers();
806-
assetsContract.configure({ provider });
818+
assetsContract.provider = provider;
807819
mockNetworkWithDefaultChainId({
808820
networkClientConfiguration,
809821
mocks: [
@@ -835,7 +847,7 @@ describe('AssetsContractController', () => {
835847
it('should get ERC-721 NFT ownership', async () => {
836848
const { assetsContract, messenger, provider, networkClientConfiguration } =
837849
await setupAssetContractControllers();
838-
assetsContract.configure({ provider });
850+
assetsContract.provider = provider;
839851
mockNetworkWithDefaultChainId({
840852
networkClientConfiguration,
841853
mocks: [
@@ -876,7 +888,7 @@ describe('AssetsContractController', () => {
876888
it('should get balance of ERC-20 token in a single call on network with token detection support', async () => {
877889
const { assetsContract, messenger, provider, networkClientConfiguration } =
878890
await setupAssetContractControllers();
879-
assetsContract.configure({ provider });
891+
assetsContract.provider = provider;
880892
mockNetworkWithDefaultChainId({
881893
networkClientConfiguration,
882894
mocks: [
@@ -982,7 +994,7 @@ describe('AssetsContractController', () => {
982994
useNetworkControllerProvider: true,
983995
infuraProjectId,
984996
});
985-
assetsContract.configure({ provider });
997+
assetsContract.provider = provider;
986998

987999
const balancesOnMainnet = await assetsContract.getBalancesInSingleCall(
9881000
ERC20_SAI_ADDRESS,
@@ -1011,7 +1023,7 @@ describe('AssetsContractController', () => {
10111023
provider,
10121024
networkClientConfiguration,
10131025
} = await setupAssetContractControllers();
1014-
assetsContract.configure({ provider });
1026+
assetsContract.provider = provider;
10151027
mockNetworkWithDefaultChainId({
10161028
networkClientConfiguration,
10171029
mocks: [
@@ -1082,7 +1094,7 @@ describe('AssetsContractController', () => {
10821094

10831095
it('should throw missing provider error when transferring single ERC-1155 when missing provider', async () => {
10841096
const { assetsContract, messenger } = await setupAssetContractControllers();
1085-
assetsContract.configure({ provider: undefined });
1097+
assetsContract.provider = undefined;
10861098
await expect(
10871099
assetsContract.transferSingleERC1155(
10881100
ERC1155_ADDRESS,
@@ -1098,7 +1110,7 @@ describe('AssetsContractController', () => {
10981110
it('should throw when ERC1155 function transferSingle is not defined', async () => {
10991111
const { assetsContract, messenger, provider, networkClientConfiguration } =
11001112
await setupAssetContractControllers();
1101-
assetsContract.configure({ provider });
1113+
assetsContract.provider = provider;
11021114
mockNetworkWithDefaultChainId({
11031115
networkClientConfiguration,
11041116
mocks: [
@@ -1135,7 +1147,7 @@ describe('AssetsContractController', () => {
11351147
it('should get the balance of a ERC-1155 NFT for a given address', async () => {
11361148
const { assetsContract, messenger, provider, networkClientConfiguration } =
11371149
await setupAssetContractControllers();
1138-
assetsContract.configure({ provider });
1150+
assetsContract.provider = provider;
11391151
mockNetworkWithDefaultChainId({
11401152
networkClientConfiguration,
11411153
mocks: [
@@ -1181,7 +1193,7 @@ describe('AssetsContractController', () => {
11811193
it('should get the URI of a ERC-1155 NFT', async () => {
11821194
const { assetsContract, messenger, provider, networkClientConfiguration } =
11831195
await setupAssetContractControllers();
1184-
assetsContract.configure({ provider });
1196+
assetsContract.provider = provider;
11851197
mockNetworkWithDefaultChainId({
11861198
networkClientConfiguration,
11871199
mocks: [

0 commit comments

Comments
 (0)