diff --git a/README.md b/README.md index 217db0a052c..c68b300cb33 100644 --- a/README.md +++ b/README.md @@ -310,6 +310,7 @@ linkStyle default opacity:0.5 assets_controllers --> remote_feature_flag_controller; assets_controllers --> storage_service; assets_controllers --> transaction_controller; + assets_controllers --> eth_block_tracker; assets_controllers --> eth_json_rpc_provider; authenticated_user_storage --> base_data_service; authenticated_user_storage --> controller_utils; diff --git a/package.json b/package.json index 8021f19b336..40f200ab63c 100644 --- a/package.json +++ b/package.json @@ -74,9 +74,6 @@ "@metamask/eslint-config-jest": "^15.0.0", "@metamask/eslint-config-nodejs": "^15.0.0", "@metamask/eslint-config-typescript": "^15.0.0", - "@metamask/eth-block-tracker": "^16.0.0", - "@metamask/eth-json-rpc-provider": "^7.0.0", - "@metamask/json-rpc-engine": "^11.0.0", "@metamask/network-controller": "^37.0.0", "@metamask/skills": "^0.1.0", "@metamask/utils": "^11.12.0", diff --git a/packages/assets-controllers/package.json b/packages/assets-controllers/package.json index 5d322c59ee2..9e35cea0876 100644 --- a/packages/assets-controllers/package.json +++ b/packages/assets-controllers/package.json @@ -102,6 +102,7 @@ "@babel/runtime": "^7.23.9", "@metamask/account-api": "^2.0.0", "@metamask/auto-changelog": "^6.1.0", + "@metamask/eth-block-tracker": "^16.0.0", "@metamask/eth-json-rpc-provider": "^7.0.0", "@metamask/ethjs-provider-http": "^0.3.0", "@metamask/keyring-internal-api": "^12.0.0", diff --git a/packages/assets-controllers/src/NftDetectionController.test.ts b/packages/assets-controllers/src/NftDetectionController.test.ts index d767473299f..8260fd9e5e1 100644 --- a/packages/assets-controllers/src/NftDetectionController.test.ts +++ b/packages/assets-controllers/src/NftDetectionController.test.ts @@ -4,6 +4,7 @@ import { ChainId, InfuraNetworkType, } from '@metamask/controller-utils'; +import { MockPollingBlockTracker } from '@metamask/eth-block-tracker'; import { MockInternalProvider } from '@metamask/eth-json-rpc-provider'; import { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger'; import type { @@ -26,7 +27,6 @@ import { getDefaultPreferencesState } from '@metamask/preferences-controller'; import type { PreferencesState } from '@metamask/preferences-controller'; import nock from 'nock'; -import { FakeBlockTracker } from '../../../tests/fake-block-tracker.js'; import { jestAdvanceTime } from '../../../tests/helpers.js'; import { createMockInternalAccount } from '../../accounts-controller/tests/mocks.js'; import { @@ -781,7 +781,7 @@ describe('NftDetectionController', () => { type: NetworkClientType.Custom, }, provider, - blockTracker: new FakeBlockTracker({ provider }), + blockTracker: new MockPollingBlockTracker({ provider }), destroy: () => { // do nothing }, diff --git a/packages/assets-controllers/tsconfig.build.json b/packages/assets-controllers/tsconfig.build.json index 336ee1e79fe..1f5aa501ff3 100644 --- a/packages/assets-controllers/tsconfig.build.json +++ b/packages/assets-controllers/tsconfig.build.json @@ -64,6 +64,9 @@ }, { "path": "../eth-json-rpc-provider/tsconfig.build.json" + }, + { + "path": "../eth-block-tracker/tsconfig.build.json" } ], "include": ["../../types", "./src"], diff --git a/packages/assets-controllers/tsconfig.json b/packages/assets-controllers/tsconfig.json index 697fd938e56..77d9ce319dc 100644 --- a/packages/assets-controllers/tsconfig.json +++ b/packages/assets-controllers/tsconfig.json @@ -63,6 +63,9 @@ }, { "path": "../eth-json-rpc-provider" + }, + { + "path": "../eth-block-tracker" } ], "include": ["../../types", "./src", "../../tests"] diff --git a/packages/eth-block-tracker/jest.config.cjs b/packages/eth-block-tracker/jest.config.cjs index ed2bf4de9b6..8e2133092fe 100644 --- a/packages/eth-block-tracker/jest.config.cjs +++ b/packages/eth-block-tracker/jest.config.cjs @@ -14,6 +14,12 @@ module.exports = merge(baseConfig, { // The display name when running multiple projects displayName, + // An array of regexp pattern strings used to skip coverage collection + coveragePathIgnorePatterns: [ + // This file is tested indirectly in other packages' test suites. + '.*/MockPollingBlockTracker\\.ts', + ], + // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { global: { diff --git a/tests/fake-block-tracker.ts b/packages/eth-block-tracker/src/MockPollingBlockTracker.ts similarity index 55% rename from tests/fake-block-tracker.ts rename to packages/eth-block-tracker/src/MockPollingBlockTracker.ts index 735ac706874..5dea4325b37 100644 --- a/tests/fake-block-tracker.ts +++ b/packages/eth-block-tracker/src/MockPollingBlockTracker.ts @@ -1,23 +1,32 @@ -import { PollingBlockTracker } from '@metamask/eth-block-tracker'; import type { InternalProvider } from '@metamask/eth-json-rpc-provider'; import type { ContextConstraint, MiddlewareContext, } from '@metamask/json-rpc-engine/v2'; +import { Hex } from '@metamask/utils'; + +import { PollingBlockTracker } from './PollingBlockTracker.js'; /** * Acts like a PollingBlockTracker, but doesn't start the polling loop or * make any requests. */ -export class FakeBlockTracker< +export class MockPollingBlockTracker< Context extends ContextConstraint = MiddlewareContext, > extends PollingBlockTracker { - #latestBlockNumber = '0x0'; + latestBlockNumber: Hex; + + constructor({ + provider, + latestBlockNumber = '0x0', + }: { + provider: InternalProvider; + latestBlockNumber?: Hex; + }) { + super({ provider }); + + this.latestBlockNumber = latestBlockNumber; - constructor({ provider }: { provider: InternalProvider }) { - super({ - provider, - }); // Don't start the polling loop // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -26,20 +35,11 @@ export class FakeBlockTracker< }; } - /** - * Sets the number of the block that the block tracker will always return. - * - * @param latestBlockNumber - The block number to use. - */ - mockLatestBlockNumber(latestBlockNumber: string): void { - this.#latestBlockNumber = latestBlockNumber; - } - override async getLatestBlock(): Promise { - return this.#latestBlockNumber; + return this.latestBlockNumber; } override async checkForLatestBlock(): Promise { - return this.#latestBlockNumber; + return this.latestBlockNumber; } } diff --git a/packages/eth-block-tracker/src/index.ts b/packages/eth-block-tracker/src/index.ts index 32370f265de..ef158239f66 100644 --- a/packages/eth-block-tracker/src/index.ts +++ b/packages/eth-block-tracker/src/index.ts @@ -1,2 +1,3 @@ export * from './PollingBlockTracker.js'; export type * from './BlockTracker.js'; +export { MockPollingBlockTracker } from './MockPollingBlockTracker.js'; diff --git a/packages/multichain-transactions-controller/src/MultichainTransactionsController.ts b/packages/multichain-transactions-controller/src/MultichainTransactionsController.ts index 92fd043768b..9792b7a9946 100644 --- a/packages/multichain-transactions-controller/src/MultichainTransactionsController.ts +++ b/packages/multichain-transactions-controller/src/MultichainTransactionsController.ts @@ -313,6 +313,10 @@ export class MultichainTransactionsController extends BaseController< } chainUpdates.forEach(({ chain, entry }) => { + // Using `@ts-ignore` instead of `@ts-expect-error` since this error + // comes and goes after unrelated changes. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore: TS2589: Type instantiation is excessively deep and possibly infinite. state.nonEvmTransactions[account.id][chain as CaipChainId] = entry; }); }); diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 63b1f66b943..0b318595ca2 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -10,6 +10,7 @@ import { toHex, } from '@metamask/controller-utils'; import { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker'; +import { MockPollingBlockTracker } from '@metamask/eth-block-tracker'; import type { MockInternalProviderStub } from '@metamask/eth-json-rpc-provider'; import { MockInternalProvider } from '@metamask/eth-json-rpc-provider'; import { rpcErrors } from '@metamask/rpc-errors'; @@ -20,7 +21,6 @@ import { when, resetAllWhenMocks, WhenMock } from 'jest-when'; import { inspect, isDeepStrictEqual, promisify } from 'util'; import { v4 as uuidV4 } from 'uuid'; -import { FakeBlockTracker } from '../../../tests/fake-block-tracker.js'; import { NetworkStatus } from '../src/constants.js'; import * as createAutoManagedNetworkClientModule from '../src/create-auto-managed-network-client.js'; import type { AutoManagedNetworkClient } from '../src/create-auto-managed-network-client.js'; @@ -16874,7 +16874,7 @@ function buildFakeClient( rpcUrl: 'https://test.network', }, provider, - blockTracker: new FakeBlockTracker({ + blockTracker: new MockPollingBlockTracker({ provider, }), destroy: (): void => { diff --git a/packages/network-controller/tests/helpers.ts b/packages/network-controller/tests/helpers.ts index 4dabb860d5c..55fcbd27b53 100644 --- a/packages/network-controller/tests/helpers.ts +++ b/packages/network-controller/tests/helpers.ts @@ -9,7 +9,7 @@ import { NetworksTicker, toHex, } from '@metamask/controller-utils'; -import type { InternalProvider } from '@metamask/eth-json-rpc-provider'; +import { MockPollingBlockTracker } from '@metamask/eth-block-tracker'; import { MockInternalProvider } from '@metamask/eth-json-rpc-provider'; import type { MockInternalProviderStub } from '@metamask/eth-json-rpc-provider'; import { Messenger, MOCK_ANY_NAMESPACE } from '@metamask/messenger'; @@ -21,7 +21,6 @@ import type { import type { CaipChainId, Hex } from '@metamask/utils'; import { v4 as uuidV4 } from 'uuid'; -import { FakeBlockTracker } from '../../../tests/fake-block-tracker.js'; import { buildTestObject } from '../../../tests/helpers.js'; import type { AutoManagedNetworkClient } from '../src/create-auto-managed-network-client.js'; import { NetworkController } from '../src/index.js'; @@ -236,9 +235,7 @@ function buildFakeNetworkClient({ return { configuration, provider, - blockTracker: new FakeBlockTracker({ - provider: provider as unknown as InternalProvider, - }), + blockTracker: new MockPollingBlockTracker({ provider }), destroy: (): void => { // do nothing }, diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index 1224db2bb45..b32d8f575f5 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -15,6 +15,7 @@ import { ORIGIN_METAMASK, InfuraNetworkType, } from '@metamask/controller-utils'; +import { MockPollingBlockTracker } from '@metamask/eth-block-tracker'; import type { InternalProvider } from '@metamask/eth-json-rpc-provider'; import { MockInternalProvider } from '@metamask/eth-json-rpc-provider'; import HttpProvider from '@metamask/ethjs-provider-http'; @@ -43,7 +44,6 @@ import assert from 'assert'; // eslint-disable-next-line import-x/namespace import * as uuidModule from 'uuid'; -import { FakeBlockTracker } from '../../../tests/fake-block-tracker.js'; import { flushPromises, jestAdvanceTime } from '../../../tests/helpers.js'; import { buildCustomNetworkClientConfiguration, @@ -198,9 +198,7 @@ function buildMockBlockTracker( latestBlockNumber: string, provider: InternalProvider, ): BlockTracker { - const fakeBlockTracker = new FakeBlockTracker({ provider }); - fakeBlockTracker.mockLatestBlockNumber(latestBlockNumber); - return fakeBlockTracker; + return new MockPollingBlockTracker({ provider, latestBlockNumber }); } /** diff --git a/yarn.lock b/yarn.lock index 4e0500a3b1a..7be9de280d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5909,6 +5909,7 @@ __metadata: "@metamask/contract-metadata": "npm:^2.4.0" "@metamask/controller-utils": "npm:^13.0.0" "@metamask/core-backend": "npm:^10.0.0" + "@metamask/eth-block-tracker": "npm:^16.0.0" "@metamask/eth-json-rpc-provider": "npm:^7.0.0" "@metamask/eth-query": "npm:^4.0.0" "@metamask/ethjs-provider-http": "npm:^0.3.0" @@ -6598,9 +6599,6 @@ __metadata: "@metamask/eslint-config-jest": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" "@metamask/eslint-config-typescript": "npm:^15.0.0" - "@metamask/eth-block-tracker": "npm:^16.0.0" - "@metamask/eth-json-rpc-provider": "npm:^7.0.0" - "@metamask/json-rpc-engine": "npm:^11.0.0" "@metamask/network-controller": "npm:^37.0.0" "@metamask/skills": "npm:^0.1.0" "@metamask/utils": "npm:^11.12.0"