@metamask-previews/eth-json-rpc-middleware 21.0.0-preview-70abd50a → 21.0.0-preview-536ed51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/dist/block-cache.cjs +41 -32
- package/dist/block-cache.cjs.map +1 -1
- package/dist/block-cache.d.cts +12 -3
- package/dist/block-cache.d.cts.map +1 -1
- package/dist/block-cache.d.mts +12 -3
- package/dist/block-cache.d.mts.map +1 -1
- package/dist/block-cache.mjs +41 -32
- package/dist/block-cache.mjs.map +1 -1
- package/dist/block-ref-rewrite.cjs +12 -8
- package/dist/block-ref-rewrite.cjs.map +1 -1
- package/dist/block-ref-rewrite.d.cts +3 -3
- package/dist/block-ref-rewrite.d.cts.map +1 -1
- package/dist/block-ref-rewrite.d.mts +3 -3
- package/dist/block-ref-rewrite.d.mts.map +1 -1
- package/dist/block-ref-rewrite.mjs +12 -8
- package/dist/block-ref-rewrite.mjs.map +1 -1
- package/dist/block-ref.cjs +17 -10
- package/dist/block-ref.cjs.map +1 -1
- package/dist/block-ref.d.cts +12 -3
- package/dist/block-ref.d.cts.map +1 -1
- package/dist/block-ref.d.mts +12 -3
- package/dist/block-ref.d.mts.map +1 -1
- package/dist/block-ref.mjs +17 -10
- package/dist/block-ref.mjs.map +1 -1
- package/dist/block-tracker-inspector.cjs +28 -25
- package/dist/block-tracker-inspector.cjs.map +1 -1
- package/dist/block-tracker-inspector.d.cts +3 -3
- package/dist/block-tracker-inspector.d.cts.map +1 -1
- package/dist/block-tracker-inspector.d.mts +3 -3
- package/dist/block-tracker-inspector.d.mts.map +1 -1
- package/dist/block-tracker-inspector.mjs +28 -25
- package/dist/block-tracker-inspector.mjs.map +1 -1
- package/dist/fetch.cjs +8 -12
- package/dist/fetch.cjs.map +1 -1
- package/dist/fetch.d.cts +5 -3
- package/dist/fetch.d.cts.map +1 -1
- package/dist/fetch.d.mts +5 -3
- package/dist/fetch.d.mts.map +1 -1
- package/dist/fetch.mjs +8 -12
- package/dist/fetch.mjs.map +1 -1
- package/dist/inflight-cache.cjs +61 -45
- package/dist/inflight-cache.cjs.map +1 -1
- package/dist/inflight-cache.d.cts +12 -3
- package/dist/inflight-cache.d.cts.map +1 -1
- package/dist/inflight-cache.d.mts +12 -3
- package/dist/inflight-cache.d.mts.map +1 -1
- package/dist/inflight-cache.mjs +61 -45
- package/dist/inflight-cache.mjs.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.cjs +20 -9
- package/dist/methods/wallet-request-execution-permissions.cjs.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.d.cts +14 -3
- package/dist/methods/wallet-request-execution-permissions.d.cts.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.d.mts +14 -3
- package/dist/methods/wallet-request-execution-permissions.d.mts.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.mjs +18 -7
- package/dist/methods/wallet-request-execution-permissions.mjs.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.cjs +23 -11
- package/dist/methods/wallet-revoke-execution-permission.cjs.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.d.cts +19 -5
- package/dist/methods/wallet-revoke-execution-permission.d.cts.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.d.mts +19 -5
- package/dist/methods/wallet-revoke-execution-permission.d.mts.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.mjs +20 -8
- package/dist/methods/wallet-revoke-execution-permission.mjs.map +1 -1
- package/dist/providerAsMiddleware.cjs +18 -1
- package/dist/providerAsMiddleware.cjs.map +1 -1
- package/dist/providerAsMiddleware.d.cts +18 -3
- package/dist/providerAsMiddleware.d.cts.map +1 -1
- package/dist/providerAsMiddleware.d.mts +18 -3
- package/dist/providerAsMiddleware.d.mts.map +1 -1
- package/dist/providerAsMiddleware.mjs +16 -0
- package/dist/providerAsMiddleware.mjs.map +1 -1
- package/dist/retryOnEmpty.cjs +8 -11
- package/dist/retryOnEmpty.cjs.map +1 -1
- package/dist/retryOnEmpty.d.cts +3 -3
- package/dist/retryOnEmpty.d.cts.map +1 -1
- package/dist/retryOnEmpty.d.mts +3 -3
- package/dist/retryOnEmpty.d.mts.map +1 -1
- package/dist/retryOnEmpty.mjs +8 -11
- package/dist/retryOnEmpty.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -5
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -5
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/error.cjs +7 -0
- package/dist/utils/error.cjs.map +1 -1
- package/dist/utils/error.d.cts +7 -0
- package/dist/utils/error.d.cts.map +1 -1
- package/dist/utils/error.d.mts +7 -0
- package/dist/utils/error.d.mts.map +1 -1
- package/dist/utils/error.mjs +7 -0
- package/dist/utils/error.mjs.map +1 -1
- package/dist/utils/validation.cjs +34 -2
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts +29 -3
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts +29 -3
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs +34 -2
- package/dist/utils/validation.mjs.map +1 -1
- package/dist/wallet.cjs +199 -92
- package/dist/wallet.cjs.map +1 -1
- package/dist/wallet.d.cts +35 -8
- package/dist/wallet.d.cts.map +1 -1
- package/dist/wallet.d.mts +35 -8
- package/dist/wallet.d.mts.map +1 -1
- package/dist/wallet.mjs +200 -93
- package/dist/wallet.mjs.map +1 -1
- package/package.json +2 -1
package/dist/wallet.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/dist/wallet.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { JsonRpcMiddleware } from "@metamask/json-rpc-engine";
|
|
2
|
-
import type {
|
|
1
|
+
import type { JsonRpcMiddleware, MiddlewareContext, MiddlewareParams } from "@metamask/json-rpc-engine/v2";
|
|
2
|
+
import type { MessageRequest } from "@metamask/message-manager";
|
|
3
|
+
import type { JsonRpcRequest, Json } from "@metamask/utils";
|
|
3
4
|
import { type ProcessRequestExecutionPermissionsHook } from "./methods/wallet-request-execution-permissions.mjs";
|
|
4
5
|
import { type ProcessRevokeExecutionPermissionHook } from "./methods/wallet-revoke-execution-permission.mjs";
|
|
5
|
-
import type { Block } from "./types.mjs";
|
|
6
6
|
export type TransactionParams = {
|
|
7
7
|
from: string;
|
|
8
8
|
};
|
|
@@ -17,11 +17,11 @@ export type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {
|
|
|
17
17
|
data: Record<string, unknown>[];
|
|
18
18
|
};
|
|
19
19
|
export type WalletMiddlewareOptions = {
|
|
20
|
-
getAccounts: (
|
|
21
|
-
processDecryptMessage?: (msgParams: MessageParams, req:
|
|
22
|
-
processEncryptionPublicKey?: (address: string, req:
|
|
20
|
+
getAccounts: (origin: string) => Promise<string[]>;
|
|
21
|
+
processDecryptMessage?: (msgParams: MessageParams, req: MessageRequest) => Promise<string>;
|
|
22
|
+
processEncryptionPublicKey?: (address: string, req: MessageRequest) => Promise<string>;
|
|
23
23
|
processPersonalMessage?: (msgParams: MessageParams, req: JsonRpcRequest) => Promise<string>;
|
|
24
|
-
processTransaction?: (txParams: TransactionParams, req: JsonRpcRequest) => Promise<string>;
|
|
24
|
+
processTransaction?: (txParams: TransactionParams, req: JsonRpcRequest, context: WalletMiddlewareContext) => Promise<string>;
|
|
25
25
|
processSignTransaction?: (txParams: TransactionParams, req: JsonRpcRequest) => Promise<string>;
|
|
26
26
|
processTypedMessage?: (msgParams: TypedMessageV1Params, req: JsonRpcRequest, version: string) => Promise<string>;
|
|
27
27
|
processTypedMessageV3?: (msgParams: TypedMessageParams, req: JsonRpcRequest, version: string) => Promise<string>;
|
|
@@ -29,5 +29,32 @@ export type WalletMiddlewareOptions = {
|
|
|
29
29
|
processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
|
|
30
30
|
processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;
|
|
31
31
|
};
|
|
32
|
-
export
|
|
32
|
+
export type WalletMiddlewareKeyValues = {
|
|
33
|
+
networkClientId: string;
|
|
34
|
+
origin: string;
|
|
35
|
+
securityAlertResponse?: Record<string, Json>;
|
|
36
|
+
traceContext?: unknown;
|
|
37
|
+
};
|
|
38
|
+
export type WalletMiddlewareContext = MiddlewareContext<WalletMiddlewareKeyValues>;
|
|
39
|
+
export type WalletMiddlewareParams = MiddlewareParams<JsonRpcRequest, WalletMiddlewareContext>;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a JSON-RPC middleware that handles "wallet"-related JSON-RPC methods.
|
|
42
|
+
* "Wallet" may have had a specific meaning at some point in the distant past,
|
|
43
|
+
* but at this point it's just an arbitrary label.
|
|
44
|
+
*
|
|
45
|
+
* @param options - The options for the middleware.
|
|
46
|
+
* @param options.getAccounts - The function to get the accounts for the origin.
|
|
47
|
+
* @param options.processDecryptMessage - The function to process the decrypt message request.
|
|
48
|
+
* @param options.processEncryptionPublicKey - The function to process the encryption public key request.
|
|
49
|
+
* @param options.processPersonalMessage - The function to process the personal message request.
|
|
50
|
+
* @param options.processTransaction - The function to process the transaction request.
|
|
51
|
+
* @param options.processSignTransaction - The function to process the sign transaction request.
|
|
52
|
+
* @param options.processTypedMessage - The function to process the typed message request.
|
|
53
|
+
* @param options.processTypedMessageV3 - The function to process the typed message v3 request.
|
|
54
|
+
* @param options.processTypedMessageV4 - The function to process the typed message v4 request.
|
|
55
|
+
* @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.
|
|
56
|
+
* @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.
|
|
57
|
+
* @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createWalletMiddleware({ getAccounts, processDecryptMessage, processEncryptionPublicKey, processPersonalMessage, processTransaction, processSignTransaction, processTypedMessage, processTypedMessageV3, processTypedMessageV4, processRequestExecutionPermissions, processRevokeExecutionPermission, }: WalletMiddlewareOptions): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext>;
|
|
33
60
|
//# sourceMappingURL=wallet.d.mts.map
|
package/dist/wallet.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/dist/wallet.mjs
CHANGED
|
@@ -1,99 +1,156 @@
|
|
|
1
1
|
import * as sigUtil from "@metamask/eth-sig-util";
|
|
2
|
-
import {
|
|
2
|
+
import { createScaffoldMiddleware } from "@metamask/json-rpc-engine/v2";
|
|
3
3
|
import { rpcErrors } from "@metamask/rpc-errors";
|
|
4
4
|
import { isValidHexAddress } from "@metamask/utils";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { createWalletRequestExecutionPermissionsHandler } from "./methods/wallet-request-execution-permissions.mjs";
|
|
6
|
+
import { createWalletRevokeExecutionPermissionHandler } from "./methods/wallet-revoke-execution-permission.mjs";
|
|
7
7
|
import { stripArrayTypeIfPresent } from "./utils/common.mjs";
|
|
8
8
|
import { normalizeTypedMessage, parseTypedMessage } from "./utils/normalize.mjs";
|
|
9
9
|
import { resemblesAddress, validateAndNormalizeKeyholder as validateKeyholder } from "./utils/validation.mjs";
|
|
10
|
+
/**
|
|
11
|
+
* Creates a JSON-RPC middleware that handles "wallet"-related JSON-RPC methods.
|
|
12
|
+
* "Wallet" may have had a specific meaning at some point in the distant past,
|
|
13
|
+
* but at this point it's just an arbitrary label.
|
|
14
|
+
*
|
|
15
|
+
* @param options - The options for the middleware.
|
|
16
|
+
* @param options.getAccounts - The function to get the accounts for the origin.
|
|
17
|
+
* @param options.processDecryptMessage - The function to process the decrypt message request.
|
|
18
|
+
* @param options.processEncryptionPublicKey - The function to process the encryption public key request.
|
|
19
|
+
* @param options.processPersonalMessage - The function to process the personal message request.
|
|
20
|
+
* @param options.processTransaction - The function to process the transaction request.
|
|
21
|
+
* @param options.processSignTransaction - The function to process the sign transaction request.
|
|
22
|
+
* @param options.processTypedMessage - The function to process the typed message request.
|
|
23
|
+
* @param options.processTypedMessageV3 - The function to process the typed message v3 request.
|
|
24
|
+
* @param options.processTypedMessageV4 - The function to process the typed message v4 request.
|
|
25
|
+
* @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.
|
|
26
|
+
* @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.
|
|
27
|
+
* @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.
|
|
28
|
+
*/
|
|
10
29
|
export function createWalletMiddleware({ getAccounts, processDecryptMessage, processEncryptionPublicKey, processPersonalMessage, processTransaction, processSignTransaction, processTypedMessage, processTypedMessageV3, processTypedMessageV4, processRequestExecutionPermissions, processRevokeExecutionPermission, }) {
|
|
11
30
|
if (!getAccounts) {
|
|
12
31
|
throw new Error('opts.getAccounts is required');
|
|
13
32
|
}
|
|
14
33
|
return createScaffoldMiddleware({
|
|
15
34
|
// account lookups
|
|
16
|
-
eth_accounts:
|
|
17
|
-
eth_coinbase:
|
|
35
|
+
eth_accounts: lookupAccounts,
|
|
36
|
+
eth_coinbase: lookupDefaultAccount,
|
|
18
37
|
// tx signatures
|
|
19
|
-
eth_sendTransaction:
|
|
20
|
-
eth_signTransaction:
|
|
38
|
+
eth_sendTransaction: sendTransaction,
|
|
39
|
+
eth_signTransaction: signTransaction,
|
|
21
40
|
// message signatures
|
|
22
|
-
eth_signTypedData:
|
|
23
|
-
eth_signTypedData_v3:
|
|
24
|
-
eth_signTypedData_v4:
|
|
25
|
-
personal_sign:
|
|
26
|
-
eth_getEncryptionPublicKey:
|
|
27
|
-
eth_decrypt:
|
|
28
|
-
personal_ecRecover:
|
|
41
|
+
eth_signTypedData: signTypedData,
|
|
42
|
+
eth_signTypedData_v3: signTypedDataV3,
|
|
43
|
+
eth_signTypedData_v4: signTypedDataV4,
|
|
44
|
+
personal_sign: personalSign,
|
|
45
|
+
eth_getEncryptionPublicKey: encryptionPublicKey,
|
|
46
|
+
eth_decrypt: decryptMessage,
|
|
47
|
+
personal_ecRecover: personalRecover,
|
|
29
48
|
// EIP-7715
|
|
30
|
-
wallet_requestExecutionPermissions:
|
|
49
|
+
wallet_requestExecutionPermissions: createWalletRequestExecutionPermissionsHandler({
|
|
31
50
|
processRequestExecutionPermissions,
|
|
32
|
-
})
|
|
33
|
-
wallet_revokeExecutionPermission:
|
|
51
|
+
}),
|
|
52
|
+
wallet_revokeExecutionPermission: createWalletRevokeExecutionPermissionHandler({
|
|
34
53
|
processRevokeExecutionPermission,
|
|
35
|
-
})
|
|
54
|
+
}),
|
|
36
55
|
});
|
|
37
56
|
//
|
|
38
57
|
// account lookups
|
|
39
58
|
//
|
|
40
|
-
|
|
41
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Gets the accounts for the origin.
|
|
61
|
+
*
|
|
62
|
+
* @param options - Options bag.
|
|
63
|
+
* @param options.context - The context of the request.
|
|
64
|
+
* @returns The accounts for the origin.
|
|
65
|
+
*/
|
|
66
|
+
async function lookupAccounts({ context, }) {
|
|
67
|
+
return await getAccounts(context.assertGet('origin'));
|
|
42
68
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Gets the default account (i.e. first in the list) for the origin.
|
|
71
|
+
*
|
|
72
|
+
* @param options - Options bag.
|
|
73
|
+
* @param options.context - The context of the request.
|
|
74
|
+
* @returns The default account for the origin.
|
|
75
|
+
*/
|
|
76
|
+
async function lookupDefaultAccount({ context, }) {
|
|
77
|
+
const accounts = await getAccounts(context.assertGet('origin'));
|
|
78
|
+
return accounts[0] || null;
|
|
46
79
|
}
|
|
47
80
|
//
|
|
48
81
|
// transaction signatures
|
|
49
82
|
//
|
|
50
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Sends a transaction.
|
|
85
|
+
*
|
|
86
|
+
* @param options - Options bag.
|
|
87
|
+
* @param options.request - The request.
|
|
88
|
+
* @param options.context - The context of the request.
|
|
89
|
+
* @returns The transaction hash.
|
|
90
|
+
*/
|
|
91
|
+
async function sendTransaction({ request, context, }) {
|
|
51
92
|
if (!processTransaction) {
|
|
52
93
|
throw rpcErrors.methodNotSupported();
|
|
53
94
|
}
|
|
54
|
-
if (!
|
|
55
|
-
!Array.isArray(
|
|
56
|
-
!(
|
|
95
|
+
if (!request.params ||
|
|
96
|
+
!Array.isArray(request.params) ||
|
|
97
|
+
!(request.params.length >= 1)) {
|
|
57
98
|
throw rpcErrors.invalidInput();
|
|
58
99
|
}
|
|
59
|
-
const params =
|
|
100
|
+
const params = request.params[0];
|
|
60
101
|
const txParams = {
|
|
61
102
|
...params,
|
|
62
|
-
from: await validateAndNormalizeKeyholder(params?.from || '',
|
|
103
|
+
from: await validateAndNormalizeKeyholder(params?.from || '', context),
|
|
63
104
|
};
|
|
64
|
-
|
|
105
|
+
return await processTransaction(txParams, request, context);
|
|
65
106
|
}
|
|
66
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Signs a transaction.
|
|
109
|
+
*
|
|
110
|
+
* @param options - Options bag.
|
|
111
|
+
* @param options.request - The request.
|
|
112
|
+
* @param options.context - The context of the request.
|
|
113
|
+
* @returns The signed transaction.
|
|
114
|
+
*/
|
|
115
|
+
async function signTransaction({ request, context, }) {
|
|
67
116
|
if (!processSignTransaction) {
|
|
68
117
|
throw rpcErrors.methodNotSupported();
|
|
69
118
|
}
|
|
70
|
-
if (!
|
|
71
|
-
!Array.isArray(
|
|
72
|
-
!(
|
|
119
|
+
if (!request.params ||
|
|
120
|
+
!Array.isArray(request.params) ||
|
|
121
|
+
!(request.params.length >= 1)) {
|
|
73
122
|
throw rpcErrors.invalidInput();
|
|
74
123
|
}
|
|
75
|
-
const params =
|
|
124
|
+
const params = request.params[0];
|
|
76
125
|
const txParams = {
|
|
77
126
|
...params,
|
|
78
|
-
from: await validateAndNormalizeKeyholder(params?.from || '',
|
|
127
|
+
from: await validateAndNormalizeKeyholder(params?.from || '', context),
|
|
79
128
|
};
|
|
80
|
-
|
|
129
|
+
return await processSignTransaction(txParams, request);
|
|
81
130
|
}
|
|
82
131
|
//
|
|
83
132
|
// message signatures
|
|
84
133
|
//
|
|
85
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Signs a `eth_signTypedData` message.
|
|
136
|
+
*
|
|
137
|
+
* @param options - Options bag.
|
|
138
|
+
* @param options.request - The request.
|
|
139
|
+
* @param options.context - The context of the request.
|
|
140
|
+
* @returns The signed message.
|
|
141
|
+
*/
|
|
142
|
+
async function signTypedData({ request, context, }) {
|
|
86
143
|
if (!processTypedMessage) {
|
|
87
144
|
throw rpcErrors.methodNotSupported();
|
|
88
145
|
}
|
|
89
|
-
if (!
|
|
90
|
-
!Array.isArray(
|
|
91
|
-
!(
|
|
146
|
+
if (!request.params ||
|
|
147
|
+
!Array.isArray(request.params) ||
|
|
148
|
+
!(request.params.length >= 2)) {
|
|
92
149
|
throw rpcErrors.invalidInput();
|
|
93
150
|
}
|
|
94
|
-
const params =
|
|
151
|
+
const params = request.params;
|
|
95
152
|
const message = params[0];
|
|
96
|
-
const address = await validateAndNormalizeKeyholder(params[1],
|
|
153
|
+
const address = await validateAndNormalizeKeyholder(params[1], context);
|
|
97
154
|
const version = 'V1';
|
|
98
155
|
const extraParams = params[2] || {};
|
|
99
156
|
const msgParams = {
|
|
@@ -103,19 +160,27 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
103
160
|
signatureMethod: 'eth_signTypedData',
|
|
104
161
|
version,
|
|
105
162
|
};
|
|
106
|
-
|
|
163
|
+
return await processTypedMessage(msgParams, request, version);
|
|
107
164
|
}
|
|
108
|
-
|
|
165
|
+
/**
|
|
166
|
+
* Signs a `eth_signTypedData_v3` message.
|
|
167
|
+
*
|
|
168
|
+
* @param options - Options bag.
|
|
169
|
+
* @param options.request - The request.
|
|
170
|
+
* @param options.context - The context of the request.
|
|
171
|
+
* @returns The signed message.
|
|
172
|
+
*/
|
|
173
|
+
async function signTypedDataV3({ request, context, }) {
|
|
109
174
|
if (!processTypedMessageV3) {
|
|
110
175
|
throw rpcErrors.methodNotSupported();
|
|
111
176
|
}
|
|
112
|
-
if (!
|
|
113
|
-
!Array.isArray(
|
|
114
|
-
!(
|
|
177
|
+
if (!request.params ||
|
|
178
|
+
!Array.isArray(request.params) ||
|
|
179
|
+
!(request.params.length >= 2)) {
|
|
115
180
|
throw rpcErrors.invalidInput();
|
|
116
181
|
}
|
|
117
|
-
const params =
|
|
118
|
-
const address = await validateAndNormalizeKeyholder(params[0],
|
|
182
|
+
const params = request.params;
|
|
183
|
+
const address = await validateAndNormalizeKeyholder(params[0], context);
|
|
119
184
|
const message = normalizeTypedMessage(params[1]);
|
|
120
185
|
validatePrimaryType(message);
|
|
121
186
|
validateVerifyingContract(message);
|
|
@@ -126,19 +191,27 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
126
191
|
version,
|
|
127
192
|
signatureMethod: 'eth_signTypedData_v3',
|
|
128
193
|
};
|
|
129
|
-
|
|
194
|
+
return await processTypedMessageV3(msgParams, request, version);
|
|
130
195
|
}
|
|
131
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Signs a `eth_signTypedData_v4` message.
|
|
198
|
+
*
|
|
199
|
+
* @param options - Options bag.
|
|
200
|
+
* @param options.request - The request.
|
|
201
|
+
* @param options.context - The context of the request.
|
|
202
|
+
* @returns The signed message.
|
|
203
|
+
*/
|
|
204
|
+
async function signTypedDataV4({ request, context, }) {
|
|
132
205
|
if (!processTypedMessageV4) {
|
|
133
206
|
throw rpcErrors.methodNotSupported();
|
|
134
207
|
}
|
|
135
|
-
if (!
|
|
136
|
-
!Array.isArray(
|
|
137
|
-
!(
|
|
208
|
+
if (!request.params ||
|
|
209
|
+
!Array.isArray(request.params) ||
|
|
210
|
+
!(request.params.length >= 2)) {
|
|
138
211
|
throw rpcErrors.invalidInput();
|
|
139
212
|
}
|
|
140
|
-
const params =
|
|
141
|
-
const address = await validateAndNormalizeKeyholder(params[0],
|
|
213
|
+
const params = request.params;
|
|
214
|
+
const address = await validateAndNormalizeKeyholder(params[0], context);
|
|
142
215
|
const message = normalizeTypedMessage(params[1]);
|
|
143
216
|
validatePrimaryType(message);
|
|
144
217
|
validateVerifyingContract(message);
|
|
@@ -149,18 +222,26 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
149
222
|
version,
|
|
150
223
|
signatureMethod: 'eth_signTypedData_v4',
|
|
151
224
|
};
|
|
152
|
-
|
|
225
|
+
return await processTypedMessageV4(msgParams, request, version);
|
|
153
226
|
}
|
|
154
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Signs a `personal_sign` message.
|
|
229
|
+
*
|
|
230
|
+
* @param options - Options bag.
|
|
231
|
+
* @param options.request - The request.
|
|
232
|
+
* @param options.context - The context of the request.
|
|
233
|
+
* @returns The signed message.
|
|
234
|
+
*/
|
|
235
|
+
async function personalSign({ request, context, }) {
|
|
155
236
|
if (!processPersonalMessage) {
|
|
156
237
|
throw rpcErrors.methodNotSupported();
|
|
157
238
|
}
|
|
158
|
-
if (!
|
|
159
|
-
!Array.isArray(
|
|
160
|
-
!(
|
|
239
|
+
if (!request.params ||
|
|
240
|
+
!Array.isArray(request.params) ||
|
|
241
|
+
!(request.params.length >= 2)) {
|
|
161
242
|
throw rpcErrors.invalidInput();
|
|
162
243
|
}
|
|
163
|
-
const params =
|
|
244
|
+
const params = request.params;
|
|
164
245
|
// process normally
|
|
165
246
|
const firstParam = params[0];
|
|
166
247
|
const secondParam = params[1];
|
|
@@ -175,11 +256,6 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
175
256
|
// and the second param is definitely not, but is hex.
|
|
176
257
|
let address, message;
|
|
177
258
|
if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {
|
|
178
|
-
let warning = `The eth_personalSign method requires params ordered `;
|
|
179
|
-
warning += `[message, address]. This was previously handled incorrectly, `;
|
|
180
|
-
warning += `and has been corrected automatically. `;
|
|
181
|
-
warning += `Please switch this param order for smooth behavior in the future.`;
|
|
182
|
-
res.warning = warning;
|
|
183
259
|
address = firstParam;
|
|
184
260
|
message = secondParam;
|
|
185
261
|
}
|
|
@@ -187,62 +263,93 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
187
263
|
message = firstParam;
|
|
188
264
|
address = secondParam;
|
|
189
265
|
}
|
|
190
|
-
address = await validateAndNormalizeKeyholder(address,
|
|
266
|
+
address = await validateAndNormalizeKeyholder(address, context);
|
|
191
267
|
const msgParams = {
|
|
192
268
|
...extraParams,
|
|
193
269
|
from: address,
|
|
194
270
|
data: message,
|
|
195
271
|
signatureMethod: 'personal_sign',
|
|
196
272
|
};
|
|
197
|
-
|
|
273
|
+
return await processPersonalMessage(msgParams, request);
|
|
198
274
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
275
|
+
/**
|
|
276
|
+
* Recovers the signer address from a `personal_sign` message.
|
|
277
|
+
*
|
|
278
|
+
* @param options - Options bag.
|
|
279
|
+
* @param options.request - The request.
|
|
280
|
+
* @returns The recovered signer address.
|
|
281
|
+
*/
|
|
282
|
+
async function personalRecover({ request, }) {
|
|
283
|
+
if (!request.params ||
|
|
284
|
+
!Array.isArray(request.params) ||
|
|
285
|
+
!(request.params.length >= 2)) {
|
|
203
286
|
throw rpcErrors.invalidInput();
|
|
204
287
|
}
|
|
205
|
-
const params =
|
|
288
|
+
const params = request.params;
|
|
206
289
|
const message = params[0];
|
|
207
290
|
const signature = params[1];
|
|
208
291
|
const signerAddress = sigUtil.recoverPersonalSignature({
|
|
209
292
|
data: message,
|
|
210
293
|
signature,
|
|
211
294
|
});
|
|
212
|
-
|
|
295
|
+
return signerAddress;
|
|
213
296
|
}
|
|
214
|
-
|
|
297
|
+
/**
|
|
298
|
+
* Gets the encryption public key for an address.
|
|
299
|
+
*
|
|
300
|
+
* @param options - Options bag.
|
|
301
|
+
* @param options.request - The request.
|
|
302
|
+
* @param options.context - The context of the request.
|
|
303
|
+
* @returns The encryption public key.
|
|
304
|
+
*/
|
|
305
|
+
async function encryptionPublicKey({ request, context, }) {
|
|
215
306
|
if (!processEncryptionPublicKey) {
|
|
216
307
|
throw rpcErrors.methodNotSupported();
|
|
217
308
|
}
|
|
218
|
-
if (!
|
|
219
|
-
!Array.isArray(
|
|
220
|
-
!(
|
|
309
|
+
if (!request.params ||
|
|
310
|
+
!Array.isArray(request.params) ||
|
|
311
|
+
!(request.params.length >= 1)) {
|
|
221
312
|
throw rpcErrors.invalidInput();
|
|
222
313
|
}
|
|
223
|
-
const params =
|
|
224
|
-
const address = await validateAndNormalizeKeyholder(params[0],
|
|
225
|
-
|
|
314
|
+
const params = request.params;
|
|
315
|
+
const address = await validateAndNormalizeKeyholder(params[0], context);
|
|
316
|
+
return await processEncryptionPublicKey(address, {
|
|
317
|
+
id: request.id,
|
|
318
|
+
origin: context.assertGet('origin'),
|
|
319
|
+
securityAlertResponse: context.assertGet('securityAlertResponse'),
|
|
320
|
+
});
|
|
226
321
|
}
|
|
227
|
-
|
|
322
|
+
/**
|
|
323
|
+
* Decrypts a message.
|
|
324
|
+
*
|
|
325
|
+
* @param options - Options bag.
|
|
326
|
+
* @param options.request - The request.
|
|
327
|
+
* @param options.context - The context of the request.
|
|
328
|
+
* @returns The decrypted message.
|
|
329
|
+
*/
|
|
330
|
+
async function decryptMessage({ request, context, }) {
|
|
228
331
|
if (!processDecryptMessage) {
|
|
229
332
|
throw rpcErrors.methodNotSupported();
|
|
230
333
|
}
|
|
231
|
-
if (!
|
|
232
|
-
!Array.isArray(
|
|
233
|
-
!(
|
|
334
|
+
if (!request.params ||
|
|
335
|
+
!Array.isArray(request.params) ||
|
|
336
|
+
!(request.params.length >= 1)) {
|
|
234
337
|
throw rpcErrors.invalidInput();
|
|
235
338
|
}
|
|
236
|
-
const params =
|
|
339
|
+
const params = request.params;
|
|
237
340
|
const ciphertext = params[0];
|
|
238
|
-
const address = await validateAndNormalizeKeyholder(params[1],
|
|
341
|
+
const address = await validateAndNormalizeKeyholder(params[1], context);
|
|
239
342
|
const extraParams = params[2] || {};
|
|
240
343
|
const msgParams = {
|
|
241
344
|
...extraParams,
|
|
242
345
|
from: address,
|
|
243
346
|
data: ciphertext,
|
|
244
347
|
};
|
|
245
|
-
|
|
348
|
+
return await processDecryptMessage(msgParams, {
|
|
349
|
+
id: request.id,
|
|
350
|
+
origin: context.assertGet('origin'),
|
|
351
|
+
securityAlertResponse: context.assertGet('securityAlertResponse'),
|
|
352
|
+
});
|
|
246
353
|
}
|
|
247
354
|
//
|
|
248
355
|
// utility
|
|
@@ -252,12 +359,12 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
252
359
|
* copy of it.
|
|
253
360
|
*
|
|
254
361
|
* @param address - The address to validate and normalize.
|
|
255
|
-
* @param
|
|
362
|
+
* @param context - The context of the request.
|
|
256
363
|
* @returns The normalized address, if valid. Otherwise, throws
|
|
257
364
|
* an error
|
|
258
365
|
*/
|
|
259
|
-
async function validateAndNormalizeKeyholder(address,
|
|
260
|
-
return validateKeyholder(address,
|
|
366
|
+
async function validateAndNormalizeKeyholder(address, context) {
|
|
367
|
+
return validateKeyholder(address, context, { getAccounts });
|
|
261
368
|
}
|
|
262
369
|
}
|
|
263
370
|
/**
|