import { CHAIN_IDS } from '../../shared/constants/network'; import { getConnectedSubjectsForSelectedAddress, getLastConnectedInfo, getOrderedConnectedAccountsForActiveTab, getPermissionsForActiveTab, } from './permissions'; describe('selectors', () => { describe('getConnectedSubjectsForSelectedAddress', () => { it('should return the list of connected subjects when there is 1 connected account', () => { const mockState = { metamask: { selectedAddress: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', subjectMetadata: { 'peepeth.com': { iconUrl: 'https://peepeth.com/favicon-32x32.png', name: 'Peepeth', }, 'https://remix.ethereum.org': { iconUrl: 'https://remix.ethereum.org/icon.png', name: 'Remix - Ethereum IDE', }, }, subjects: { 'peepeth.com': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585676177970, id: '840d72a0-925f-449f-830a-1aa1dd5ce151', invoker: 'peepeth.com', parentCapability: 'eth_accounts', }, }, }, 'https://remix.ethereum.org': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585685128948, id: '6b9615cc-64e4-4317-afab-3c4f8ee0244a', invoker: 'https://remix.ethereum.org', parentCapability: 'eth_accounts', }, }, }, }, }, }; const extensionId = undefined; expect(getConnectedSubjectsForSelectedAddress(mockState)).toStrictEqual([ { extensionId, iconUrl: 'https://peepeth.com/favicon-32x32.png', origin: 'peepeth.com', name: 'Peepeth', }, { extensionId, name: 'Remix - Ethereum IDE', iconUrl: 'https://remix.ethereum.org/icon.png', origin: 'https://remix.ethereum.org', }, ]); }); it('should return the list of connected subjects when there are 2 connected accounts', () => { const mockState = { metamask: { selectedAddress: '0x7250739de134d33ec7ab1ee592711e15098c9d2d', subjectMetadata: { 'peepeth.com': { iconUrl: 'https://peepeth.com/favicon-32x32.png', name: 'Peepeth', }, 'https://remix.ethereum.org': { iconUrl: 'https://remix.ethereum.org/icon.png', name: 'Remix - Ethereum IDE', }, }, subjects: { 'peepeth.com': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585676177970, id: '840d72a0-925f-449f-830a-1aa1dd5ce151', invoker: 'peepeth.com', parentCapability: 'eth_accounts', }, }, }, 'https://remix.ethereum.org': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: [ '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', '0x7250739de134d33ec7ab1ee592711e15098c9d2d', ], }, ], date: 1585685128948, id: '6b9615cc-64e4-4317-afab-3c4f8ee0244a', invoker: 'https://remix.ethereum.org', parentCapability: 'eth_accounts', }, }, }, }, }, }; const extensionId = undefined; expect(getConnectedSubjectsForSelectedAddress(mockState)).toStrictEqual([ { extensionId, name: 'Remix - Ethereum IDE', iconUrl: 'https://remix.ethereum.org/icon.png', origin: 'https://remix.ethereum.org', }, ]); }); }); describe('getConnectedAccountsForActiveTab', () => { const mockState = { activeTab: { title: 'Eth Sign Tests', origin: 'https://remix.ethereum.org', protocol: 'https:', url: 'https://remix.ethereum.org/', }, metamask: { provider: { chainId: CHAIN_IDS.GOERLI, }, accounts: { '0x7250739de134d33ec7ab1ee592711e15098c9d2d': { address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d', }, '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': { address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', }, '0xb3958fb96c8201486ae20be1d5c9f58083df343a': { address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a', }, '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', }, '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4': { address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4', }, }, cachedBalances: {}, subjects: { 'https://remix.ethereum.org': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: [ '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', '0x7250739de134d33ec7ab1ee592711e15098c9d2d', '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4', '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', '0xb3958fb96c8201486ae20be1d5c9f58083df343a', ], }, ], date: 1586359844177, id: '3aa65a8b-3bcb-4944-941b-1baa5fe0ed8b', invoker: 'https://remix.ethereum.org', parentCapability: 'eth_accounts', }, }, }, 'peepeth.com': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585676177970, id: '840d72a0-925f-449f-830a-1aa1dd5ce151', invoker: 'peepeth.com', parentCapability: 'eth_accounts', }, }, }, }, identities: { '0x7250739de134d33ec7ab1ee592711e15098c9d2d': { address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d', name: 'Really Long Name That Should Be Truncated', }, '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': { address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', lastSelected: 1586359844192, name: 'Account 1', }, '0xb3958fb96c8201486ae20be1d5c9f58083df343a': { lastSelected: 1586359844193, address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a', name: 'Account 2', }, '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', lastSelected: 1586359844192, name: 'Account 3', }, '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4': { address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4', name: 'Account 4', }, }, keyrings: [ { accounts: [ '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', '0x7250739de134d33ec7ab1ee592711e15098c9d2d', '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4', '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', '0xb3958fb96c8201486ae20be1d5c9f58083df343a', ], }, ], permissionHistory: { 'https://remix.ethereum.org': { eth_accounts: { accounts: { '0x7250739de134d33ec7ab1ee592711e15098c9d2d': 1586359844192, '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': 1586359844192, '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4': 1586359844192, '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': 1586359844192, '0xb3958fb96c8201486ae20be1d5c9f58083df343a': 1586359844192, }, lastApproved: 1586359844192, }, }, }, }, }; it('should return connected accounts sorted by last selected, then by keyring controller order', () => { expect(getOrderedConnectedAccountsForActiveTab(mockState)).toStrictEqual([ { address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a', balance: undefined, name: 'Account 2', lastActive: 1586359844192, lastSelected: 1586359844193, }, { address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', balance: undefined, name: 'Account 1', lastActive: 1586359844192, lastSelected: 1586359844192, }, { address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', balance: undefined, name: 'Account 3', lastActive: 1586359844192, lastSelected: 1586359844192, }, { address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d', balance: undefined, name: 'Really Long Name That Should Be Truncated', lastActive: 1586359844192, }, { address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4', balance: undefined, name: 'Account 4', lastActive: 1586359844192, }, ]); }); }); describe('getLastConnectedInfo', () => { it('retrieves the last connected info', () => { const mockState = { metamask: { permissionHistory: { a: { foo: {}, eth_accounts: { accounts: { 0x1: 1, 0x2: 2 } }, }, b: { foo: {}, eth_accounts: { accounts: { 0x2: 2 } }, }, c: { foo: {}, }, }, }, }; expect(getLastConnectedInfo(mockState)).toStrictEqual({ a: { accounts: { 0x1: 1, 0x2: 2 } }, b: { accounts: { 0x2: 2 } }, }); }); }); describe('getPermissionsForActiveTab', () => { const mockState = { activeTab: { title: 'Eth Sign Tests', origin: 'https://remix.ethereum.org', protocol: 'https:', url: 'https://remix.ethereum.org/', }, metamask: { identities: { '0x7250739de134d33ec7ab1ee592711e15098c9d2d': { address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d', name: 'Really Long Name That Should Be Truncated', }, '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': { address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', name: 'Account 1', }, '0xb3958fb96c8201486ae20be1d5c9f58083df343a': { address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a', name: 'Account 2', }, }, subjects: { 'https://remix.ethereum.org': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: [ '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', '0x7250739de134d33ec7ab1ee592711e15098c9d2d', ], }, ], date: 1586359844177, id: '3aa65a8b-3bcb-4944-941b-1baa5fe0ed8b', invoker: 'https://remix.ethereum.org', parentCapability: 'eth_accounts', }, }, }, 'peepeth.com': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585676177970, id: '840d72a0-925f-449f-830a-1aa1dd5ce151', invoker: 'peepeth.com', parentCapability: 'eth_accounts', }, }, }, 'uniswap.exchange': { permissions: { eth_accounts: { caveats: [ { type: 'restrictReturnedAccounts', value: ['0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5'], }, ], date: 1585616816623, id: 'ce625215-f2e9-48e7-93ca-21ba193244ff', invoker: 'uniswap.exchange', parentCapability: 'eth_accounts', }, }, }, }, subjectMetadata: { 'https://remix.ethereum.org': { iconUrl: 'https://remix.ethereum.org/icon.png', name: 'Remix - Ethereum IDE', }, }, permissionHistory: { 'https://remix.ethereum.org': { eth_accounts: { accounts: { '0x7250739de134d33ec7ab1ee592711e15098c9d2d': 1586359844192, '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': 1586359844192, }, lastApproved: 1586359844192, }, }, }, }, }; it('should return a list of permissions keys and values', () => { expect(getPermissionsForActiveTab(mockState)).toStrictEqual([ { key: 'eth_accounts', value: { caveats: [ { type: 'restrictReturnedAccounts', value: [ '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5', '0x7250739de134d33ec7ab1ee592711e15098c9d2d', ], }, ], date: 1586359844177, id: '3aa65a8b-3bcb-4944-941b-1baa5fe0ed8b', invoker: 'https://remix.ethereum.org', parentCapability: 'eth_accounts', }, }, ]); }); }); });