Skip to content

Commit b3b7bcb

Browse files
committed
refactor: Rewrite wallet
1 parent 2f2b104 commit b3b7bcb

11 files changed

+387
-411
lines changed

eslint-warning-thresholds.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@
154154
"@typescript-eslint/no-explicit-any": 1
155155
},
156156
"packages/eth-json-rpc-middleware/src/block-cache.ts": {
157-
"@typescript-eslint/no-explicit-any": 1,
158157
"jsdoc/require-jsdoc": 1,
159158
"no-restricted-syntax": 1
160159
},
@@ -180,13 +179,13 @@
180179
"jsdoc/match-description": 4
181180
},
182181
"packages/eth-json-rpc-middleware/src/methods/wallet-request-execution-permissions.ts": {
183-
"jsdoc/require-jsdoc": 2
182+
"jsdoc/require-jsdoc": 1
184183
},
185184
"packages/eth-json-rpc-middleware/src/methods/wallet-revoke-execution-permission.ts": {
186185
"jsdoc/require-jsdoc": 1
187186
},
188187
"packages/eth-json-rpc-middleware/src/providerAsMiddleware.ts": {
189-
"jsdoc/require-jsdoc": 1
188+
"jsdoc/require-jsdoc": 2
190189
},
191190
"packages/eth-json-rpc-middleware/src/retryOnEmpty.test.ts": {
192191
"jsdoc/match-description": 3
@@ -213,7 +212,6 @@
213212
"jsdoc/require-jsdoc": 4
214213
},
215214
"packages/eth-json-rpc-middleware/src/wallet.ts": {
216-
"@typescript-eslint/no-explicit-any": 2,
217215
"@typescript-eslint/prefer-nullish-coalescing": 5,
218216
"jsdoc/match-description": 3,
219217
"jsdoc/require-jsdoc": 12
@@ -224,7 +222,7 @@
224222
},
225223
"packages/eth-json-rpc-middleware/test/util/helpers.ts": {
226224
"@typescript-eslint/no-explicit-any": 5,
227-
"jsdoc/match-description": 11
225+
"jsdoc/match-description": 10
228226
},
229227
"packages/eth-json-rpc-provider/src/safe-event-emitter-provider.test.ts": {
230228
"import-x/namespace": 1

packages/eth-json-rpc-middleware/src/block-cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type {
33
JsonRpcMiddleware,
44
MiddlewareContext,
55
} from '@metamask/json-rpc-engine/v2';
6-
import type { Json, JsonRpcParams, JsonRpcRequest } from '@metamask/utils';
6+
import type { Json, JsonRpcRequest } from '@metamask/utils';
77

88
import { projectLogger, createModuleLogger } from './logging-utils';
99
import type {

packages/eth-json-rpc-middleware/src/block-ref.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { MiddlewareContext } from '@metamask/json-rpc-engine/v2';
2+
23
import { createBlockRefMiddleware } from '.';
34
import {
45
createMockParamsWithBlockParamAt,

packages/eth-json-rpc-middleware/src/methods/wallet-request-execution-permissions.test.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';
1+
import type { MiddlewareParams } from '@metamask/json-rpc-engine/v2';
2+
import type { JsonRpcRequest } from '@metamask/utils';
23
import { klona } from 'klona';
34

45
import type {
56
ProcessRequestExecutionPermissionsHook,
67
RequestExecutionPermissionsRequestParams,
78
RequestExecutionPermissionsResult,
89
} from './wallet-request-execution-permissions';
9-
import { walletRequestExecutionPermissions } from './wallet-request-execution-permissions';
10+
import { createWalletRequestExecutionPermissionsHandler } from './wallet-request-execution-permissions';
1011

1112
const ADDRESS_MOCK = '0x123abc123abc123abc123abc123abc123abc123a';
1213
const CHAIN_ID_MOCK = '0x1';
@@ -66,22 +67,21 @@ const RESULT_MOCK: RequestExecutionPermissionsResult = [
6667
describe('wallet_requestExecutionPermissions', () => {
6768
let request: JsonRpcRequest;
6869
let params: RequestExecutionPermissionsRequestParams;
69-
let response: PendingJsonRpcResponse;
7070
let processRequestExecutionPermissionsMock: jest.MockedFunction<ProcessRequestExecutionPermissionsHook>;
7171

7272
const callMethod = async () => {
73-
return walletRequestExecutionPermissions(request, response, {
73+
const handler = createWalletRequestExecutionPermissionsHandler({
7474
processRequestExecutionPermissions:
7575
processRequestExecutionPermissionsMock,
7676
});
77+
return handler({ request } as MiddlewareParams<JsonRpcRequest>);
7778
};
7879

7980
beforeEach(() => {
8081
jest.resetAllMocks();
8182

8283
request = klona(REQUEST_MOCK);
8384
params = request.params as RequestExecutionPermissionsRequestParams;
84-
response = {} as PendingJsonRpcResponse;
8585

8686
processRequestExecutionPermissionsMock = jest.fn();
8787
processRequestExecutionPermissionsMock.mockResolvedValue(RESULT_MOCK);
@@ -96,8 +96,8 @@ describe('wallet_requestExecutionPermissions', () => {
9696
});
9797

9898
it('returns result from hook', async () => {
99-
await callMethod();
100-
expect(response.result).toStrictEqual(RESULT_MOCK);
99+
const result = await callMethod();
100+
expect(result).toStrictEqual(RESULT_MOCK);
101101
});
102102

103103
it('supports null rules', async () => {
@@ -124,7 +124,9 @@ describe('wallet_requestExecutionPermissions', () => {
124124

125125
it('throws if no hook', async () => {
126126
await expect(
127-
walletRequestExecutionPermissions(request, response, {}),
127+
createWalletRequestExecutionPermissionsHandler({})({
128+
request,
129+
} as MiddlewareParams<JsonRpcRequest>),
128130
).rejects.toThrow(
129131
`wallet_requestExecutionPermissions - no middleware configured`,
130132
);

packages/eth-json-rpc-middleware/src/methods/wallet-request-execution-permissions.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine/v2';
12
import { rpcErrors } from '@metamask/rpc-errors';
23
import type { Infer } from '@metamask/superstruct';
34
import {
@@ -16,7 +17,6 @@ import {
1617
type Hex,
1718
type Json,
1819
type JsonRpcRequest,
19-
type PendingJsonRpcResponse,
2020
StrictHexStruct,
2121
} from '@metamask/utils';
2222

@@ -66,24 +66,22 @@ export type ProcessRequestExecutionPermissionsHook = (
6666
req: JsonRpcRequest,
6767
) => Promise<RequestExecutionPermissionsResult>;
6868

69-
export async function walletRequestExecutionPermissions(
70-
req: JsonRpcRequest,
71-
res: PendingJsonRpcResponse,
72-
{
73-
processRequestExecutionPermissions,
74-
}: {
75-
processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
76-
},
77-
): Promise<void> {
78-
if (!processRequestExecutionPermissions) {
79-
throw rpcErrors.methodNotSupported(
80-
'wallet_requestExecutionPermissions - no middleware configured',
81-
);
82-
}
69+
export function createWalletRequestExecutionPermissionsHandler({
70+
processRequestExecutionPermissions,
71+
}: {
72+
processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
73+
}): JsonRpcMiddleware<JsonRpcRequest, Json> {
74+
return async ({ request }) => {
75+
if (!processRequestExecutionPermissions) {
76+
throw rpcErrors.methodNotSupported(
77+
'wallet_requestExecutionPermissions - no middleware configured',
78+
);
79+
}
8380

84-
const { params } = req;
81+
const { params } = request;
8582

86-
validateParams(params, RequestExecutionPermissionsStruct);
83+
validateParams(params, RequestExecutionPermissionsStruct);
8784

88-
res.result = await processRequestExecutionPermissions(params, req);
85+
return await processRequestExecutionPermissions(params, request);
86+
};
8987
}

packages/eth-json-rpc-middleware/src/methods/wallet-revoke-execution-permission.test.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';
1+
import type { MiddlewareParams } from '@metamask/json-rpc-engine/v2';
2+
import type { JsonRpcRequest } from '@metamask/utils';
23
import { klona } from 'klona';
34

45
import type {
56
ProcessRevokeExecutionPermissionHook,
67
RevokeExecutionPermissionRequestParams,
78
} from './wallet-revoke-execution-permission';
8-
import { walletRevokeExecutionPermission } from './wallet-revoke-execution-permission';
9+
import { createWalletRevokeExecutionPermissionHandler } from './wallet-revoke-execution-permission';
910

1011
const HEX_MOCK = '0x123abc';
1112

@@ -18,21 +19,20 @@ const REQUEST_MOCK = {
1819
describe('wallet_revokeExecutionPermission', () => {
1920
let request: JsonRpcRequest<RevokeExecutionPermissionRequestParams>;
2021
let params: RevokeExecutionPermissionRequestParams;
21-
let response: PendingJsonRpcResponse;
2222
let processRevokeExecutionPermissionMock: jest.MockedFunction<ProcessRevokeExecutionPermissionHook>;
2323

2424
const callMethod = async () => {
25-
return walletRevokeExecutionPermission(request, response, {
25+
const handler = createWalletRevokeExecutionPermissionHandler({
2626
processRevokeExecutionPermission: processRevokeExecutionPermissionMock,
2727
});
28+
return handler({ request } as MiddlewareParams<JsonRpcRequest>);
2829
};
2930

3031
beforeEach(() => {
3132
jest.resetAllMocks();
3233

3334
request = klona(REQUEST_MOCK);
3435
params = request.params as RevokeExecutionPermissionRequestParams;
35-
response = {} as PendingJsonRpcResponse;
3636

3737
processRevokeExecutionPermissionMock = jest.fn();
3838
processRevokeExecutionPermissionMock.mockResolvedValue({});
@@ -47,13 +47,15 @@ describe('wallet_revokeExecutionPermission', () => {
4747
});
4848

4949
it('returns result from hook', async () => {
50-
await callMethod();
51-
expect(response.result).toStrictEqual({});
50+
const result = await callMethod();
51+
expect(result).toStrictEqual({});
5252
});
5353

5454
it('throws if no hook', async () => {
5555
await expect(
56-
walletRevokeExecutionPermission(request, response, {}),
56+
createWalletRevokeExecutionPermissionHandler({})({
57+
request,
58+
} as MiddlewareParams<JsonRpcRequest>),
5759
).rejects.toThrow(
5860
'wallet_revokeExecutionPermission - no middleware configured',
5961
);
Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine/v2';
12
import { rpcErrors } from '@metamask/rpc-errors';
23
import type { Infer } from '@metamask/superstruct';
3-
import {
4-
type JsonRpcRequest,
5-
object,
6-
type PendingJsonRpcResponse,
7-
StrictHexStruct,
8-
} from '@metamask/utils';
4+
import { object } from '@metamask/superstruct';
5+
import type { Json } from '@metamask/utils';
6+
import { type JsonRpcRequest, StrictHexStruct } from '@metamask/utils';
97

108
import { validateParams } from '../utils/validation';
119

@@ -28,24 +26,22 @@ export type ProcessRevokeExecutionPermissionHook = (
2826
req: JsonRpcRequest,
2927
) => Promise<RevokeExecutionPermissionResult>;
3028

31-
export async function walletRevokeExecutionPermission(
32-
req: JsonRpcRequest,
33-
res: PendingJsonRpcResponse,
34-
{
35-
processRevokeExecutionPermission,
36-
}: {
37-
processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;
38-
},
39-
): Promise<void> {
40-
if (!processRevokeExecutionPermission) {
41-
throw rpcErrors.methodNotSupported(
42-
'wallet_revokeExecutionPermission - no middleware configured',
43-
);
44-
}
45-
46-
const { params } = req;
47-
48-
validateParams(params, RevokeExecutionPermissionRequestParamsStruct);
49-
50-
res.result = await processRevokeExecutionPermission(params, req);
29+
export function createWalletRevokeExecutionPermissionHandler({
30+
processRevokeExecutionPermission,
31+
}: {
32+
processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;
33+
}): JsonRpcMiddleware<JsonRpcRequest, Json> {
34+
return async ({ request }) => {
35+
if (!processRevokeExecutionPermission) {
36+
throw rpcErrors.methodNotSupported(
37+
'wallet_revokeExecutionPermission - no middleware configured',
38+
);
39+
}
40+
41+
const { params } = request;
42+
43+
validateParams(params, RevokeExecutionPermissionRequestParamsStruct);
44+
45+
return await processRevokeExecutionPermission(params, request);
46+
};
5147
}

packages/eth-json-rpc-middleware/src/providerAsMiddleware.test.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';
22
import { JsonRpcEngine } from '@metamask/json-rpc-engine';
33
import { JsonRpcEngineV2 } from '@metamask/json-rpc-engine/v2';
4-
import { assertIsJsonRpcSuccess, Json } from '@metamask/utils';
4+
import type { Json } from '@metamask/utils';
5+
import { assertIsJsonRpcSuccess } from '@metamask/utils';
56

6-
import { providerAsMiddleware, providerAsMiddlewareV2 } from './providerAsMiddleware';
7+
import {
8+
providerAsMiddleware,
9+
providerAsMiddlewareV2,
10+
} from './providerAsMiddleware';
711
import { createRequest } from '../test/util/helpers';
812

913
const createMockProvider = (result: Json): SafeEventEmitterProvider =>
1014
({
1115
request: jest.fn().mockResolvedValue(result),
12-
} as unknown as SafeEventEmitterProvider);
16+
}) as unknown as SafeEventEmitterProvider;
1317

1418
describe('providerAsMiddleware', () => {
1519
it('forwards requests to the provider and returns the result', async () => {
@@ -29,7 +33,7 @@ describe('providerAsMiddleware', () => {
2933
expect(error).toBeNull();
3034
expect(response).toBeDefined();
3135
assertIsJsonRpcSuccess(response);
32-
expect(response.result).toEqual(mockResult);
36+
expect(response.result).toStrictEqual(mockResult);
3337
expect(mockProvider.request).toHaveBeenCalledWith(request);
3438
resolve();
3539
});
@@ -53,7 +57,7 @@ describe('providerAsMiddlewareV2', () => {
5357

5458
const result = await engine.handle(request);
5559

56-
expect(result).toEqual(mockResult);
60+
expect(result).toStrictEqual(mockResult);
5761
expect(mockProvider.request).toHaveBeenCalledWith(request);
5862
});
5963
});

packages/eth-json-rpc-middleware/src/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
21
import type {
32
Json,
43
JsonRpcParams,

0 commit comments

Comments
 (0)