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

chore(deps): bump assets controller to v34.0.0 #25540

Merged
merged 12 commits into from
Jun 28, 2024
150 changes: 36 additions & 114 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -517,12 +517,6 @@ export default class MetamaskController extends EventEmitter {
this.networkController.getProviderAndBlockTracker().blockTracker;
this.deprecatedNetworkVersions = {};

const tokenListMessenger = this.controllerMessenger.getRestricted({
name: 'TokenListController',
allowedEvents: ['NetworkController:stateChange'],
allowedActions: ['NetworkController:getNetworkClientById'],
});

const accountsControllerMessenger = this.controllerMessenger.getRestricted({
name: 'AccountsController',
allowedEvents: [
Expand Down Expand Up @@ -560,6 +554,12 @@ export default class MetamaskController extends EventEmitter {
networkConfigurations: this.networkController.state.networkConfigurations,
});

const tokenListMessenger = this.controllerMessenger.getRestricted({
name: 'TokenListController',
allowedActions: ['NetworkController:getNetworkClientById'],
allowedEvents: ['NetworkController:stateChange'],
});

this.tokenListController = new TokenListController({
chainId: this.networkController.state.providerConfig.chainId,
preventPollingOnNetworkRestart: !this.#isTokenListPollingRequired(
Expand Down Expand Up @@ -597,49 +597,21 @@ export default class MetamaskController extends EventEmitter {
allowedActions: [
'ApprovalController:addRequest',
'NetworkController:getNetworkClientById',
'AccountsController:getSelectedAccount',
'AccountsController:getAccount',
],
allowedEvents: [
'NetworkController:networkDidChange',
'AccountsController:selectedAccountChange',
'AccountsController:selectedEvmAccountChange',
'PreferencesController:stateChange',
'TokenListController:stateChange',
],
});
this.tokensController = new TokensController({
state: initState.TokensController,
provider: this.provider,
messenger: tokensControllerMessenger,
chainId: this.networkController.state.providerConfig.chainId,
// TODO: The tokens controller currently does not support internalAccounts. This is done to match the behavior of the previous tokens controller subscription.
onPreferencesStateChange: (listener) =>
this.controllerMessenger.subscribe(
`AccountsController:selectedAccountChange`,
(newlySelectedInternalAccount) => {
listener({ selectedAddress: newlySelectedInternalAccount.address });
},
),
onNetworkDidChange: (cb) =>
networkControllerMessenger.subscribe(
'NetworkController:networkDidChange',
() => {
const networkState = this.networkController.state;
return cb(networkState);
},
),
onTokenListStateChange: (listener) =>
this.controllerMessenger.subscribe(
`${this.tokenListController.name}:stateChange`,
listener,
),
getNetworkClientById: this.networkController.getNetworkClientById.bind(
this.networkController,
),
config: {
provider: this.provider,
selectedAddress:
initState.AccountsController?.internalAccounts?.accounts[
initState.AccountsController?.internalAccounts?.selectedAccount
]?.address ?? '',
},
state: initState.TokensController,
});

const nftControllerMessenger = this.controllerMessenger.getRestricted({
Expand All @@ -657,15 +629,9 @@ export default class MetamaskController extends EventEmitter {
],
});
this.nftController = new NftController({
state: initState.NftController,
messenger: nftControllerMessenger,
chainId: this.networkController.state.providerConfig.chainId,
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: networkControllerMessenger.subscribe.bind(
networkControllerMessenger,
'NetworkController:stateChange',
),
getERC721AssetName: this.assetsContractController.getERC721AssetName.bind(
this.assetsContractController,
),
Expand Down Expand Up @@ -699,10 +665,6 @@ export default class MetamaskController extends EventEmitter {
source,
},
}),
getNetworkClientById: this.networkController.getNetworkClientById.bind(
this.networkController,
),
state: initState.NftController,
});

this.nftController.setApiKey(process.env.OPENSEA_KEY);
Expand All @@ -711,48 +673,33 @@ export default class MetamaskController extends EventEmitter {
this.controllerMessenger.getRestricted({
name: 'NftDetectionController',
allowedEvents: [
'PreferencesController:stateChange',
'NetworkController:stateChange',
'PreferencesController:stateChange',
],
allowedActions: [
'ApprovalController:addRequest',
'NetworkController:getState',
'NetworkController:getNetworkClientById',
'PreferencesController:getState',
'AccountsController:getSelectedAccount',
],
});

this.nftDetectionController = new NftDetectionController({
messenger: nftDetectionControllerMessenger,
chainId: this.networkController.state.providerConfig.chainId,
onNftsStateChange: (listener) => this.nftController.subscribe(listener),
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: networkControllerMessenger.subscribe.bind(
networkControllerMessenger,
'NetworkController:stateChange',
),
getOpenSeaApiKey: () => this.nftController.openSeaApiKey,
getBalancesInSingleCall:
this.assetsContractController.getBalancesInSingleCall.bind(
this.assetsContractController,
),
addNft: this.nftController.addNft.bind(this.nftController),
getNftApi: this.nftController.getNftApi.bind(this.nftController),
getNftState: () => this.nftController.state,
// added this to track previous value of useNftDetection, should be true on very first initializing of controller[]
disabled:
this.preferencesController.store.getState().useNftDetection ===
undefined
? false // the detection is enabled by default
: !this.preferencesController.store.getState().useNftDetection,
selectedAddress:
this.preferencesController.store.getState().selectedAddress,
getNetworkClientById: this.networkController.getNetworkClientById.bind(
this.networkController,
),
});

this.metaMetricsController = new MetaMetricsController({
Expand Down Expand Up @@ -946,55 +893,29 @@ export default class MetamaskController extends EventEmitter {
fetchMultiExchangeRate,
});

const tokenRatesControllerMessenger =
this.controllerMessenger.getRestricted({
name: 'TokenRatesController',
allowedEvents: [
'PreferencesController:stateChange',
'TokensController:stateChange',
'NetworkController:stateChange',
],
allowedActions: [
'TokensController:getState',
'NetworkController:getNetworkClientById',
'NetworkController:getState',
'PreferencesController:getState',
],
});
const tokenRatesMessenger = this.controllerMessenger.getRestricted({
name: 'TokenRatesController',
allowedActions: [
'TokensController:getState',
'NetworkController:getNetworkClientById',
'NetworkController:getState',
'AccountsController:getAccount',
'AccountsController:getSelectedAccount',
],
allowedEvents: [
'NetworkController:stateChange',
'AccountsController:selectedEvmAccountChange',
'PreferencesController:stateChange',
'TokensController:stateChange',
],
});

// token exchange rate tracker
this.tokenRatesController = new TokenRatesController(
{
messenger: tokenRatesControllerMessenger,
chainId: this.networkController.state.providerConfig.chainId,
ticker: this.networkController.state.providerConfig.ticker,
selectedAddress: this.accountsController.getSelectedAccount().address,
onTokensStateChange: (listener) =>
this.tokensController.subscribe(listener),
onNetworkStateChange: networkControllerMessenger.subscribe.bind(
networkControllerMessenger,
'NetworkController:stateChange',
),
onPreferencesStateChange: (listener) =>
this.controllerMessenger.subscribe(
`AccountsController:selectedAccountChange`,
(newlySelectedInternalAccount) => {
listener({
selectedAddress: newlySelectedInternalAccount.address,
});
},
),
tokenPricesService: new CodefiTokenPricesServiceV2(),
getNetworkClientById: this.networkController.getNetworkClientById.bind(
this.networkController,
),
},
{
allTokens: this.tokensController.state.allTokens,
allDetectedTokens: this.tokensController.state.allDetectedTokens,
},
initState.TokenRatesController,
);
this.tokenRatesController = new TokenRatesController({
state: initState.TokenRatesController,
messenger: tokenRatesMessenger,
tokenPricesService: new CodefiTokenPricesServiceV2(),
});

this.preferencesController.store.subscribe(
previousValueComparator((prevState, currState) => {
Expand Down Expand Up @@ -1621,6 +1542,7 @@ export default class MetamaskController extends EventEmitter {
this.controllerMessenger.getRestricted({
name: 'TokenDetectionController',
allowedActions: [
'AccountsController:getAccount',
'AccountsController:getSelectedAccount',
'KeyringController:getState',
'NetworkController:getNetworkClientById',
Expand All @@ -1632,7 +1554,7 @@ export default class MetamaskController extends EventEmitter {
'TokensController:addDetectedTokens',
],
allowedEvents: [
'AccountsController:selectedAccountChange',
'AccountsController:selectedEvmAccountChange',
'KeyringController:lock',
'KeyringController:unlock',
'NetworkController:networkDidChange',
Expand Down
98 changes: 40 additions & 58 deletions app/scripts/metamask-controller.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -662,59 +662,46 @@ describe('MetaMaskController', () => {
it('should clear previous identities after vault restoration', async () => {
jest.spyOn(metamaskController, 'getBalance').mockResolvedValue('0x0');

let startTime = Date.now();
await metamaskController.createNewVaultAndRestore(
'foobar1337',
TEST_SEED,
);
let endTime = Date.now();

const firstVaultIdentities = cloneDeep(
metamaskController.getState().identities,
const firstVaultAccounts = cloneDeep(
metamaskController.accountsController.listAccounts(),
);
expect(
firstVaultIdentities[TEST_ADDRESS].lastSelected >= startTime &&
firstVaultIdentities[TEST_ADDRESS].lastSelected <= endTime,
).toStrictEqual(true);
delete firstVaultIdentities[TEST_ADDRESS].lastSelected;
expect(firstVaultIdentities).toStrictEqual({
[TEST_ADDRESS]: { address: TEST_ADDRESS, name: DEFAULT_LABEL },
});
expect(firstVaultAccounts).toHaveLength(1);
expect(firstVaultAccounts[0].address).toBe(TEST_ADDRESS);

await metamaskController.preferencesController.setAccountLabel(
TEST_ADDRESS,
const selectedAccount =
metamaskController.accountsController.getSelectedAccount();
metamaskController.accountsController.setAccountName(
selectedAccount.id,
'Account Foo',
);

const labelledFirstVaultIdentities = cloneDeep(
metamaskController.getState().identities,
const labelledFirstVaultAccounts = cloneDeep(
metamaskController.accountsController.listAccounts(),
);
delete labelledFirstVaultIdentities[TEST_ADDRESS].lastSelected;
expect(labelledFirstVaultIdentities).toStrictEqual({
[TEST_ADDRESS]: { address: TEST_ADDRESS, name: 'Account Foo' },
});

startTime = Date.now();
expect(labelledFirstVaultAccounts[0].address).toBe(TEST_ADDRESS);
expect(labelledFirstVaultAccounts[0].metadata.name).toBe('Account Foo');

await metamaskController.createNewVaultAndRestore(
'foobar1337',
TEST_SEED_ALT,
);
endTime = Date.now();

const secondVaultIdentities = cloneDeep(
metamaskController.getState().identities,
const secondVaultAccounts = cloneDeep(
metamaskController.accountsController.listAccounts(),
);

expect(secondVaultAccounts).toHaveLength(1);
expect(
secondVaultIdentities[TEST_ADDRESS_ALT].lastSelected >= startTime &&
secondVaultIdentities[TEST_ADDRESS_ALT].lastSelected <= endTime,
).toStrictEqual(true);
delete secondVaultIdentities[TEST_ADDRESS_ALT].lastSelected;
expect(secondVaultIdentities).toStrictEqual({
[TEST_ADDRESS_ALT]: {
address: TEST_ADDRESS_ALT,
name: DEFAULT_LABEL,
},
});
metamaskController.accountsController.getSelectedAccount().address,
).toBe(TEST_ADDRESS_ALT);
expect(secondVaultAccounts[0].address).toBe(TEST_ADDRESS_ALT);
expect(secondVaultAccounts[0].metadata.name).toBe(DEFAULT_LABEL);
});

it('should restore any consecutive accounts with balances without extra zero balance accounts', async () => {
Expand Down Expand Up @@ -748,29 +735,26 @@ describe('MetaMaskController', () => {
allDetectedTokens: { '0x1': { [TEST_ADDRESS_2]: [{}] } },
});

const startTime = Date.now();
await metamaskController.createNewVaultAndRestore(
'foobar1337',
TEST_SEED,
);

// Expect first account to be selected
const identities = cloneDeep(metamaskController.getState().identities);
const accounts = cloneDeep(
metamaskController.accountsController.listAccounts(),
);

const selectedAccount =
metamaskController.accountsController.getSelectedAccount();

expect(selectedAccount.address).toBe(TEST_ADDRESS);
expect(
identities[TEST_ADDRESS].lastSelected >= startTime &&
identities[TEST_ADDRESS].lastSelected <= Date.now(),
).toStrictEqual(true);

// Expect first 2 accounts to be restored
delete identities[TEST_ADDRESS].lastSelected;
expect(identities).toStrictEqual({
[TEST_ADDRESS]: { address: TEST_ADDRESS, name: DEFAULT_LABEL },
[TEST_ADDRESS_2]: {
address: TEST_ADDRESS_2,
name: 'Account 2',
lastSelected: expect.any(Number),
},
});
accounts.find((account) => account.address === TEST_ADDRESS),
).toBeDefined();
expect(
accounts.find((account) => account.address === TEST_ADDRESS_2),
).toBeDefined();
montelaidev marked this conversation as resolved.
Show resolved Hide resolved
});
});

Expand Down Expand Up @@ -1596,14 +1580,12 @@ describe('MetaMaskController', () => {
symbol: 'FOO',
};

metamaskController.tokensController.update((state) => {
state.tokens = [
{
address: '0x6b175474e89094c44da98b954eedeac495271d0f',
...tokenData,
},
];
});
await metamaskController.tokensController.addTokens([
{
address: '0x6b175474e89094c44da98b954eedeac495271d0f',
...tokenData,
},
]);

metamaskController.provider = provider;
const tokenDetails =
Expand Down
Loading
Loading