From 2c7ad02740d11f20a4ac3ab4bdda34bddf5ae461 Mon Sep 17 00:00:00 2001 From: legobeat <109787230+legobeat@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:24:35 +0900 Subject: [PATCH 1/6] chore(test): Refactor FakeBlockTracker provider injection (#4345) --- .../src/NftDetectionController.test.ts | 5 +++-- .../tests/NetworkController.test.ts | 2 +- packages/network-controller/tests/helpers.ts | 5 +++-- packages/transaction-controller/package.json | 1 + .../src/TransactionController.test.ts | 19 ++++++++++++------- tests/fake-block-tracker.ts | 7 +++---- yarn.lock | 1 + 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/packages/assets-controllers/src/NftDetectionController.test.ts b/packages/assets-controllers/src/NftDetectionController.test.ts index 8984134a0e6..79e08cee931 100644 --- a/packages/assets-controllers/src/NftDetectionController.test.ts +++ b/packages/assets-controllers/src/NftDetectionController.test.ts @@ -862,6 +862,7 @@ describe('NftDetectionController', () => { it('should return true if mainnet is detected', async () => { const mockAddNft = jest.fn(); + const provider = new FakeProvider(); const mockNetworkClient: NetworkClient = { configuration: { chainId: ChainId.mainnet, @@ -869,8 +870,8 @@ describe('NftDetectionController', () => { ticker: 'TEST', type: NetworkClientType.Custom, }, - provider: new FakeProvider(), - blockTracker: new FakeBlockTracker(), + provider, + blockTracker: new FakeBlockTracker({ provider }), destroy: () => { // do nothing }, diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 18e3476d7b8..3d7d8639d0b 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -7574,7 +7574,7 @@ function buildFakeClient( rpcUrl: 'https://test.network', }, provider, - blockTracker: new FakeBlockTracker(), + blockTracker: new FakeBlockTracker({ provider }), destroy: () => { // do nothing }, diff --git a/packages/network-controller/tests/helpers.ts b/packages/network-controller/tests/helpers.ts index c93c0efa7fd..3a686cb9c84 100644 --- a/packages/network-controller/tests/helpers.ts +++ b/packages/network-controller/tests/helpers.ts @@ -39,10 +39,11 @@ function buildFakeNetworkClient({ configuration: NetworkClientConfiguration; providerStubs?: FakeProviderStub[]; }): NetworkClient { + const provider = new FakeProvider({ stubs: providerStubs }); return { configuration, - provider: new FakeProvider({ stubs: providerStubs }), - blockTracker: new FakeBlockTracker(), + provider, + blockTracker: new FakeBlockTracker({ provider }), destroy: () => { // do nothing }, diff --git a/packages/transaction-controller/package.json b/packages/transaction-controller/package.json index 3bc8e971216..583cfdd0200 100644 --- a/packages/transaction-controller/package.json +++ b/packages/transaction-controller/package.json @@ -67,6 +67,7 @@ "devDependencies": { "@babel/runtime": "^7.23.9", "@metamask/auto-changelog": "^3.4.4", + "@metamask/eth-json-rpc-provider": "^4.0.0", "@metamask/ethjs-provider-http": "^0.3.0", "@types/bn.js": "^5.1.5", "@types/jest": "^27.4.1", diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index 96d44c84cbe..32ee799940c 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -14,6 +14,7 @@ import { BUILT_IN_NETWORKS, ORIGIN_METAMASK, } from '@metamask/controller-utils'; +import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider'; import EthQuery from '@metamask/eth-query'; import HttpProvider from '@metamask/ethjs-provider-http'; import type { @@ -245,10 +246,14 @@ function buildMockEthQuery(): EthQuery { * * @param latestBlockNumber - The block number that the block tracker should * always return. + * @param provider - json rpc provider * @returns The mocked block tracker. */ -function buildMockBlockTracker(latestBlockNumber: string): BlockTracker { - const fakeBlockTracker = new FakeBlockTracker(); +function buildMockBlockTracker( + latestBlockNumber: string, + provider: SafeEventEmitterProvider, +): BlockTracker { + const fakeBlockTracker = new FakeBlockTracker({ provider }); fakeBlockTracker.mockLatestBlockNumber(latestBlockNumber); return fakeBlockTracker; } @@ -309,7 +314,7 @@ type MockNetwork = { const MOCK_NETWORK: MockNetwork = { provider: MAINNET_PROVIDER, - blockTracker: buildMockBlockTracker('0x102833C'), + blockTracker: buildMockBlockTracker('0x102833C', MAINNET_PROVIDER), state: { selectedNetworkClientId: NetworkType.goerli, networksMetadata: { @@ -329,7 +334,7 @@ const MOCK_NETWORK: MockNetwork = { }; const MOCK_MAINNET_NETWORK: MockNetwork = { provider: MAINNET_PROVIDER, - blockTracker: buildMockBlockTracker('0x102833C'), + blockTracker: buildMockBlockTracker('0x102833C', MAINNET_PROVIDER), state: { selectedNetworkClientId: NetworkType.mainnet, networksMetadata: { @@ -350,7 +355,7 @@ const MOCK_MAINNET_NETWORK: MockNetwork = { const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC'), + blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), state: { selectedNetworkClientId: NetworkType['linea-mainnet'], networksMetadata: { @@ -371,7 +376,7 @@ const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC'), + blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), state: { selectedNetworkClientId: NetworkType['linea-goerli'], networksMetadata: { @@ -392,7 +397,7 @@ const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { const MOCK_CUSTOM_NETWORK: MockNetwork = { provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC'), + blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), state: { selectedNetworkClientId: 'uuid-1', networksMetadata: { diff --git a/tests/fake-block-tracker.ts b/tests/fake-block-tracker.ts index 0c7365b441e..55439211f1a 100644 --- a/tests/fake-block-tracker.ts +++ b/tests/fake-block-tracker.ts @@ -1,6 +1,5 @@ import { PollingBlockTracker } from '@metamask/eth-block-tracker'; -import { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider'; -import { JsonRpcEngine } from '@metamask/json-rpc-engine'; +import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider'; /** * Acts like a PollingBlockTracker, but doesn't start the polling loop or @@ -9,9 +8,9 @@ import { JsonRpcEngine } from '@metamask/json-rpc-engine'; export class FakeBlockTracker extends PollingBlockTracker { #latestBlockNumber = '0x0'; - constructor() { + constructor({ provider }: { provider: SafeEventEmitterProvider }) { super({ - provider: new SafeEventEmitterProvider({ engine: new JsonRpcEngine() }), + provider, }); // Don't start the polling loop // TODO: Replace `any` with type diff --git a/yarn.lock b/yarn.lock index e78b424eee2..9bd4654f22a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3145,6 +3145,7 @@ __metadata: "@metamask/auto-changelog": ^3.4.4 "@metamask/base-controller": ^6.0.0 "@metamask/controller-utils": ^11.0.0 + "@metamask/eth-json-rpc-provider": ^4.0.0 "@metamask/eth-query": ^4.0.0 "@metamask/ethjs-provider-http": ^0.3.0 "@metamask/gas-fee-controller": ^17.0.0 From f4a6f863324a1f30ed46152f8d5f14a2cc639e4e Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Thu, 6 Jun 2024 23:12:36 +0000 Subject: [PATCH 2/6] test(transaction-controller): refactor provider injection to lookup table --- .../src/TransactionController.test.ts | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index 32ee799940c..efacffd9cab 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -298,12 +298,15 @@ function waitForTransactionFinished( const MOCK_PREFERENCES = { state: { selectedAddress: 'foo' } }; const INFURA_PROJECT_ID = '341eacb578dd44a1a049cbc5f6fd4035'; -const MAINNET_PROVIDER = new HttpProvider( - `https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, -); -const PALM_PROVIDER = new HttpProvider( - `https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, -); +const HTTP_PROVIDERS = { + mainnet: new HttpProvider(`https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + palm: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + /* + goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + linea: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + linea_goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + */ +} type MockNetwork = { provider: Provider; @@ -313,8 +316,8 @@ type MockNetwork = { }; const MOCK_NETWORK: MockNetwork = { - provider: MAINNET_PROVIDER, - blockTracker: buildMockBlockTracker('0x102833C', MAINNET_PROVIDER), + provider: HTTP_PROVIDERS.mainnet, + blockTracker: buildMockBlockTracker('0x102833C', HTTP_PROVIDERS.mainnet), state: { selectedNetworkClientId: NetworkType.goerli, networksMetadata: { @@ -333,8 +336,8 @@ const MOCK_NETWORK: MockNetwork = { subscribe: () => undefined, }; const MOCK_MAINNET_NETWORK: MockNetwork = { - provider: MAINNET_PROVIDER, - blockTracker: buildMockBlockTracker('0x102833C', MAINNET_PROVIDER), + provider: HTTP_PROVIDERS.mainnet, + blockTracker: buildMockBlockTracker('0x102833C', HTTP_PROVIDERS.mainnet), state: { selectedNetworkClientId: NetworkType.mainnet, networksMetadata: { @@ -354,8 +357,8 @@ const MOCK_MAINNET_NETWORK: MockNetwork = { }; const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { - provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), + provider: HTTP_PROVIDERS.palm, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), state: { selectedNetworkClientId: NetworkType['linea-mainnet'], networksMetadata: { @@ -375,8 +378,8 @@ const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { }; const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { - provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), + provider: HTTP_PROVIDERS.palm, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), state: { selectedNetworkClientId: NetworkType['linea-goerli'], networksMetadata: { @@ -396,8 +399,8 @@ const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { }; const MOCK_CUSTOM_NETWORK: MockNetwork = { - provider: PALM_PROVIDER, - blockTracker: buildMockBlockTracker('0xA6EDFC', PALM_PROVIDER), + provider: HTTP_PROVIDERS.palm, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), state: { selectedNetworkClientId: 'uuid-1', networksMetadata: { From 0cfadb57cbdd4a199a7c7d6c67ec2f9820454ed0 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Thu, 6 Jun 2024 23:16:25 +0000 Subject: [PATCH 3/6] chore: use separate blockTrackers/providers per network in test previously a single provider referencing "palm mainnet" stood in for all except ethereum-mainnet --- .../src/TransactionController.test.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index efacffd9cab..4add11a0cb4 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -300,12 +300,10 @@ const MOCK_PREFERENCES = { state: { selectedAddress: 'foo' } }; const INFURA_PROJECT_ID = '341eacb578dd44a1a049cbc5f6fd4035'; const HTTP_PROVIDERS = { mainnet: new HttpProvider(`https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - palm: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - /* goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), linea: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), linea_goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - */ + custom: new HttpProvider(`http://127.0.0.123:456/ethrpc?apiKey=foobar`), } type MockNetwork = { @@ -357,8 +355,8 @@ const MOCK_MAINNET_NETWORK: MockNetwork = { }; const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { - provider: HTTP_PROVIDERS.palm, - blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), + provider: HTTP_PROVIDERS.linea, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.linea), state: { selectedNetworkClientId: NetworkType['linea-mainnet'], networksMetadata: { @@ -378,8 +376,8 @@ const MOCK_LINEA_MAINNET_NETWORK: MockNetwork = { }; const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { - provider: HTTP_PROVIDERS.palm, - blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), + provider: HTTP_PROVIDERS.linea_goerli, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.linea_goerli), state: { selectedNetworkClientId: NetworkType['linea-goerli'], networksMetadata: { @@ -399,8 +397,8 @@ const MOCK_LINEA_GOERLI_NETWORK: MockNetwork = { }; const MOCK_CUSTOM_NETWORK: MockNetwork = { - provider: HTTP_PROVIDERS.palm, - blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.palm), + provider: HTTP_PROVIDERS.custom, + blockTracker: buildMockBlockTracker('0xA6EDFC', HTTP_PROVIDERS.custom), state: { selectedNetworkClientId: 'uuid-1', networksMetadata: { From bb26c95bbf490cb31c44134577d97c68c15b9d2a Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Thu, 6 Jun 2024 23:49:08 +0000 Subject: [PATCH 4/6] lint:fix --- .../src/TransactionController.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index 4add11a0cb4..2510bd49af1 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -299,12 +299,20 @@ function waitForTransactionFinished( const MOCK_PREFERENCES = { state: { selectedAddress: 'foo' } }; const INFURA_PROJECT_ID = '341eacb578dd44a1a049cbc5f6fd4035'; const HTTP_PROVIDERS = { - mainnet: new HttpProvider(`https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - linea: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), - linea_goerli: new HttpProvider(`https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`), + mainnet: new HttpProvider( + `https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, + ), + goerli: new HttpProvider( + `https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, + ), + linea: new HttpProvider( + `https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, + ), + linea_goerli: new HttpProvider( + `https://palm-mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, + ), custom: new HttpProvider(`http://127.0.0.123:456/ethrpc?apiKey=foobar`), -} +}; type MockNetwork = { provider: Provider; From d918c5baa07e16511be3285a11aac70864d7d349 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Thu, 6 Jun 2024 23:59:00 +0000 Subject: [PATCH 5/6] fix(transaction-controller): MultichainTrackingHelper should always return global ethQuery when !isMultichainEnabled --- .../src/helpers/MultichainTrackingHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts b/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts index 403cfabdbd3..f14fb419ed0 100644 --- a/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts +++ b/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts @@ -190,7 +190,7 @@ export class MultichainTrackingHelper { networkClientId?: NetworkClientId; chainId?: Hex; } = {}): EthQuery | undefined { - if (!networkClientId && !chainId) { + if (!networkClientId && !chainId || !this.#isMultichainEnabled) { const globalProvider = this.#getGlobalProviderAndBlockTracker()?.provider; return globalProvider ? new EthQuery(globalProvider) : undefined; } From df864eb970cea2d559842dd433a4ada327a11f52 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Fri, 7 Jun 2024 00:09:28 +0000 Subject: [PATCH 6/6] lint:fix --- .../src/helpers/MultichainTrackingHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts b/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts index f14fb419ed0..ae5f171d5fd 100644 --- a/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts +++ b/packages/transaction-controller/src/helpers/MultichainTrackingHelper.ts @@ -190,7 +190,7 @@ export class MultichainTrackingHelper { networkClientId?: NetworkClientId; chainId?: Hex; } = {}): EthQuery | undefined { - if (!networkClientId && !chainId || !this.#isMultichainEnabled) { + if ((!networkClientId && !chainId) || !this.#isMultichainEnabled) { const globalProvider = this.#getGlobalProviderAndBlockTracker()?.provider; return globalProvider ? new EthQuery(globalProvider) : undefined; }