Skip to content

Commit

Permalink
Merge branch 'main' into feat/remove-nft-detection-polling
Browse files Browse the repository at this point in the history
  • Loading branch information
sahar-fehri authored Jun 12, 2024
2 parents 860230b + 0f2a743 commit fbf8339
Show file tree
Hide file tree
Showing 20 changed files with 2,468 additions and 3,953 deletions.
4 changes: 2 additions & 2 deletions packages/accounts-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@
"dependencies": {
"@ethereumjs/util": "^8.1.0",
"@metamask/base-controller": "^6.0.0",
"@metamask/eth-snap-keyring": "^4.1.1",
"@metamask/keyring-api": "^6.4.0",
"@metamask/eth-snap-keyring": "^4.3.1",
"@metamask/keyring-api": "^8.0.0",
"@metamask/snaps-sdk": "^4.2.0",
"@metamask/snaps-utils": "^7.4.0",
"@metamask/utils": "^8.3.0",
Expand Down
44 changes: 44 additions & 0 deletions packages/accounts-controller/src/AccountsController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,50 @@ describe('AccountsController', () => {

expect(selectedAccount).toBe('');
});

it('selectedAccount remains the same after adding a new account', async () => {
const messenger = buildMessenger();
mockUUID
.mockReturnValueOnce('mock-id') // call to check if its a new account
.mockReturnValueOnce('mock-id2') // call to check if its a new account
.mockReturnValueOnce('mock-id2'); // call to add account

const mockNewKeyringState = {
isUnlocked: true,
keyrings: [
{
type: KeyringTypes.hd,
accounts: [mockAccount.address, mockAccount2.address],
},
],
};
const { accountsController } = setupAccountsController({
initialState: {
internalAccounts: {
accounts: {
[mockAccount.id]: mockAccount,
[mockAccount3.id]: mockAccount3,
},
selectedAccount: mockAccount.id,
},
},
messenger,
});

messenger.publish(
'KeyringController:stateChange',
mockNewKeyringState,
[],
);

const accounts = accountsController.listAccounts();

expect(accounts).toStrictEqual([
mockAccount,
setLastSelectedAsAny(mockAccount2),
]);
expect(accountsController.getSelectedAccount().id).toBe(mockAccount.id);
});
});

describe('deleting account', () => {
Expand Down
4 changes: 1 addition & 3 deletions packages/accounts-controller/src/AccountsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -922,14 +922,12 @@ export class AccountsController extends BaseController<
...newAccount.metadata,
name: accountName,
importTime: Date.now(),
lastSelected: Date.now(),
lastSelected: 0,
},
};

return newState;
});

this.setSelectedAccount(newAccount.id);
}

/**
Expand Down
104 changes: 84 additions & 20 deletions packages/address-book-controller/src/AddressBookController.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,45 @@
import { ControllerMessenger } from '@metamask/base-controller';
import { toHex } from '@metamask/controller-utils';

import { AddressBookController, AddressType } from './AddressBookController';
import type {
AddressBookControllerActions,
AddressBookControllerEvents,
} from './AddressBookController';
import {
AddressBookController,
AddressType,
controllerName,
} from './AddressBookController';

/**
* Constructs a restricted controller messenger.
*
* @returns A restricted controller messenger.
*/
function getRestrictedMessenger() {
const controllerMessenger = new ControllerMessenger<
AddressBookControllerActions,
AddressBookControllerEvents
>();
return controllerMessenger.getRestricted({
name: controllerName,
allowedActions: [],
allowedEvents: [],
});
}

describe('AddressBookController', () => {
it('should set default state', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
expect(controller.state).toStrictEqual({ addressBook: {} });
});

it('should add a contact entry', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

expect(controller.state).toStrictEqual({
Expand All @@ -29,7 +59,9 @@ describe('AddressBookController', () => {
});

it('should add a contact entry with chainId and memo', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set(
'0x32Be343B94f860124dC4fEe278FDCBD38C102D88',
'foo',
Expand All @@ -55,7 +87,9 @@ describe('AddressBookController', () => {
});

it('should add a contact entry with address type contract accounts', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set(
'0x32Be343B94f860124dC4fEe278FDCBD38C102D88',
'foo',
Expand All @@ -81,7 +115,9 @@ describe('AddressBookController', () => {
});

it('should add a contact entry with address type non accounts', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set(
'0x32Be343B94f860124dC4fEe278FDCBD38C102D88',
'foo',
Expand All @@ -107,7 +143,9 @@ describe('AddressBookController', () => {
});

it('should add multiple contact entries with different chainIds', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set(
'0x32Be343B94f860124dC4fEe278FDCBD38C102D88',
'foo',
Expand Down Expand Up @@ -149,7 +187,9 @@ describe('AddressBookController', () => {
});

it('should update a contact entry', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'bar');
Expand All @@ -171,22 +211,28 @@ describe('AddressBookController', () => {
});

it('should not add invalid contact entry', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
// @ts-expect-error Intentionally invalid entry
controller.set('0x01', 'foo', AddressType.externallyOwnedAccounts);
expect(controller.state).toStrictEqual({ addressBook: {} });
});

it('should remove one contact entry', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');
controller.delete(toHex(1), '0x32Be343B94f860124dC4fEe278FDCBD38C102D88');

expect(controller.state).toStrictEqual({ addressBook: {} });
});

it('should remove only one contact entry', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

controller.set('0xc38bf1ad06ef69f0c04e29dbeb4152b4175f0a8d', 'bar');
Expand All @@ -209,7 +255,9 @@ describe('AddressBookController', () => {
});

it('should add two contact entries with the same chainId', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

controller.set('0xc38bf1ad06ef69f0c04e29dbeb4152b4175f0a8d', 'bar');
Expand Down Expand Up @@ -239,7 +287,9 @@ describe('AddressBookController', () => {
});

it('should correctly mark ens entries', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set(
'0x32Be343B94f860124dC4fEe278FDCBD38C102D88',
'metamask.eth',
Expand All @@ -262,7 +312,9 @@ describe('AddressBookController', () => {
});

it('should clear all contact entries', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

controller.set('0xc38bf1ad06ef69f0c04e29dbeb4152b4175f0a8d', 'bar');
Expand All @@ -271,22 +323,28 @@ describe('AddressBookController', () => {
});

it('should return true to indicate an address book entry has been added', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
expect(
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo'),
).toBe(true);
});

it('should return false to indicate an address book entry has NOT been added', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
expect(
// @ts-expect-error Intentionally invalid entry
controller.set('0x00', 'foo', AddressType.externallyOwnedAccounts),
).toBe(false);
});

it('should return true to indicate an address book entry has been deleted', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

expect(
Expand All @@ -295,20 +353,26 @@ describe('AddressBookController', () => {
});

it('should return false to indicate an address book entry has NOT been deleted due to unsafe input', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
// @ts-expect-error Suppressing error to test runtime behavior
expect(controller.delete('__proto__', '0x01')).toBe(false);
expect(controller.delete(toHex(1), 'constructor')).toBe(false);
});

it('should return false to indicate an address book entry has NOT been deleted', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', '0x00');
expect(controller.delete(toHex(1), '0x01')).toBe(false);
});

it('should normalize addresses so adding and removing entries work across casings', () => {
const controller = new AddressBookController();
const controller = new AddressBookController({
messenger: getRestrictedMessenger(),
});
controller.set('0x32Be343B94f860124dC4fEe278FDCBD38C102D88', 'foo');

controller.set('0xc38bf1ad06ef69f0c04e29dbeb4152b4175f0a8d', 'bar');
Expand Down
Loading

0 comments on commit fbf8339

Please sign in to comment.