From d753360f5097e5f361ed478833e38bc05363487e Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:31:40 -0400 Subject: [PATCH 01/16] extracting the handles wrapper from rpc-middleware files to separate file --- .../handlers/handler-wrapper.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts new file mode 100644 index 000000000000..7be0af8f0efe --- /dev/null +++ b/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts @@ -0,0 +1,25 @@ +import type { + JsonRpcEngineNextCallback, + JsonRpcEngineEndCallback, +} from '@metamask/json-rpc-engine'; +import type { + JsonRpcRequest, + JsonRpcResponse, + JsonRpcParams, + Json, +} from '@metamask/utils'; + +export type HandlerWrapperType< + Params extends JsonRpcParams = JsonRpcParams, + Result extends Json = Json, +> = { + methodNames: [string]; + implementation: ( + _req: JsonRpcRequest, + res: JsonRpcResponse, + _next: JsonRpcEngineNextCallback, + end: JsonRpcEngineEndCallback, + options: Record void>, + ) => Promise; + hookNames: Record; +}; From 0bf8bda34e437902d6684ffd5243b00f42c280cb Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:14:00 -0400 Subject: [PATCH 02/16] updating with a helper file --- .../handlers/handler-wrapper.ts | 25 ------------------- .../handlers/handlers-helper.ts | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts create mode 100644 app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts deleted file mode 100644 index 7be0af8f0efe..000000000000 --- a/app/scripts/lib/rpc-method-middleware/handlers/handler-wrapper.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { - JsonRpcEngineNextCallback, - JsonRpcEngineEndCallback, -} from '@metamask/json-rpc-engine'; -import type { - JsonRpcRequest, - JsonRpcResponse, - JsonRpcParams, - Json, -} from '@metamask/utils'; - -export type HandlerWrapperType< - Params extends JsonRpcParams = JsonRpcParams, - Result extends Json = Json, -> = { - methodNames: [string]; - implementation: ( - _req: JsonRpcRequest, - res: JsonRpcResponse, - _next: JsonRpcEngineNextCallback, - end: JsonRpcEngineEndCallback, - options: Record void>, - ) => Promise; - hookNames: Record; -}; diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts new file mode 100644 index 000000000000..d9c7d680e12b --- /dev/null +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -0,0 +1,25 @@ +export type HandlerWrapperType = { + methodNames: [string]; + hookNames: Record; +}; + +/** + * @typedef {object} ProviderStateHandlerResult + * @property {string} chainId - The current chain ID. + * @property {boolean} isUnlocked - Whether the extension is unlocked or not. + * @property {string} networkVersion - The current network ID. + * @property {string[]} accounts - List of permitted accounts for the specified origin. + */ +export type ProviderStateHandlerResult = { + chainId: string; + isUnlocked: boolean; + networkVersion: string; + accounts: string[]; +}; + +export type getAccountsType = () => Promise; +export type getProviderStateType = ( + origin: string, +) => Promise; +export type getWeb3ShimUsageStateType = (origin: string) => undefined | 1 | 2; +export type setWeb3ShimUsageRecordedType = (origin: string) => void; From 719bd7186acab18749f7fc8901916ce2f8273643 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:53:58 -0400 Subject: [PATCH 03/16] updating the naming case --- .../handlers/handlers-helper.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index d9c7d680e12b..c732d1c81bab 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -1,3 +1,9 @@ +import type { + PermissionSubjectMetadata, + SubjectType, +} from '@metamask/permission-controller'; +import type { Json } from '@metamask/utils'; + export type HandlerWrapperType = { methodNames: [string]; hookNames: Record; @@ -17,9 +23,17 @@ export type ProviderStateHandlerResult = { accounts: string[]; }; -export type getAccountsType = () => Promise; -export type getProviderStateType = ( +export type SubjectMetadataToAdd = PermissionSubjectMetadata & { + name?: string | null; + subjectType?: SubjectType | null; + extensionId?: string | null; + iconUrl?: string | null; +} & Record; + +export type GetAccountsType = () => Promise; +export type GetProviderStateType = ( origin: string, ) => Promise; -export type getWeb3ShimUsageStateType = (origin: string) => undefined | 1 | 2; -export type setWeb3ShimUsageRecordedType = (origin: string) => void; +export type GetWeb3ShimUsageStateType = (origin: string) => undefined | 1 | 2; +export type SetWeb3ShimUsageRecordedType = (origin: string) => void; +export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; From 6df3de3377a5867b2ab537fa23c47ee90a105c5b Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Wed, 27 Mar 2024 09:50:31 -0400 Subject: [PATCH 04/16] remaining the types and rearranging the order --- .../handlers/handlers-helper.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index c732d1c81bab..66e9c81186e0 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -4,7 +4,7 @@ import type { } from '@metamask/permission-controller'; import type { Json } from '@metamask/utils'; -export type HandlerWrapperType = { +export type HandlerWrapper = { methodNames: [string]; hookNames: Record; }; @@ -30,10 +30,16 @@ export type SubjectMetadataToAdd = PermissionSubjectMetadata & { iconUrl?: string | null; } & Record; -export type GetAccountsType = () => Promise; -export type GetProviderStateType = ( +export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; +export type GetAccounts = () => Promise; +export type GetProviderState = ( origin: string, ) => Promise; -export type GetWeb3ShimUsageStateType = (origin: string) => undefined | 1 | 2; -export type SetWeb3ShimUsageRecordedType = (origin: string) => void; -export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; +export type GetWeb3ShimUsageState = (origin: string) => undefined | 1 | 2; +export type HandleWatchAssetRequest = ({ + asset, + type, + origin, + networkClientId, +}: Record) => Promise; +export type SetWeb3ShimUsageRecorded = (origin: string) => void; From 271741bd87371ccf445cf0d45c82c7b662324ebc Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:10:34 -0400 Subject: [PATCH 05/16] updating jsdoc --- .../rpc-method-middleware/handlers/handlers-helper.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index 66e9c81186e0..3c05429631a4 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -10,11 +10,10 @@ export type HandlerWrapper = { }; /** - * @typedef {object} ProviderStateHandlerResult - * @property {string} chainId - The current chain ID. - * @property {boolean} isUnlocked - Whether the extension is unlocked or not. - * @property {string} networkVersion - The current network ID. - * @property {string[]} accounts - List of permitted accounts for the specified origin. + * @property chainId - The current chain ID. + * @property isUnlocked - Whether the extension is unlocked or not. + * @property networkVersion - The current network ID. + * @property accounts - List of permitted accounts for the specified origin. */ export type ProviderStateHandlerResult = { chainId: string; From 7b6668d9f91bbd24f853a9ea67b26db0a17a62b3 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:04:02 -0400 Subject: [PATCH 06/16] typescript conversion of teh file --- .../handlers/get-provider-state.js | 49 -------------- .../handlers/get-provider-state.ts | 65 +++++++++++++++++++ 2 files changed, 65 insertions(+), 49 deletions(-) delete mode 100644 app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.js create mode 100644 app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.js b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.js deleted file mode 100644 index 70dbb7b16cfa..000000000000 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.js +++ /dev/null @@ -1,49 +0,0 @@ -import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; - -/** - * This RPC method gets background state relevant to the provider. - * The background sends RPC notifications on state changes, but the provider - * first requests state on initialization. - */ - -const getProviderState = { - methodNames: [MESSAGE_TYPE.GET_PROVIDER_STATE], - implementation: getProviderStateHandler, - hookNames: { - getProviderState: true, - }, -}; -export default getProviderState; - -/** - * @typedef {object} ProviderStateHandlerResult - * @property {string} chainId - The current chain ID. - * @property {boolean} isUnlocked - Whether the extension is unlocked or not. - * @property {string} networkVersion - The current network ID. - */ - -/** - * @typedef {object} ProviderStateHandlerOptions - * @property {() => ProviderStateHandlerResult} getProviderState - A function that - * gets the current provider state. - */ - -/** - * @param {import('json-rpc-engine').JsonRpcRequest<[]>} req - The JSON-RPC request object. - * @param {import('json-rpc-engine').JsonRpcResponse} res - The JSON-RPC response object. - * @param {Function} _next - The json-rpc-engine 'next' callback. - * @param {Function} end - The json-rpc-engine 'end' callback. - * @param {ProviderStateHandlerOptions} options - */ -async function getProviderStateHandler( - req, - res, - _next, - end, - { getProviderState: _getProviderState }, -) { - res.result = { - ...(await _getProviderState(req.origin)), - }; - return end(); -} diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts new file mode 100644 index 000000000000..b5c3daca24ef --- /dev/null +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -0,0 +1,65 @@ +import type { + JsonRpcEngineNextCallback, + JsonRpcEngineEndCallback, +} from '@metamask/json-rpc-engine'; +import type { + JsonRpcRequest, + PendingJsonRpcResponse, + JsonRpcParams, +} from '@metamask/utils'; +import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; +import { + HandlerWrapper, + GetProviderState, + ProviderStateHandlerResult, +} from './handlers-helper'; + +type GetProviderStateConstraint = + { + implementation: ( + _req: JsonRpcRequest, + res: PendingJsonRpcResponse, + _next: JsonRpcEngineNextCallback, + end: JsonRpcEngineEndCallback, + { _getProviderState }: Record, + ) => Promise; + } & HandlerWrapper; + +/** + * This RPC method gets background state relevant to the provider. + * The background sends RPC notifications on state changes, but the provider + * first requests state on initialization. + */ +const getProviderState = { + methodNames: [MESSAGE_TYPE.GET_PROVIDER_STATE], + implementation: getProviderStateHandler, + hookNames: { + getProviderState: true, + }, +} satisfies GetProviderStateConstraint; + +export default getProviderState; + +/** + * @param req - The JSON-RPC request object. + * @param res - The JSON-RPC response object. + * @param _next - The json-rpc-engine 'next' callback. + * @param end - The json-rpc-engine 'end' callback. + * @param options + * @param options.getProviderState - An async function that gets the current provider state. + */ +async function getProviderStateHandler< + Params extends JsonRpcParams = JsonRpcParams, +>( + req: JsonRpcRequest, + res: PendingJsonRpcResponse, + _next: JsonRpcEngineNextCallback, + end: JsonRpcEngineEndCallback, + { getProviderState: _getProviderState }: Record, +): Promise { + const { origin } = req.origin; + res.result = { + ...(await _getProviderState(origin)), + }; + return end(); +} From ea116479c04982976b5c8928ec8e55341da141b9 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:53:06 -0400 Subject: [PATCH 07/16] adding the types needed for add-ethereum-chain --- .../handlers/handlers-helper.ts | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index 3c05429631a4..5043dc28b39e 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -1,8 +1,19 @@ +import { + AddApprovalOptions, + ApprovalFlowStartResult, + EndFlowOptions, + StartFlowOptions, +} from '@metamask/approval-controller'; +import { + NetworkClientId, + NetworkConfiguration, + ProviderConfig, +} from '@metamask/network-controller'; import type { PermissionSubjectMetadata, SubjectType, } from '@metamask/permission-controller'; -import type { Json } from '@metamask/utils'; +import type { Hex, Json } from '@metamask/utils'; export type HandlerWrapper = { methodNames: [string]; @@ -29,16 +40,44 @@ export type SubjectMetadataToAdd = PermissionSubjectMetadata & { iconUrl?: string | null; } & Record; +export type UpsertNetworkConfigurationOptions = { + referrer: string; + source: string; + setActive?: boolean; +}; + export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; +export type EndApprovalFlow = ({ id }: EndFlowOptions) => void; +export type FindNetworkConfigurationBy = ( + rpcInfo: Record, +) => ProviderConfig | null; +export type HasPermissions = (origin: string) => boolean; export type GetAccounts = () => Promise; +export type GetCurrentChainId = () => Hex; +export type GetCurrentRpcUrl = () => string | undefined; +export type GetProviderConfig = () => ProviderConfig; export type GetProviderState = ( origin: string, ) => Promise; export type GetWeb3ShimUsageState = (origin: string) => undefined | 1 | 2; -export type HandleWatchAssetRequest = ({ - asset, - type, - origin, - networkClientId, -}: Record) => Promise; +export type HandleWatchAssetRequest = ( + options: Record, +) => Promise; +export type StartApprovalFlow = ( + options?: StartFlowOptions, +) => ApprovalFlowStartResult; +export type SetNetworkClientIdForDomain = ( + domain: string, + networkClientId: NetworkClientId, +) => void; +export type SetActiveNetwork = ( + networkConfigurationIdOrType: string, +) => Promise; export type SetWeb3ShimUsageRecorded = (origin: string) => void; +export type RequestUserApproval = ( + options?: AddApprovalOptions, +) => Promise; +export type UpsertNetworkConfiguration = ( + networkConfiguration: NetworkConfiguration, + options?: UpsertNetworkConfigurationOptions, +) => Promise; From 4a96f0497757d10fd54028f5ccad2ea7e4bc121f Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:05:37 -0400 Subject: [PATCH 08/16] adding the types needed for request_accounts file --- .../handlers/handlers-helper.ts | 79 ++++++++++++++++--- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index 5043dc28b39e..dcb42075ec00 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -10,10 +10,22 @@ import { ProviderConfig, } from '@metamask/network-controller'; import type { + CaveatSpecificationConstraint, + ExtractCaveats, + ExtractPermission, + OriginString, + PermissionSpecificationConstraint, PermissionSubjectMetadata, + RequestedPermissions, + SubjectPermissions, SubjectType, + ValidPermission, } from '@metamask/permission-controller'; import type { Hex, Json } from '@metamask/utils'; +import { + MetaMetricsEventPayload, + MetaMetricsPageOptions, +} from '../../../../../shared/constants/metametrics'; export type HandlerWrapper = { methodNames: [string]; @@ -51,32 +63,73 @@ export type EndApprovalFlow = ({ id }: EndFlowOptions) => void; export type FindNetworkConfigurationBy = ( rpcInfo: Record, ) => ProviderConfig | null; -export type HasPermissions = (origin: string) => boolean; +export type HasPermissions = (origin: OriginString) => boolean; export type GetAccounts = () => Promise; export type GetCurrentChainId = () => Hex; export type GetCurrentRpcUrl = () => string | undefined; +export type GetPermissionsForOrigin< + ControllerCaveatSpecification extends CaveatSpecificationConstraint = CaveatSpecificationConstraint, +> = ( + origin: OriginString, +) => + | SubjectPermissions< + ValidPermission> + > + | undefined; export type GetProviderConfig = () => ProviderConfig; export type GetProviderState = ( - origin: string, + origin: OriginString, ) => Promise; -export type GetWeb3ShimUsageState = (origin: string) => undefined | 1 | 2; +export type GetUnlockPromise = ( + shouldShowUnlockRequest: boolean, +) => Promise; +export type GetWeb3ShimUsageState = (origin: OriginString) => undefined | 1 | 2; export type HandleWatchAssetRequest = ( options: Record, ) => Promise; -export type StartApprovalFlow = ( - options?: StartFlowOptions, -) => ApprovalFlowStartResult; -export type SetNetworkClientIdForDomain = ( - domain: string, - networkClientId: NetworkClientId, +export type RequestAccountsPermission< + ControllerPermissionSpecification extends PermissionSpecificationConstraint = PermissionSpecificationConstraint, + ControllerCaveatSpecification extends CaveatSpecificationConstraint = CaveatSpecificationConstraint, +> = ( + subject?: PermissionSubjectMetadata, + requestedPermissions?: RequestedPermissions, + options?: { + id?: string; + preserveExistingPermissions?: boolean; + }, +) => Promise< + [ + SubjectPermissions< + ExtractPermission< + ControllerPermissionSpecification, + ControllerCaveatSpecification + > + >, + { + data?: Record; + id: string; + origin: OriginString; + }, + ] +>; +export type RequestUserApproval = ( + options?: AddApprovalOptions, +) => Promise; +export type SendMetrics = ( + payload: MetaMetricsEventPayload, + options?: MetaMetricsPageOptions, ) => void; export type SetActiveNetwork = ( networkConfigurationIdOrType: string, ) => Promise; -export type SetWeb3ShimUsageRecorded = (origin: string) => void; -export type RequestUserApproval = ( - options?: AddApprovalOptions, -) => Promise; +export type SetNetworkClientIdForDomain = ( + domain: string, + networkClientId: NetworkClientId, +) => void; +export type SetWeb3ShimUsageRecorded = (origin: OriginString) => void; +export type StartApprovalFlow = ( + options?: StartFlowOptions, +) => ApprovalFlowStartResult; export type UpsertNetworkConfiguration = ( networkConfiguration: NetworkConfiguration, options?: UpsertNetworkConfigurationOptions, From 98a829e88c372369e65a731d8664e09b35ad3442 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:59:04 -0400 Subject: [PATCH 09/16] adding the types for switch-ethereum-chain --- .../handlers/handlers-helper.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index dcb42075ec00..920fefa23d27 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -22,16 +22,26 @@ import type { ValidPermission, } from '@metamask/permission-controller'; import type { Hex, Json } from '@metamask/utils'; +import { InfuraNetworkType } from '@metamask/controller-utils'; import { MetaMetricsEventPayload, MetaMetricsPageOptions, } from '../../../../../shared/constants/metametrics'; +export type ExistingNetworkChainIds = '0x1' | '0xaa36a7' | '0xe704' | '0xe708'; + export type HandlerWrapper = { methodNames: [string]; hookNames: Record; }; +export type NetworkConfigurations = Record< + string, + NetworkConfiguration & { + id: string; + } +>; + /** * @property chainId - The current chain ID. * @property isUnlocked - Whether the extension is unlocked or not. @@ -60,13 +70,15 @@ export type UpsertNetworkConfigurationOptions = { export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; export type EndApprovalFlow = ({ id }: EndFlowOptions) => void; +export type FindNetworkClientIdByChainId = (chainId: Hex) => NetworkClientId; export type FindNetworkConfigurationBy = ( rpcInfo: Record, ) => ProviderConfig | null; -export type HasPermissions = (origin: OriginString) => boolean; +export type HasPermission = (origin: OriginString) => boolean; export type GetAccounts = () => Promise; export type GetCurrentChainId = () => Hex; export type GetCurrentRpcUrl = () => string | undefined; +export type GetNetworkConfigurations = () => NetworkConfiguration; export type GetPermissionsForOrigin< ControllerCaveatSpecification extends CaveatSpecificationConstraint = CaveatSpecificationConstraint, > = ( @@ -126,6 +138,7 @@ export type SetNetworkClientIdForDomain = ( domain: string, networkClientId: NetworkClientId, ) => void; +export type SetProviderType = (type: InfuraNetworkType) => Promise; export type SetWeb3ShimUsageRecorded = (origin: OriginString) => void; export type StartApprovalFlow = ( options?: StartFlowOptions, From a890fe776292d7668c84be3fbdf2f66a7154a0f3 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:33:45 -0400 Subject: [PATCH 10/16] updating HandlerWrapper.methodNames type --- .../lib/rpc-method-middleware/handlers/handlers-helper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts index 920fefa23d27..35b384e3d565 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts @@ -31,7 +31,7 @@ import { export type ExistingNetworkChainIds = '0x1' | '0xaa36a7' | '0xe704' | '0xe708'; export type HandlerWrapper = { - methodNames: [string]; + methodNames: [string] | string[]; hookNames: Record; }; From 4ba159c0af059d46aa4b970760a235b563b53cc7 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:41:50 -0400 Subject: [PATCH 11/16] changing the file name --- .../handlers/handlers-helper.ts | 149 ------------------ 1 file changed, 149 deletions(-) delete mode 100644 app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts diff --git a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts b/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts deleted file mode 100644 index 35b384e3d565..000000000000 --- a/app/scripts/lib/rpc-method-middleware/handlers/handlers-helper.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { - AddApprovalOptions, - ApprovalFlowStartResult, - EndFlowOptions, - StartFlowOptions, -} from '@metamask/approval-controller'; -import { - NetworkClientId, - NetworkConfiguration, - ProviderConfig, -} from '@metamask/network-controller'; -import type { - CaveatSpecificationConstraint, - ExtractCaveats, - ExtractPermission, - OriginString, - PermissionSpecificationConstraint, - PermissionSubjectMetadata, - RequestedPermissions, - SubjectPermissions, - SubjectType, - ValidPermission, -} from '@metamask/permission-controller'; -import type { Hex, Json } from '@metamask/utils'; -import { InfuraNetworkType } from '@metamask/controller-utils'; -import { - MetaMetricsEventPayload, - MetaMetricsPageOptions, -} from '../../../../../shared/constants/metametrics'; - -export type ExistingNetworkChainIds = '0x1' | '0xaa36a7' | '0xe704' | '0xe708'; - -export type HandlerWrapper = { - methodNames: [string] | string[]; - hookNames: Record; -}; - -export type NetworkConfigurations = Record< - string, - NetworkConfiguration & { - id: string; - } ->; - -/** - * @property chainId - The current chain ID. - * @property isUnlocked - Whether the extension is unlocked or not. - * @property networkVersion - The current network ID. - * @property accounts - List of permitted accounts for the specified origin. - */ -export type ProviderStateHandlerResult = { - chainId: string; - isUnlocked: boolean; - networkVersion: string; - accounts: string[]; -}; - -export type SubjectMetadataToAdd = PermissionSubjectMetadata & { - name?: string | null; - subjectType?: SubjectType | null; - extensionId?: string | null; - iconUrl?: string | null; -} & Record; - -export type UpsertNetworkConfigurationOptions = { - referrer: string; - source: string; - setActive?: boolean; -}; - -export type AddSubjectMetadata = (metadata: SubjectMetadataToAdd) => void; -export type EndApprovalFlow = ({ id }: EndFlowOptions) => void; -export type FindNetworkClientIdByChainId = (chainId: Hex) => NetworkClientId; -export type FindNetworkConfigurationBy = ( - rpcInfo: Record, -) => ProviderConfig | null; -export type HasPermission = (origin: OriginString) => boolean; -export type GetAccounts = () => Promise; -export type GetCurrentChainId = () => Hex; -export type GetCurrentRpcUrl = () => string | undefined; -export type GetNetworkConfigurations = () => NetworkConfiguration; -export type GetPermissionsForOrigin< - ControllerCaveatSpecification extends CaveatSpecificationConstraint = CaveatSpecificationConstraint, -> = ( - origin: OriginString, -) => - | SubjectPermissions< - ValidPermission> - > - | undefined; -export type GetProviderConfig = () => ProviderConfig; -export type GetProviderState = ( - origin: OriginString, -) => Promise; -export type GetUnlockPromise = ( - shouldShowUnlockRequest: boolean, -) => Promise; -export type GetWeb3ShimUsageState = (origin: OriginString) => undefined | 1 | 2; -export type HandleWatchAssetRequest = ( - options: Record, -) => Promise; -export type RequestAccountsPermission< - ControllerPermissionSpecification extends PermissionSpecificationConstraint = PermissionSpecificationConstraint, - ControllerCaveatSpecification extends CaveatSpecificationConstraint = CaveatSpecificationConstraint, -> = ( - subject?: PermissionSubjectMetadata, - requestedPermissions?: RequestedPermissions, - options?: { - id?: string; - preserveExistingPermissions?: boolean; - }, -) => Promise< - [ - SubjectPermissions< - ExtractPermission< - ControllerPermissionSpecification, - ControllerCaveatSpecification - > - >, - { - data?: Record; - id: string; - origin: OriginString; - }, - ] ->; -export type RequestUserApproval = ( - options?: AddApprovalOptions, -) => Promise; -export type SendMetrics = ( - payload: MetaMetricsEventPayload, - options?: MetaMetricsPageOptions, -) => void; -export type SetActiveNetwork = ( - networkConfigurationIdOrType: string, -) => Promise; -export type SetNetworkClientIdForDomain = ( - domain: string, - networkClientId: NetworkClientId, -) => void; -export type SetProviderType = (type: InfuraNetworkType) => Promise; -export type SetWeb3ShimUsageRecorded = (origin: OriginString) => void; -export type StartApprovalFlow = ( - options?: StartFlowOptions, -) => ApprovalFlowStartResult; -export type UpsertNetworkConfiguration = ( - networkConfiguration: NetworkConfiguration, - options?: UpsertNetworkConfigurationOptions, -) => Promise; From 7cc6a9db1c2a20e728b243f4c128278adb815b16 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:11:34 -0400 Subject: [PATCH 12/16] updating the types file --- .../handlers/get-provider-state.ts | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts index b5c3daca24ef..2f15d61a45cd 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -1,18 +1,32 @@ import type { JsonRpcEngineNextCallback, JsonRpcEngineEndCallback, -} from '@metamask/json-rpc-engine'; +} from 'json-rpc-engine'; import type { JsonRpcRequest, PendingJsonRpcResponse, JsonRpcParams, } from '@metamask/utils'; +import { OriginString } from '@metamask/permission-controller'; import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; -import { - HandlerWrapper, - GetProviderState, - ProviderStateHandlerResult, -} from './handlers-helper'; +import { HandlerWrapper } from './types'; + +/** + * @property chainId - The current chain ID. + * @property isUnlocked - Whether the extension is unlocked or not. + * @property networkVersion - The current network ID. + * @property accounts - List of permitted accounts for the specified origin. + */ +type ProviderStateHandlerResult = { + chainId: string; + isUnlocked: boolean; + networkVersion: string; + accounts: string[]; +}; + +type GetProviderState = ( + origin: OriginString, +) => Promise; type GetProviderStateConstraint = { From 1f3752c0e08939331f8efbd4a20ff6d8b9ad0f0a Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:24:09 -0400 Subject: [PATCH 13/16] updating request type --- .../handlers/get-provider-state.ts | 17 ++++++++--------- .../lib/rpc-method-middleware/handlers/types.ts | 7 +++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts index 2f15d61a45cd..613a8d20467f 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -2,14 +2,13 @@ import type { JsonRpcEngineNextCallback, JsonRpcEngineEndCallback, } from 'json-rpc-engine'; -import type { - JsonRpcRequest, - PendingJsonRpcResponse, - JsonRpcParams, -} from '@metamask/utils'; +import type { PendingJsonRpcResponse, JsonRpcParams } from '@metamask/utils'; import { OriginString } from '@metamask/permission-controller'; import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; -import { HandlerWrapper } from './types'; +import { + HandlerWrapper, + HandlerRequestType as ProviderStateHandlerRequest, +} from './types'; /** * @property chainId - The current chain ID. @@ -31,7 +30,7 @@ type GetProviderState = ( type GetProviderStateConstraint = { implementation: ( - _req: JsonRpcRequest, + _req: ProviderStateHandlerRequest, res: PendingJsonRpcResponse, _next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, @@ -65,13 +64,13 @@ export default getProviderState; async function getProviderStateHandler< Params extends JsonRpcParams = JsonRpcParams, >( - req: JsonRpcRequest, + req: ProviderStateHandlerRequest, res: PendingJsonRpcResponse, _next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, { getProviderState: _getProviderState }: Record, ): Promise { - const { origin } = req.origin; + const { origin } = req; res.result = { ...(await _getProviderState(origin)), }; diff --git a/app/scripts/lib/rpc-method-middleware/handlers/types.ts b/app/scripts/lib/rpc-method-middleware/handlers/types.ts index 5b7a2a7494d4..46ceef442ec2 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/types.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/types.ts @@ -1,6 +1,13 @@ +import { OriginString } from '@metamask/permission-controller'; +import { JsonRpcParams, JsonRpcRequest } from '@metamask/utils'; import { MessageType } from '../../../../../shared/constants/app'; export type HandlerWrapper = { methodNames: [MessageType] | MessageType[]; hookNames: Record; }; + +export type HandlerRequestType = + Required> & { + origin: OriginString; + }; From ae12cc4411679cb316a344deb92b06d454c9ae0e Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:16:39 -0400 Subject: [PATCH 14/16] updating req.origin --- .../lib/rpc-method-middleware/handlers/get-provider-state.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts index 613a8d20467f..c507a17f8c8b 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -70,9 +70,8 @@ async function getProviderStateHandler< end: JsonRpcEngineEndCallback, { getProviderState: _getProviderState }: Record, ): Promise { - const { origin } = req; res.result = { - ...(await _getProviderState(origin)), + ...(await _getProviderState(req.origin)), }; return end(); } From 57bbf301c2e2a380ee4c50f951ff1ec712956a77 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:36:29 -0400 Subject: [PATCH 15/16] adding unit test --- .../handlers/get-provider-state.test.ts | 56 +++++++++++++++++++ .../handlers/get-provider-state.ts | 4 +- 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts new file mode 100644 index 000000000000..807a3daf939d --- /dev/null +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts @@ -0,0 +1,56 @@ +import { PendingJsonRpcResponse } from '@metamask/utils'; +import { JsonRpcEngineEndCallback } from 'json-rpc-engine'; +import getProviderState, { + GetProviderState, + ProviderStateHandlerResult, +} from './get-provider-state'; +import { HandlerRequestType } from './types'; + +describe('getProviderState', () => { + let mockEnd: JsonRpcEngineEndCallback; + let mockGetProviderState: GetProviderState; + + beforeEach(() => { + mockEnd = jest.fn(); + mockGetProviderState = jest.fn().mockResolvedValue({ + chainId: '0x539', + isUnlocked: true, + networkVersion: '', + accounts: [], + }); + }); + + it('should handle valid input for type ERC721 correctly', async () => { + const req: HandlerRequestType = { + origin: 'testOrigin', + params: [], + id: '22', + jsonrpc: '2.0', + method: 'metamask_getProviderState', + }; + + const res: PendingJsonRpcResponse = { + id: '22', + jsonrpc: '2.0', + result: { + chainId: '0x539', + isUnlocked: true, + networkVersion: '', + accounts: [], + }, + }; + + await getProviderState.implementation(req, res, jest.fn(), mockEnd, { + getProviderState: mockGetProviderState, + }); + + expect(mockGetProviderState).toHaveBeenCalledWith(req.origin); + expect(res.result).toStrictEqual({ + chainId: '0x539', + isUnlocked: true, + networkVersion: '', + accounts: [], + }); + expect(mockEnd).toHaveBeenCalled(); + }); +}); diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts index c507a17f8c8b..0763913c20cb 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -16,14 +16,14 @@ import { * @property networkVersion - The current network ID. * @property accounts - List of permitted accounts for the specified origin. */ -type ProviderStateHandlerResult = { +export type ProviderStateHandlerResult = { chainId: string; isUnlocked: boolean; networkVersion: string; accounts: string[]; }; -type GetProviderState = ( +export type GetProviderState = ( origin: OriginString, ) => Promise; From 268df025c928d620f2f8bacc878ec7dbfe063c56 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:48:39 -0400 Subject: [PATCH 16/16] addressing review comments --- .../handlers/get-provider-state.test.ts | 2 +- .../rpc-method-middleware/handlers/get-provider-state.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts index 807a3daf939d..f3d76a09f5fc 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.test.ts @@ -20,7 +20,7 @@ describe('getProviderState', () => { }); }); - it('should handle valid input for type ERC721 correctly', async () => { + it('should call getProviderState when the handler is invoked', async () => { const req: HandlerRequestType = { origin: 'testOrigin', params: [], diff --git a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts index 0763913c20cb..530b48b25164 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/get-provider-state.ts @@ -2,7 +2,11 @@ import type { JsonRpcEngineNextCallback, JsonRpcEngineEndCallback, } from 'json-rpc-engine'; -import type { PendingJsonRpcResponse, JsonRpcParams } from '@metamask/utils'; +import type { + PendingJsonRpcResponse, + JsonRpcParams, + Hex, +} from '@metamask/utils'; import { OriginString } from '@metamask/permission-controller'; import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; import { @@ -17,7 +21,7 @@ import { * @property accounts - List of permitted accounts for the specified origin. */ export type ProviderStateHandlerResult = { - chainId: string; + chainId: Hex; isUnlocked: boolean; networkVersion: string; accounts: string[];