@metamask-previews/eth-json-rpc-middleware 23.0.0-preview-2aeb1204 → 23.0.0-preview-69f51f81
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 +0 -4
- package/dist/utils/validation.cjs +1 -81
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts +0 -17
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts +0 -17
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs +0 -78
- package/dist/utils/validation.mjs.map +1 -1
- package/dist/wallet.cjs +0 -3
- package/dist/wallet.cjs.map +1 -1
- package/dist/wallet.d.cts.map +1 -1
- package/dist/wallet.d.mts.map +1 -1
- package/dist/wallet.mjs +1 -4
- package/dist/wallet.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,10 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
### Added
|
|
11
|
-
|
|
12
|
-
- Add prototype pollution validation for `signTypedData` methods (V1, V3, V4) to block dangerous properties (`__proto__`, `constructor`, `prototype`, etc.) in message data. ([#7732](https://github.com/MetaMask/core/pull/7732))
|
|
13
|
-
|
|
14
10
|
### Changed
|
|
15
11
|
|
|
16
12
|
- Bump `@metamask/eth-block-tracker` from `^15.0.0` to `^15.0.1` ([#7642](https://github.com/MetaMask/core/pull/7642))
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.resemblesAddress = exports.validateParams = exports.validateAndNormalizeKeyholder = void 0;
|
|
4
4
|
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
5
5
|
const superstruct_1 = require("@metamask/superstruct");
|
|
6
|
-
const normalize_1 = require("./normalize.cjs");
|
|
7
6
|
/**
|
|
8
7
|
* Validates and normalizes a keyholder address for transaction- and
|
|
9
8
|
* signature-related operations.
|
|
@@ -73,83 +72,4 @@ function formatValidationError(error, message) {
|
|
|
73
72
|
.map((failure) => `${failure.path.join(' > ')}${failure.path.length ? ' - ' : ''}${failure.message}`)
|
|
74
73
|
.join('\n')}`;
|
|
75
74
|
}
|
|
76
|
-
exports.DANGEROUS_PROTOTYPE_PROPERTIES = [
|
|
77
|
-
'__proto__',
|
|
78
|
-
'constructor',
|
|
79
|
-
'prototype',
|
|
80
|
-
'__defineGetter__',
|
|
81
|
-
'__defineSetter__',
|
|
82
|
-
'__lookupGetter__',
|
|
83
|
-
'__lookupSetter__',
|
|
84
|
-
];
|
|
85
|
-
/**
|
|
86
|
-
* Checks if a property name is dangerous for prototype pollution.
|
|
87
|
-
*
|
|
88
|
-
* @param key - The property name to check
|
|
89
|
-
* @returns True if the property name is dangerous
|
|
90
|
-
*/
|
|
91
|
-
function isDangerousProperty(key) {
|
|
92
|
-
return exports.DANGEROUS_PROTOTYPE_PROPERTIES.includes(key);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Recursively checks an object for dangerous prototype pollution properties.
|
|
96
|
-
*
|
|
97
|
-
* @param obj - The object to check
|
|
98
|
-
* @throws rpcErrors.invalidInput() if a dangerous property is found
|
|
99
|
-
*/
|
|
100
|
-
function checkObjectForPrototypePollution(obj) {
|
|
101
|
-
if (obj === null || obj === undefined) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (Array.isArray(obj)) {
|
|
105
|
-
for (const item of obj) {
|
|
106
|
-
checkObjectForPrototypePollution(item);
|
|
107
|
-
}
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (typeof obj === 'object') {
|
|
111
|
-
for (const key of Object.getOwnPropertyNames(obj)) {
|
|
112
|
-
if (isDangerousProperty(key)) {
|
|
113
|
-
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
114
|
-
}
|
|
115
|
-
checkObjectForPrototypePollution(obj[key]);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Validates V1 typed data (array format) for prototype pollution attacks.
|
|
121
|
-
* V1 format: [{ type: 'string', name: 'fieldName', value: 'data' }, ...]
|
|
122
|
-
*
|
|
123
|
-
* @param data - The V1 typed data array to validate
|
|
124
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
125
|
-
*/
|
|
126
|
-
function validateTypedDataV1ForPrototypePollution(data) {
|
|
127
|
-
if (!data || !Array.isArray(data)) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
for (const item of data) {
|
|
131
|
-
if (item && typeof item === 'object') {
|
|
132
|
-
// Only check the 'value' field (the message data) for dangerous properties
|
|
133
|
-
if (item.value !== null && typeof item.value === 'object') {
|
|
134
|
-
checkObjectForPrototypePollution(item.value);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
exports.validateTypedDataV1ForPrototypePollution = validateTypedDataV1ForPrototypePollution;
|
|
140
|
-
/**
|
|
141
|
-
* Validates V3/V4 typed data (EIP-712 format) for prototype pollution attacks.
|
|
142
|
-
* Only checks the message field for dangerous properties.
|
|
143
|
-
*
|
|
144
|
-
* @param data - The stringified typed data to validate
|
|
145
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
146
|
-
*/
|
|
147
|
-
function validateTypedDataForPrototypePollution(data) {
|
|
148
|
-
const { message } = (0, normalize_1.parseTypedMessage)(data);
|
|
149
|
-
// Check message recursively for dangerous properties
|
|
150
|
-
if (message !== undefined) {
|
|
151
|
-
checkObjectForPrototypePollution(message);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
exports.validateTypedDataForPrototypePollution = validateTypedDataForPrototypePollution;
|
|
155
75
|
//# sourceMappingURL=validation.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;;AAAA,qDAAiE;AAEjE,uDAAiD;
|
|
1
|
+
{"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;;AAAA,qDAAiE;AAEjE,uDAAiD;AAKjD;;;;;;;;;;GAUG;AACI,KAAK,UAAU,6BAA6B,CACjD,OAAY,EACZ,OAAgC,EAChC,EAAE,WAAW,EAA0D;IAEvE,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,gBAAgB,CAAC,OAAO,CAAC,EACzB,CAAC;QACD,iEAAiE;QACjE,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEhE,MAAM,kBAAkB,GAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7D,QAAQ,CAAC,WAAW,EAAE,CACvB,CAAC;QAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAS,CAAC;QAEvD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,MAAM,2BAAc,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,sBAAS,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,uDAAuD;KACjE,CAAC,CAAC;AACL,CAAC;AA9BD,sEA8BC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,KAA2B,EAC3B,MAA0B;IAE1B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,sBAAS,CAAC,aAAa,CAC3B,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAXD,wCAWC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,0BAA0B;IAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAHD,4CAGC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,KAAkB,EAAE,OAAe;IAChE,OAAO,GAAG,OAAO,OAAO,KAAK;SAC1B,QAAQ,EAAE;SACV,GAAG,CACF,CAAC,OAAO,EAAE,EAAE,CACV,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CACrF;SACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClB,CAAC","sourcesContent":["import { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport type { Struct, StructError } from '@metamask/superstruct';\nimport { validate } from '@metamask/superstruct';\nimport type { Hex } from '@metamask/utils';\n\nimport type { WalletMiddlewareContext } from '../wallet';\n\n/**\n * Validates and normalizes a keyholder address for transaction- and\n * signature-related operations.\n *\n * @param address - The Ethereum address to validate and normalize.\n * @param context - The context of the request.\n * @param options - The options for the validation.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\nexport async function validateAndNormalizeKeyholder(\n address: Hex,\n context: WalletMiddlewareContext,\n { getAccounts }: { getAccounts: (origin: string) => Promise<string[]> },\n): Promise<Hex> {\n if (\n typeof address === 'string' &&\n address.length > 0 &&\n resemblesAddress(address)\n ) {\n // Ensure that an \"unauthorized\" error is thrown if the requester\n // does not have the `eth_accounts` permission.\n const accounts = await getAccounts(context.assertGet('origin'));\n\n const normalizedAccounts: string[] = accounts.map((_address) =>\n _address.toLowerCase(),\n );\n\n const normalizedAddress = address.toLowerCase() as Hex;\n\n if (normalizedAccounts.includes(normalizedAddress)) {\n return normalizedAddress;\n }\n\n throw providerErrors.unauthorized();\n }\n\n throw rpcErrors.invalidParams({\n message: `Invalid parameters: must provide an Ethereum address.`,\n });\n}\n\n/**\n * Validates the parameters of a request against a Superstruct schema.\n * Throws a JSON-RPC error if the parameters are invalid.\n *\n * @param value - The value to validate.\n * @param struct - The Superstruct schema to validate against.\n * @throws An error if the parameters are invalid.\n */\nexport function validateParams<ParamsType>(\n value: unknown | ParamsType,\n struct: Struct<ParamsType>,\n): asserts value is ParamsType {\n const [error] = validate(value, struct);\n\n if (error) {\n throw rpcErrors.invalidParams(\n formatValidationError(error, `Invalid params`),\n );\n }\n}\n\n/**\n * Checks if a string resembles an Ethereum address.\n *\n * @param str - The string to check.\n * @returns True if the string resembles an Ethereum address, false otherwise.\n */\nexport function resemblesAddress(str: string): boolean {\n // hex prefix 2 + 20 bytes\n return str.length === 2 + 20 * 2;\n}\n\n/**\n * Formats a Superstruct validation error into a human-readable string.\n *\n * @param error - The Superstruct validation error.\n * @param message - The base error message to prepend to the formatted details.\n * @returns The formatted error.\n */\nfunction formatValidationError(error: StructError, message: string): string {\n return `${message}\\n\\n${error\n .failures()\n .map(\n (failure) =>\n `${failure.path.join(' > ')}${failure.path.length ? ' - ' : ''}${failure.message}`,\n )\n .join('\\n')}`;\n}\n"]}
|
|
@@ -31,21 +31,4 @@ export declare function validateParams<ParamsType>(value: unknown | ParamsType,
|
|
|
31
31
|
* @returns True if the string resembles an Ethereum address, false otherwise.
|
|
32
32
|
*/
|
|
33
33
|
export declare function resemblesAddress(str: string): boolean;
|
|
34
|
-
export declare const DANGEROUS_PROTOTYPE_PROPERTIES: readonly ["__proto__", "constructor", "prototype", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"];
|
|
35
|
-
/**
|
|
36
|
-
* Validates V1 typed data (array format) for prototype pollution attacks.
|
|
37
|
-
* V1 format: [{ type: 'string', name: 'fieldName', value: 'data' }, ...]
|
|
38
|
-
*
|
|
39
|
-
* @param data - The V1 typed data array to validate
|
|
40
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
41
|
-
*/
|
|
42
|
-
export declare function validateTypedDataV1ForPrototypePollution(data: Record<string, unknown>[]): void;
|
|
43
|
-
/**
|
|
44
|
-
* Validates V3/V4 typed data (EIP-712 format) for prototype pollution attacks.
|
|
45
|
-
* Only checks the message field for dangerous properties.
|
|
46
|
-
*
|
|
47
|
-
* @param data - The stringified typed data to validate
|
|
48
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
49
|
-
*/
|
|
50
|
-
export declare function validateTypedDataForPrototypePollution(data: string): void;
|
|
51
34
|
//# sourceMappingURL=validation.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.cts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAe,8BAA8B;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"validation.d.cts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAe,8BAA8B;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAkB;AAEzD;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,uBAAuB,EAChC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACtE,OAAO,CAAC,GAAG,CAAC,CA0Bd;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EACvC,KAAK,EAAE,OAAO,GAAG,UAAU,EAC3B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GACzB,OAAO,CAAC,KAAK,IAAI,UAAU,CAQ7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|
|
@@ -31,21 +31,4 @@ export declare function validateParams<ParamsType>(value: unknown | ParamsType,
|
|
|
31
31
|
* @returns True if the string resembles an Ethereum address, false otherwise.
|
|
32
32
|
*/
|
|
33
33
|
export declare function resemblesAddress(str: string): boolean;
|
|
34
|
-
export declare const DANGEROUS_PROTOTYPE_PROPERTIES: readonly ["__proto__", "constructor", "prototype", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"];
|
|
35
|
-
/**
|
|
36
|
-
* Validates V1 typed data (array format) for prototype pollution attacks.
|
|
37
|
-
* V1 format: [{ type: 'string', name: 'fieldName', value: 'data' }, ...]
|
|
38
|
-
*
|
|
39
|
-
* @param data - The V1 typed data array to validate
|
|
40
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
41
|
-
*/
|
|
42
|
-
export declare function validateTypedDataV1ForPrototypePollution(data: Record<string, unknown>[]): void;
|
|
43
|
-
/**
|
|
44
|
-
* Validates V3/V4 typed data (EIP-712 format) for prototype pollution attacks.
|
|
45
|
-
* Only checks the message field for dangerous properties.
|
|
46
|
-
*
|
|
47
|
-
* @param data - The stringified typed data to validate
|
|
48
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
49
|
-
*/
|
|
50
|
-
export declare function validateTypedDataForPrototypePollution(data: string): void;
|
|
51
34
|
//# sourceMappingURL=validation.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.mts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAe,8BAA8B;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"validation.d.mts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAe,8BAA8B;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAkB;AAEzD;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,uBAAuB,EAChC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACtE,OAAO,CAAC,GAAG,CAAC,CA0Bd;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EACvC,KAAK,EAAE,OAAO,GAAG,UAAU,EAC3B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GACzB,OAAO,CAAC,KAAK,IAAI,UAAU,CAQ7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { providerErrors, rpcErrors } from "@metamask/rpc-errors";
|
|
2
2
|
import { validate } from "@metamask/superstruct";
|
|
3
|
-
import { parseTypedMessage } from "./normalize.mjs";
|
|
4
3
|
/**
|
|
5
4
|
* Validates and normalizes a keyholder address for transaction- and
|
|
6
5
|
* signature-related operations.
|
|
@@ -67,81 +66,4 @@ function formatValidationError(error, message) {
|
|
|
67
66
|
.map((failure) => `${failure.path.join(' > ')}${failure.path.length ? ' - ' : ''}${failure.message}`)
|
|
68
67
|
.join('\n')}`;
|
|
69
68
|
}
|
|
70
|
-
export const DANGEROUS_PROTOTYPE_PROPERTIES = [
|
|
71
|
-
'__proto__',
|
|
72
|
-
'constructor',
|
|
73
|
-
'prototype',
|
|
74
|
-
'__defineGetter__',
|
|
75
|
-
'__defineSetter__',
|
|
76
|
-
'__lookupGetter__',
|
|
77
|
-
'__lookupSetter__',
|
|
78
|
-
];
|
|
79
|
-
/**
|
|
80
|
-
* Checks if a property name is dangerous for prototype pollution.
|
|
81
|
-
*
|
|
82
|
-
* @param key - The property name to check
|
|
83
|
-
* @returns True if the property name is dangerous
|
|
84
|
-
*/
|
|
85
|
-
function isDangerousProperty(key) {
|
|
86
|
-
return DANGEROUS_PROTOTYPE_PROPERTIES.includes(key);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Recursively checks an object for dangerous prototype pollution properties.
|
|
90
|
-
*
|
|
91
|
-
* @param obj - The object to check
|
|
92
|
-
* @throws rpcErrors.invalidInput() if a dangerous property is found
|
|
93
|
-
*/
|
|
94
|
-
function checkObjectForPrototypePollution(obj) {
|
|
95
|
-
if (obj === null || obj === undefined) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (Array.isArray(obj)) {
|
|
99
|
-
for (const item of obj) {
|
|
100
|
-
checkObjectForPrototypePollution(item);
|
|
101
|
-
}
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (typeof obj === 'object') {
|
|
105
|
-
for (const key of Object.getOwnPropertyNames(obj)) {
|
|
106
|
-
if (isDangerousProperty(key)) {
|
|
107
|
-
throw rpcErrors.invalidInput();
|
|
108
|
-
}
|
|
109
|
-
checkObjectForPrototypePollution(obj[key]);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Validates V1 typed data (array format) for prototype pollution attacks.
|
|
115
|
-
* V1 format: [{ type: 'string', name: 'fieldName', value: 'data' }, ...]
|
|
116
|
-
*
|
|
117
|
-
* @param data - The V1 typed data array to validate
|
|
118
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
119
|
-
*/
|
|
120
|
-
export function validateTypedDataV1ForPrototypePollution(data) {
|
|
121
|
-
if (!data || !Array.isArray(data)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
for (const item of data) {
|
|
125
|
-
if (item && typeof item === 'object') {
|
|
126
|
-
// Only check the 'value' field (the message data) for dangerous properties
|
|
127
|
-
if (item.value !== null && typeof item.value === 'object') {
|
|
128
|
-
checkObjectForPrototypePollution(item.value);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Validates V3/V4 typed data (EIP-712 format) for prototype pollution attacks.
|
|
135
|
-
* Only checks the message field for dangerous properties.
|
|
136
|
-
*
|
|
137
|
-
* @param data - The stringified typed data to validate
|
|
138
|
-
* @throws rpcErrors.invalidInput() if prototype pollution is detected
|
|
139
|
-
*/
|
|
140
|
-
export function validateTypedDataForPrototypePollution(data) {
|
|
141
|
-
const { message } = parseTypedMessage(data);
|
|
142
|
-
// Check message recursively for dangerous properties
|
|
143
|
-
if (message !== undefined) {
|
|
144
|
-
checkObjectForPrototypePollution(message);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
69
|
//# sourceMappingURL=validation.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,6BAA6B;AAEjE,OAAO,EAAE,QAAQ,EAAE,8BAA8B;
|
|
1
|
+
{"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,6BAA6B;AAEjE,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AAKjD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAY,EACZ,OAAgC,EAChC,EAAE,WAAW,EAA0D;IAEvE,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,gBAAgB,CAAC,OAAO,CAAC,EACzB,CAAC;QACD,iEAAiE;QACjE,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEhE,MAAM,kBAAkB,GAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7D,QAAQ,CAAC,WAAW,EAAE,CACvB,CAAC;QAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAS,CAAC;QAEvD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,uDAAuD;KACjE,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,KAA2B,EAC3B,MAA0B;IAE1B,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,SAAS,CAAC,aAAa,CAC3B,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,0BAA0B;IAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,KAAkB,EAAE,OAAe;IAChE,OAAO,GAAG,OAAO,OAAO,KAAK;SAC1B,QAAQ,EAAE;SACV,GAAG,CACF,CAAC,OAAO,EAAE,EAAE,CACV,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CACrF;SACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClB,CAAC","sourcesContent":["import { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport type { Struct, StructError } from '@metamask/superstruct';\nimport { validate } from '@metamask/superstruct';\nimport type { Hex } from '@metamask/utils';\n\nimport type { WalletMiddlewareContext } from '../wallet';\n\n/**\n * Validates and normalizes a keyholder address for transaction- and\n * signature-related operations.\n *\n * @param address - The Ethereum address to validate and normalize.\n * @param context - The context of the request.\n * @param options - The options for the validation.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\nexport async function validateAndNormalizeKeyholder(\n address: Hex,\n context: WalletMiddlewareContext,\n { getAccounts }: { getAccounts: (origin: string) => Promise<string[]> },\n): Promise<Hex> {\n if (\n typeof address === 'string' &&\n address.length > 0 &&\n resemblesAddress(address)\n ) {\n // Ensure that an \"unauthorized\" error is thrown if the requester\n // does not have the `eth_accounts` permission.\n const accounts = await getAccounts(context.assertGet('origin'));\n\n const normalizedAccounts: string[] = accounts.map((_address) =>\n _address.toLowerCase(),\n );\n\n const normalizedAddress = address.toLowerCase() as Hex;\n\n if (normalizedAccounts.includes(normalizedAddress)) {\n return normalizedAddress;\n }\n\n throw providerErrors.unauthorized();\n }\n\n throw rpcErrors.invalidParams({\n message: `Invalid parameters: must provide an Ethereum address.`,\n });\n}\n\n/**\n * Validates the parameters of a request against a Superstruct schema.\n * Throws a JSON-RPC error if the parameters are invalid.\n *\n * @param value - The value to validate.\n * @param struct - The Superstruct schema to validate against.\n * @throws An error if the parameters are invalid.\n */\nexport function validateParams<ParamsType>(\n value: unknown | ParamsType,\n struct: Struct<ParamsType>,\n): asserts value is ParamsType {\n const [error] = validate(value, struct);\n\n if (error) {\n throw rpcErrors.invalidParams(\n formatValidationError(error, `Invalid params`),\n );\n }\n}\n\n/**\n * Checks if a string resembles an Ethereum address.\n *\n * @param str - The string to check.\n * @returns True if the string resembles an Ethereum address, false otherwise.\n */\nexport function resemblesAddress(str: string): boolean {\n // hex prefix 2 + 20 bytes\n return str.length === 2 + 20 * 2;\n}\n\n/**\n * Formats a Superstruct validation error into a human-readable string.\n *\n * @param error - The Superstruct validation error.\n * @param message - The base error message to prepend to the formatted details.\n * @returns The formatted error.\n */\nfunction formatValidationError(error: StructError, message: string): string {\n return `${message}\\n\\n${error\n .failures()\n .map(\n (failure) =>\n `${failure.path.join(' > ')}${failure.path.length ? ' - ' : ''}${failure.message}`,\n )\n .join('\\n')}`;\n}\n"]}
|
package/dist/wallet.cjs
CHANGED
|
@@ -192,7 +192,6 @@ function createWalletMiddleware({ getAccounts, processDecryptMessage, processEnc
|
|
|
192
192
|
const message = params[0];
|
|
193
193
|
const address = await validateAndNormalizeKeyholder(params[1], context);
|
|
194
194
|
const version = 'V1';
|
|
195
|
-
(0, validation_1.validateTypedDataV1ForPrototypePollution)(message);
|
|
196
195
|
// Not using nullish coalescing, since `params` may be `null`.
|
|
197
196
|
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
198
197
|
const extraParams = params[2] || {};
|
|
@@ -227,7 +226,6 @@ function createWalletMiddleware({ getAccounts, processDecryptMessage, processEnc
|
|
|
227
226
|
const message = (0, normalize_1.normalizeTypedMessage)(params[1]);
|
|
228
227
|
validatePrimaryType(message);
|
|
229
228
|
validateVerifyingContract(message);
|
|
230
|
-
(0, validation_1.validateTypedDataForPrototypePollution)(message);
|
|
231
229
|
const version = 'V3';
|
|
232
230
|
const msgParams = {
|
|
233
231
|
data: message,
|
|
@@ -259,7 +257,6 @@ function createWalletMiddleware({ getAccounts, processDecryptMessage, processEnc
|
|
|
259
257
|
const message = (0, normalize_1.normalizeTypedMessage)(params[1]);
|
|
260
258
|
validatePrimaryType(message);
|
|
261
259
|
validateVerifyingContract(message);
|
|
262
|
-
(0, validation_1.validateTypedDataForPrototypePollution)(message);
|
|
263
260
|
const version = 'V4';
|
|
264
261
|
const msgParams = {
|
|
265
262
|
data: message,
|
package/dist/wallet.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sigUtil from '@metamask/eth-sig-util';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n MiddlewareParams,\n} from '@metamask/json-rpc-engine/v2';\nimport { createScaffoldMiddleware } from '@metamask/json-rpc-engine/v2';\nimport type { MessageRequest } from '@metamask/message-manager';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type { JsonRpcRequest, Json, Hex } from '@metamask/utils';\n\nimport { createWalletGetGrantedExecutionPermissionsHandler } from './methods/wallet-get-granted-execution-permissions';\nimport type { ProcessGetGrantedExecutionPermissionsHook } from './methods/wallet-get-granted-execution-permissions';\nimport { createWalletGetSupportedExecutionPermissionsHandler } from './methods/wallet-get-supported-execution-permissions';\nimport type { ProcessGetSupportedExecutionPermissionsHook } from './methods/wallet-get-supported-execution-permissions';\nimport { createWalletRequestExecutionPermissionsHandler } from './methods/wallet-request-execution-permissions';\nimport type { ProcessRequestExecutionPermissionsHook } from './methods/wallet-request-execution-permissions';\nimport { createWalletRevokeExecutionPermissionHandler } from './methods/wallet-revoke-execution-permission';\nimport type { ProcessRevokeExecutionPermissionHook } from './methods/wallet-revoke-execution-permission';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n resemblesAddress,\n validateAndNormalizeKeyholder as validateKeyholder,\n validateTypedDataForPrototypePollution,\n validateTypedDataV1ForPrototypePollution,\n} from './utils/validation';\n\nexport type TransactionParams = {\n from: string;\n};\n\nexport type MessageParams = TransactionParams & {\n data: string;\n signatureMethod?: string;\n};\n\nexport type TypedMessageParams = MessageParams & {\n version: string;\n};\n\nexport type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {\n data: Record<string, unknown>[];\n};\n\nexport type WalletMiddlewareOptions = {\n getAccounts: (origin: string) => Promise<string[]>;\n processDecryptMessage?: (\n msgParams: MessageParams,\n req: MessageRequest,\n ) => Promise<string>;\n processEncryptionPublicKey?: (\n address: string,\n req: MessageRequest,\n ) => Promise<string>;\n processPersonalMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processSignTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTypedMessage?: (\n msgParams: TypedMessageV1Params,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV3?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV4?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n processGetGrantedExecutionPermissions?: ProcessGetGrantedExecutionPermissionsHook;\n processGetSupportedExecutionPermissions?: ProcessGetSupportedExecutionPermissionsHook;\n};\n\nexport type WalletMiddlewareKeyValues = {\n networkClientId: string;\n origin: string;\n securityAlertResponse?: Record<string, Json>;\n traceContext?: unknown;\n};\n\nexport type WalletMiddlewareContext =\n MiddlewareContext<WalletMiddlewareKeyValues>;\n\nexport type WalletMiddlewareParams = MiddlewareParams<\n JsonRpcRequest,\n WalletMiddlewareContext\n>;\n\n/**\n * Creates a JSON-RPC middleware that handles \"wallet\"-related JSON-RPC methods.\n * \"Wallet\" may have had a specific meaning at some point in the distant past,\n * but at this point it's just an arbitrary label.\n *\n * @param options - The options for the middleware.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @param options.processDecryptMessage - The function to process the decrypt message request.\n * @param options.processEncryptionPublicKey - The function to process the encryption public key request.\n * @param options.processPersonalMessage - The function to process the personal message request.\n * @param options.processTransaction - The function to process the transaction request.\n * @param options.processSignTransaction - The function to process the sign transaction request.\n * @param options.processTypedMessage - The function to process the typed message request.\n * @param options.processTypedMessageV3 - The function to process the typed message v3 request.\n * @param options.processTypedMessageV4 - The function to process the typed message v4 request.\n * @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.\n * @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.\n * @param options.processGetGrantedExecutionPermissions - The function to process the get granted execution permissions request.\n * @param options.processGetSupportedExecutionPermissions - The function to process the get supported execution permissions request.\n * @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.\n */\nexport function createWalletMiddleware({\n getAccounts,\n processDecryptMessage,\n processEncryptionPublicKey,\n processPersonalMessage,\n processTransaction,\n processSignTransaction,\n processTypedMessage,\n processTypedMessageV3,\n processTypedMessageV4,\n processRequestExecutionPermissions,\n processRevokeExecutionPermission,\n processGetGrantedExecutionPermissions,\n processGetSupportedExecutionPermissions,\n}: WalletMiddlewareOptions): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n WalletMiddlewareContext\n> {\n if (!getAccounts) {\n throw new Error('opts.getAccounts is required');\n }\n\n return createScaffoldMiddleware<WalletMiddlewareContext>({\n // account lookups\n eth_accounts: lookupAccounts,\n eth_coinbase: lookupDefaultAccount,\n\n // tx signatures\n eth_sendTransaction: sendTransaction,\n eth_signTransaction: signTransaction,\n\n // message signatures\n eth_signTypedData: signTypedData,\n eth_signTypedData_v3: signTypedDataV3,\n eth_signTypedData_v4: signTypedDataV4,\n personal_sign: personalSign,\n eth_getEncryptionPublicKey: encryptionPublicKey,\n eth_decrypt: decryptMessage,\n personal_ecRecover: personalRecover,\n\n // EIP-7715\n wallet_requestExecutionPermissions:\n createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n }),\n wallet_revokeExecutionPermission:\n createWalletRevokeExecutionPermissionHandler({\n processRevokeExecutionPermission,\n }),\n wallet_getGrantedExecutionPermissions:\n createWalletGetGrantedExecutionPermissionsHandler({\n processGetGrantedExecutionPermissions,\n }),\n wallet_getSupportedExecutionPermissions:\n createWalletGetSupportedExecutionPermissionsHandler({\n processGetSupportedExecutionPermissions,\n }),\n });\n\n //\n // account lookups\n //\n\n /**\n * Gets the accounts for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The accounts for the origin.\n */\n async function lookupAccounts({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n return await getAccounts(context.assertGet('origin'));\n }\n\n /**\n * Gets the default account (i.e. first in the list) for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The default account for the origin.\n */\n async function lookupDefaultAccount({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n const accounts = await getAccounts(context.assertGet('origin'));\n return accounts[0] || null;\n }\n\n //\n // transaction signatures\n //\n\n /**\n * Sends a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The transaction hash.\n */\n async function sendTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processTransaction(txParams, request, context);\n }\n\n /**\n * Signs a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed transaction.\n */\n async function signTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processSignTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processSignTransaction(txParams, request, context);\n }\n\n //\n // message signatures\n //\n\n /**\n * Signs a `eth_signTypedData` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedData({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [\n Record<string, unknown>[],\n string,\n Record<string, string>?,\n ];\n const message = params[0];\n const address = await validateAndNormalizeKeyholder(params[1], context);\n const version = 'V1';\n validateTypedDataV1ForPrototypePollution(message);\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: TypedMessageV1Params = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'eth_signTypedData',\n version,\n };\n\n return await processTypedMessage(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v3` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV3({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV3) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n validateTypedDataForPrototypePollution(message);\n const version = 'V3';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v3',\n };\n\n return await processTypedMessageV3(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v4` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV4({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV4) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n validateTypedDataForPrototypePollution(message);\n const version = 'V4';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v4',\n };\n\n return await processTypedMessageV4(msgParams, request, context, version);\n }\n\n /**\n * Signs a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function personalSign({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processPersonalMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string, TransactionParams?];\n\n // process normally\n const firstParam = params[0];\n const secondParam = params[1];\n // non-standard \"extraParams\" to be appended to our \"msgParams\" obj\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n\n // We initially incorrectly ordered these parameters.\n // To gracefully respect users who adopted this API early,\n // we are currently gracefully recovering from the wrong param order\n // when it is clearly identifiable.\n //\n // That means when the first param is definitely an address,\n // and the second param is definitely not, but is hex.\n let address: string, message: string;\n if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {\n address = firstParam;\n message = secondParam;\n } else {\n message = firstParam;\n address = secondParam;\n }\n address = await validateAndNormalizeKeyholder(address, context);\n\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'personal_sign',\n };\n\n return await processPersonalMessage(msgParams, request, context);\n }\n\n /**\n * Recovers the signer address from a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @returns The recovered signer address.\n */\n async function personalRecover({\n request,\n }: WalletMiddlewareParams): Promise<Json> {\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n const message = params[0];\n const signature = params[1];\n const signerAddress = sigUtil.recoverPersonalSignature({\n data: message,\n signature,\n });\n\n return signerAddress;\n }\n\n /**\n * Gets the encryption public key for an address.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The encryption public key.\n */\n async function encryptionPublicKey({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processEncryptionPublicKey) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n\n return await processEncryptionPublicKey(address, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n /**\n * Decrypts a message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The decrypted message.\n */\n async function decryptMessage({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processDecryptMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n const params = request.params as [string, string, Record<string, Json>?];\n\n const ciphertext: string = params[0];\n const address: string = await validateAndNormalizeKeyholder(\n params[1],\n context,\n );\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: ciphertext,\n };\n\n return await processDecryptMessage(msgParams, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n //\n // utility\n //\n\n /**\n * Validates the keyholder address, and returns a normalized (i.e. lowercase)\n * copy of it.\n *\n * @param address - The address to validate and normalize.\n * @param context - The context of the request.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\n async function validateAndNormalizeKeyholder(\n address: string,\n context: WalletMiddlewareContext,\n ): Promise<string> {\n return validateKeyholder(address as Hex, context, { getAccounts });\n }\n}\n\n/**\n * Validates primary of typedSignMessage, to ensure that it's type definition is present in message.\n *\n * @param data - The data passed in typedSign request.\n */\nfunction validatePrimaryType(data: string): void {\n const { primaryType, types } = parseTypedMessage(data);\n if (!types) {\n throw rpcErrors.invalidInput();\n }\n\n // Primary type can be an array.\n const baseType = stripArrayTypeIfPresent(primaryType);\n\n // Return if the base type is not defined in the types\n const baseTypeDefinitions = types[baseType];\n if (!baseTypeDefinitions) {\n throw rpcErrors.invalidInput();\n }\n}\n\n/**\n * Validates verifyingContract of typedSignMessage.\n *\n * @param data - The data passed in typedSign request.\n * This function allows the verifyingContract to be either:\n * - A valid hex address\n * - The string \"cosmos\" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)\n * - An empty string\n */\nfunction validateVerifyingContract(data: string): void {\n const { domain: { verifyingContract } = {} } = parseTypedMessage(data);\n // Explicit check for cosmos here has been added to address this issue\n // https://github.com/MetaMask/eth-json-rpc-middleware/issues/337\n if (\n verifyingContract &&\n (verifyingContract as string) !== 'cosmos' &&\n !isValidHexAddress(verifyingContract)\n ) {\n throw rpcErrors.invalidInput();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAAkD;AAMlD,qDAAwE;AAExE,qDAAiD;AACjD,2CAAoD;AAGpD,qHAAuH;AAEvH,yHAA2H;AAE3H,6GAAgH;AAEhH,yGAA4G;AAE5G,+CAAyD;AACzD,qDAA6E;AAC7E,uDAG4B;AAmF5B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,kCAAkC,EAClC,gCAAgC,EAChC,qCAAqC,EACrC,uCAAuC,GACf;IAKxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAA,6BAAwB,EAA0B;QACvD,kBAAkB;QAClB,YAAY,EAAE,cAAc;QAC5B,YAAY,EAAE,oBAAoB;QAElC,gBAAgB;QAChB,mBAAmB,EAAE,eAAe;QACpC,mBAAmB,EAAE,eAAe;QAEpC,qBAAqB;QACrB,iBAAiB,EAAE,aAAa;QAChC,oBAAoB,EAAE,eAAe;QACrC,oBAAoB,EAAE,eAAe;QACrC,aAAa,EAAE,YAAY;QAC3B,0BAA0B,EAAE,mBAAmB;QAC/C,WAAW,EAAE,cAAc;QAC3B,kBAAkB,EAAE,eAAe;QAEnC,WAAW;QACX,kCAAkC,EAChC,IAAA,qFAA8C,EAAC;YAC7C,kCAAkC;SACnC,CAAC;QACJ,gCAAgC,EAC9B,IAAA,iFAA4C,EAAC;YAC3C,gCAAgC;SACjC,CAAC;QACJ,qCAAqC,EACnC,IAAA,4FAAiD,EAAC;YAChD,qCAAqC;SACtC,CAAC;QACJ,uCAAuC,EACrC,IAAA,gGAAmD,EAAC;YAClD,uCAAuC;SACxC,CAAC;KACL,CAAC,CAAC;IAEH,EAAE;IACF,kBAAkB;IAClB,EAAE;IAEF;;;;;;OAMG;IACH,KAAK,UAAU,cAAc,CAAC,EAC5B,OAAO,GACgB;QACvB,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,oBAAoB,CAAC,EAClC,OAAO,GACgB;QACvB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,EAAE;IACF,yBAAyB;IACzB,EAAE;IAEF;;;;;;;OAOG;IACH,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAkC,CAAC;QAClE,MAAM,QAAQ,GAAsB;YAClC,GAAG,MAAM;YACT,8DAA8D;YAC9D,wEAAwE;YACxE,IAAI,EAAE,MAAM,6BAA6B,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC;SACvE,CAAC;QACF,OAAO,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAkC,CAAC;QAClE,MAAM,QAAQ,GAAsB;YAClC,GAAG,MAAM;YACT,8DAA8D;YAC9D,wEAAwE;YACxE,IAAI,EAAE,MAAM,6BAA6B,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC;SACvE,CAAC;QACF,OAAO,MAAM,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,EAAE;IACF,qBAAqB;IACrB,EAAE;IAEF;;;;;;;OAOG;IACH,KAAK,UAAU,aAAa,CAAC,EAC3B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAItB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,8DAA8D;QAC9D,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,SAAS,GAAyB;YACtC,GAAG,WAAW;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,mBAAmB;YACpC,OAAO;SACR,CAAC;QAEF,OAAO,MAAM,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAA0B,CAAC;QAElD,MAAM,OAAO,GAAG,MAAM,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAA,iCAAqB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,SAAS,GAAuB;YACpC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO;YACP,eAAe,EAAE,sBAAsB;SACxC,CAAC;QAEF,OAAO,MAAM,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAA0B,CAAC;QAElD,MAAM,OAAO,GAAG,MAAM,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAA,iCAAqB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,SAAS,GAAuB;YACpC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO;YACP,eAAe,EAAE,sBAAsB;SACxC,CAAC;QAEF,OAAO,MAAM,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,YAAY,CAAC,EAC1B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAA8C,CAAC;QAEtE,mBAAmB;QACnB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,mEAAmE;QACnE,8DAA8D;QAC9D,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpC,qDAAqD;QACrD,0DAA0D;QAC1D,oEAAoE;QACpE,mCAAmC;QACnC,EAAE;QACF,4DAA4D;QAC5D,sDAAsD;QACtD,IAAI,OAAe,EAAE,OAAe,CAAC;QACrC,IAAI,IAAA,6BAAgB,EAAC,UAAU,CAAC,IAAI,CAAC,IAAA,6BAAgB,EAAC,WAAW,CAAC,EAAE,CAAC;YACnE,OAAO,GAAG,UAAU,CAAC;YACrB,OAAO,GAAG,WAAW,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,UAAU,CAAC;YACrB,OAAO,GAAG,WAAW,CAAC;QACxB,CAAC;QACD,OAAO,GAAG,MAAM,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAkB;YAC/B,GAAG,WAAW;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,eAAe;SACjC,CAAC;QAEF,OAAO,MAAM,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,GACgB;QACvB,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAA0B,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,wBAAwB,CAAC;YACrD,IAAI,EAAE,OAAO;YACb,SAAS;SACV,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,mBAAmB,CAAC,EACjC,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAChC,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAkB,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAExE,OAAO,MAAM,0BAA0B,CAAC,OAAO,EAAE;YAC/C,EAAE,EAAE,OAAO,CAAC,EAAqB;YACjC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;YACnC,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,UAAU,cAAc,CAAC,EAC5B,OAAO,EACP,OAAO,GACgB;QACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,sBAAS,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QACD,IACE,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAC7B,CAAC;YACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAiD,CAAC;QAEzE,MAAM,UAAU,GAAW,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAW,MAAM,6BAA6B,CACzD,MAAM,CAAC,CAAC,CAAC,EACT,OAAO,CACR,CAAC;QACF,8DAA8D;QAC9D,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,SAAS,GAAkB;YAC/B,GAAG,WAAW;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;SACjB,CAAC;QAEF,OAAO,MAAM,qBAAqB,CAAC,SAAS,EAAE;YAC5C,EAAE,EAAE,OAAO,CAAC,EAAqB;YACjC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;YACnC,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,EAAE;IACF,UAAU;IACV,EAAE;IAEF;;;;;;;;OAQG;IACH,KAAK,UAAU,6BAA6B,CAC1C,OAAe,EACf,OAAgC;QAEhC,OAAO,IAAA,0CAAiB,EAAC,OAAc,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AA7dD,wDA6dC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAG,IAAA,gCAAuB,EAAC,WAAW,CAAC,CAAC;IAEtD,sDAAsD;IACtD,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,GAAG,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC;IACvE,sEAAsE;IACtE,iEAAiE;IACjE,IACE,iBAAiB;QAChB,iBAA4B,KAAK,QAAQ;QAC1C,CAAC,IAAA,yBAAiB,EAAC,iBAAiB,CAAC,EACrC,CAAC;QACD,MAAM,sBAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import * as sigUtil from '@metamask/eth-sig-util';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n MiddlewareParams,\n} from '@metamask/json-rpc-engine/v2';\nimport { createScaffoldMiddleware } from '@metamask/json-rpc-engine/v2';\nimport type { MessageRequest } from '@metamask/message-manager';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type { JsonRpcRequest, Json, Hex } from '@metamask/utils';\n\nimport { createWalletGetGrantedExecutionPermissionsHandler } from './methods/wallet-get-granted-execution-permissions';\nimport type { ProcessGetGrantedExecutionPermissionsHook } from './methods/wallet-get-granted-execution-permissions';\nimport { createWalletGetSupportedExecutionPermissionsHandler } from './methods/wallet-get-supported-execution-permissions';\nimport type { ProcessGetSupportedExecutionPermissionsHook } from './methods/wallet-get-supported-execution-permissions';\nimport { createWalletRequestExecutionPermissionsHandler } from './methods/wallet-request-execution-permissions';\nimport type { ProcessRequestExecutionPermissionsHook } from './methods/wallet-request-execution-permissions';\nimport { createWalletRevokeExecutionPermissionHandler } from './methods/wallet-revoke-execution-permission';\nimport type { ProcessRevokeExecutionPermissionHook } from './methods/wallet-revoke-execution-permission';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n resemblesAddress,\n validateAndNormalizeKeyholder as validateKeyholder,\n} from './utils/validation';\n\nexport type TransactionParams = {\n from: string;\n};\n\nexport type MessageParams = TransactionParams & {\n data: string;\n signatureMethod?: string;\n};\n\nexport type TypedMessageParams = MessageParams & {\n version: string;\n};\n\nexport type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {\n data: Record<string, unknown>[];\n};\n\nexport type WalletMiddlewareOptions = {\n getAccounts: (origin: string) => Promise<string[]>;\n processDecryptMessage?: (\n msgParams: MessageParams,\n req: MessageRequest,\n ) => Promise<string>;\n processEncryptionPublicKey?: (\n address: string,\n req: MessageRequest,\n ) => Promise<string>;\n processPersonalMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processSignTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTypedMessage?: (\n msgParams: TypedMessageV1Params,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV3?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV4?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n processGetGrantedExecutionPermissions?: ProcessGetGrantedExecutionPermissionsHook;\n processGetSupportedExecutionPermissions?: ProcessGetSupportedExecutionPermissionsHook;\n};\n\nexport type WalletMiddlewareKeyValues = {\n networkClientId: string;\n origin: string;\n securityAlertResponse?: Record<string, Json>;\n traceContext?: unknown;\n};\n\nexport type WalletMiddlewareContext =\n MiddlewareContext<WalletMiddlewareKeyValues>;\n\nexport type WalletMiddlewareParams = MiddlewareParams<\n JsonRpcRequest,\n WalletMiddlewareContext\n>;\n\n/**\n * Creates a JSON-RPC middleware that handles \"wallet\"-related JSON-RPC methods.\n * \"Wallet\" may have had a specific meaning at some point in the distant past,\n * but at this point it's just an arbitrary label.\n *\n * @param options - The options for the middleware.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @param options.processDecryptMessage - The function to process the decrypt message request.\n * @param options.processEncryptionPublicKey - The function to process the encryption public key request.\n * @param options.processPersonalMessage - The function to process the personal message request.\n * @param options.processTransaction - The function to process the transaction request.\n * @param options.processSignTransaction - The function to process the sign transaction request.\n * @param options.processTypedMessage - The function to process the typed message request.\n * @param options.processTypedMessageV3 - The function to process the typed message v3 request.\n * @param options.processTypedMessageV4 - The function to process the typed message v4 request.\n * @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.\n * @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.\n * @param options.processGetGrantedExecutionPermissions - The function to process the get granted execution permissions request.\n * @param options.processGetSupportedExecutionPermissions - The function to process the get supported execution permissions request.\n * @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.\n */\nexport function createWalletMiddleware({\n getAccounts,\n processDecryptMessage,\n processEncryptionPublicKey,\n processPersonalMessage,\n processTransaction,\n processSignTransaction,\n processTypedMessage,\n processTypedMessageV3,\n processTypedMessageV4,\n processRequestExecutionPermissions,\n processRevokeExecutionPermission,\n processGetGrantedExecutionPermissions,\n processGetSupportedExecutionPermissions,\n}: WalletMiddlewareOptions): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n WalletMiddlewareContext\n> {\n if (!getAccounts) {\n throw new Error('opts.getAccounts is required');\n }\n\n return createScaffoldMiddleware<WalletMiddlewareContext>({\n // account lookups\n eth_accounts: lookupAccounts,\n eth_coinbase: lookupDefaultAccount,\n\n // tx signatures\n eth_sendTransaction: sendTransaction,\n eth_signTransaction: signTransaction,\n\n // message signatures\n eth_signTypedData: signTypedData,\n eth_signTypedData_v3: signTypedDataV3,\n eth_signTypedData_v4: signTypedDataV4,\n personal_sign: personalSign,\n eth_getEncryptionPublicKey: encryptionPublicKey,\n eth_decrypt: decryptMessage,\n personal_ecRecover: personalRecover,\n\n // EIP-7715\n wallet_requestExecutionPermissions:\n createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n }),\n wallet_revokeExecutionPermission:\n createWalletRevokeExecutionPermissionHandler({\n processRevokeExecutionPermission,\n }),\n wallet_getGrantedExecutionPermissions:\n createWalletGetGrantedExecutionPermissionsHandler({\n processGetGrantedExecutionPermissions,\n }),\n wallet_getSupportedExecutionPermissions:\n createWalletGetSupportedExecutionPermissionsHandler({\n processGetSupportedExecutionPermissions,\n }),\n });\n\n //\n // account lookups\n //\n\n /**\n * Gets the accounts for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The accounts for the origin.\n */\n async function lookupAccounts({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n return await getAccounts(context.assertGet('origin'));\n }\n\n /**\n * Gets the default account (i.e. first in the list) for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The default account for the origin.\n */\n async function lookupDefaultAccount({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n const accounts = await getAccounts(context.assertGet('origin'));\n return accounts[0] || null;\n }\n\n //\n // transaction signatures\n //\n\n /**\n * Sends a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The transaction hash.\n */\n async function sendTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processTransaction(txParams, request, context);\n }\n\n /**\n * Signs a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed transaction.\n */\n async function signTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processSignTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processSignTransaction(txParams, request, context);\n }\n\n //\n // message signatures\n //\n\n /**\n * Signs a `eth_signTypedData` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedData({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [\n Record<string, unknown>[],\n string,\n Record<string, string>?,\n ];\n const message = params[0];\n const address = await validateAndNormalizeKeyholder(params[1], context);\n const version = 'V1';\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: TypedMessageV1Params = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'eth_signTypedData',\n version,\n };\n\n return await processTypedMessage(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v3` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV3({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV3) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n const version = 'V3';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v3',\n };\n\n return await processTypedMessageV3(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v4` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV4({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV4) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n const version = 'V4';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v4',\n };\n\n return await processTypedMessageV4(msgParams, request, context, version);\n }\n\n /**\n * Signs a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function personalSign({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processPersonalMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string, TransactionParams?];\n\n // process normally\n const firstParam = params[0];\n const secondParam = params[1];\n // non-standard \"extraParams\" to be appended to our \"msgParams\" obj\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n\n // We initially incorrectly ordered these parameters.\n // To gracefully respect users who adopted this API early,\n // we are currently gracefully recovering from the wrong param order\n // when it is clearly identifiable.\n //\n // That means when the first param is definitely an address,\n // and the second param is definitely not, but is hex.\n let address: string, message: string;\n if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {\n address = firstParam;\n message = secondParam;\n } else {\n message = firstParam;\n address = secondParam;\n }\n address = await validateAndNormalizeKeyholder(address, context);\n\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'personal_sign',\n };\n\n return await processPersonalMessage(msgParams, request, context);\n }\n\n /**\n * Recovers the signer address from a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @returns The recovered signer address.\n */\n async function personalRecover({\n request,\n }: WalletMiddlewareParams): Promise<Json> {\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n const message = params[0];\n const signature = params[1];\n const signerAddress = sigUtil.recoverPersonalSignature({\n data: message,\n signature,\n });\n\n return signerAddress;\n }\n\n /**\n * Gets the encryption public key for an address.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The encryption public key.\n */\n async function encryptionPublicKey({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processEncryptionPublicKey) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n\n return await processEncryptionPublicKey(address, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n /**\n * Decrypts a message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The decrypted message.\n */\n async function decryptMessage({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processDecryptMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n const params = request.params as [string, string, Record<string, Json>?];\n\n const ciphertext: string = params[0];\n const address: string = await validateAndNormalizeKeyholder(\n params[1],\n context,\n );\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: ciphertext,\n };\n\n return await processDecryptMessage(msgParams, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n //\n // utility\n //\n\n /**\n * Validates the keyholder address, and returns a normalized (i.e. lowercase)\n * copy of it.\n *\n * @param address - The address to validate and normalize.\n * @param context - The context of the request.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\n async function validateAndNormalizeKeyholder(\n address: string,\n context: WalletMiddlewareContext,\n ): Promise<string> {\n return validateKeyholder(address as Hex, context, { getAccounts });\n }\n}\n\n/**\n * Validates primary of typedSignMessage, to ensure that it's type definition is present in message.\n *\n * @param data - The data passed in typedSign request.\n */\nfunction validatePrimaryType(data: string): void {\n const { primaryType, types } = parseTypedMessage(data);\n if (!types) {\n throw rpcErrors.invalidInput();\n }\n\n // Primary type can be an array.\n const baseType = stripArrayTypeIfPresent(primaryType);\n\n // Return if the base type is not defined in the types\n const baseTypeDefinitions = types[baseType];\n if (!baseTypeDefinitions) {\n throw rpcErrors.invalidInput();\n }\n}\n\n/**\n * Validates verifyingContract of typedSignMessage.\n *\n * @param data - The data passed in typedSign request.\n * This function allows the verifyingContract to be either:\n * - A valid hex address\n * - The string \"cosmos\" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)\n * - An empty string\n */\nfunction validateVerifyingContract(data: string): void {\n const { domain: { verifyingContract } = {} } = parseTypedMessage(data);\n // Explicit check for cosmos here has been added to address this issue\n // https://github.com/MetaMask/eth-json-rpc-middleware/issues/337\n if (\n verifyingContract &&\n (verifyingContract as string) !== 'cosmos' &&\n !isValidHexAddress(verifyingContract)\n ) {\n throw rpcErrors.invalidInput();\n }\n}\n"]}
|
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,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,qCAAqC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,kCAAkC;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAO,wBAAwB;AAGjE,OAAO,KAAK,EAAE,yCAAyC,EAAE,+DAA2D;AAEpH,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAA6D;AAExH,OAAO,KAAK,EAAE,sCAAsC,EAAE,2DAAuD;AAE7G,OAAO,KAAK,EAAE,oCAAoC,EAAE,yDAAqD;
|
|
1
|
+
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
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,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,qCAAqC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,kCAAkC;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAO,wBAAwB;AAGjE,OAAO,KAAK,EAAE,yCAAyC,EAAE,+DAA2D;AAEpH,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAA6D;AAExH,OAAO,KAAK,EAAE,sCAAsC,EAAE,2DAAuD;AAE7G,OAAO,KAAK,EAAE,oCAAoC,EAAE,yDAAqD;
|
|
1
|
+
{"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/dist/wallet.mjs
CHANGED
|
@@ -8,7 +8,7 @@ import { createWalletRequestExecutionPermissionsHandler } from "./methods/wallet
|
|
|
8
8
|
import { createWalletRevokeExecutionPermissionHandler } from "./methods/wallet-revoke-execution-permission.mjs";
|
|
9
9
|
import { stripArrayTypeIfPresent } from "./utils/common.mjs";
|
|
10
10
|
import { normalizeTypedMessage, parseTypedMessage } from "./utils/normalize.mjs";
|
|
11
|
-
import { resemblesAddress, validateAndNormalizeKeyholder as validateKeyholder
|
|
11
|
+
import { resemblesAddress, validateAndNormalizeKeyholder as validateKeyholder } from "./utils/validation.mjs";
|
|
12
12
|
/**
|
|
13
13
|
* Creates a JSON-RPC middleware that handles "wallet"-related JSON-RPC methods.
|
|
14
14
|
* "Wallet" may have had a specific meaning at some point in the distant past,
|
|
@@ -166,7 +166,6 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
166
166
|
const message = params[0];
|
|
167
167
|
const address = await validateAndNormalizeKeyholder(params[1], context);
|
|
168
168
|
const version = 'V1';
|
|
169
|
-
validateTypedDataV1ForPrototypePollution(message);
|
|
170
169
|
// Not using nullish coalescing, since `params` may be `null`.
|
|
171
170
|
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
172
171
|
const extraParams = params[2] || {};
|
|
@@ -201,7 +200,6 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
201
200
|
const message = normalizeTypedMessage(params[1]);
|
|
202
201
|
validatePrimaryType(message);
|
|
203
202
|
validateVerifyingContract(message);
|
|
204
|
-
validateTypedDataForPrototypePollution(message);
|
|
205
203
|
const version = 'V3';
|
|
206
204
|
const msgParams = {
|
|
207
205
|
data: message,
|
|
@@ -233,7 +231,6 @@ export function createWalletMiddleware({ getAccounts, processDecryptMessage, pro
|
|
|
233
231
|
const message = normalizeTypedMessage(params[1]);
|
|
234
232
|
validatePrimaryType(message);
|
|
235
233
|
validateVerifyingContract(message);
|
|
236
|
-
validateTypedDataForPrototypePollution(message);
|
|
237
234
|
const version = 'V4';
|
|
238
235
|
const msgParams = {
|
|
239
236
|
data: message,
|
package/dist/wallet.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sigUtil from '@metamask/eth-sig-util';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n MiddlewareParams,\n} from '@metamask/json-rpc-engine/v2';\nimport { createScaffoldMiddleware } from '@metamask/json-rpc-engine/v2';\nimport type { MessageRequest } from '@metamask/message-manager';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type { JsonRpcRequest, Json, Hex } from '@metamask/utils';\n\nimport { createWalletGetGrantedExecutionPermissionsHandler } from './methods/wallet-get-granted-execution-permissions';\nimport type { ProcessGetGrantedExecutionPermissionsHook } from './methods/wallet-get-granted-execution-permissions';\nimport { createWalletGetSupportedExecutionPermissionsHandler } from './methods/wallet-get-supported-execution-permissions';\nimport type { ProcessGetSupportedExecutionPermissionsHook } from './methods/wallet-get-supported-execution-permissions';\nimport { createWalletRequestExecutionPermissionsHandler } from './methods/wallet-request-execution-permissions';\nimport type { ProcessRequestExecutionPermissionsHook } from './methods/wallet-request-execution-permissions';\nimport { createWalletRevokeExecutionPermissionHandler } from './methods/wallet-revoke-execution-permission';\nimport type { ProcessRevokeExecutionPermissionHook } from './methods/wallet-revoke-execution-permission';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n resemblesAddress,\n validateAndNormalizeKeyholder as validateKeyholder,\n validateTypedDataForPrototypePollution,\n validateTypedDataV1ForPrototypePollution,\n} from './utils/validation';\n\nexport type TransactionParams = {\n from: string;\n};\n\nexport type MessageParams = TransactionParams & {\n data: string;\n signatureMethod?: string;\n};\n\nexport type TypedMessageParams = MessageParams & {\n version: string;\n};\n\nexport type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {\n data: Record<string, unknown>[];\n};\n\nexport type WalletMiddlewareOptions = {\n getAccounts: (origin: string) => Promise<string[]>;\n processDecryptMessage?: (\n msgParams: MessageParams,\n req: MessageRequest,\n ) => Promise<string>;\n processEncryptionPublicKey?: (\n address: string,\n req: MessageRequest,\n ) => Promise<string>;\n processPersonalMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processSignTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTypedMessage?: (\n msgParams: TypedMessageV1Params,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV3?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV4?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n processGetGrantedExecutionPermissions?: ProcessGetGrantedExecutionPermissionsHook;\n processGetSupportedExecutionPermissions?: ProcessGetSupportedExecutionPermissionsHook;\n};\n\nexport type WalletMiddlewareKeyValues = {\n networkClientId: string;\n origin: string;\n securityAlertResponse?: Record<string, Json>;\n traceContext?: unknown;\n};\n\nexport type WalletMiddlewareContext =\n MiddlewareContext<WalletMiddlewareKeyValues>;\n\nexport type WalletMiddlewareParams = MiddlewareParams<\n JsonRpcRequest,\n WalletMiddlewareContext\n>;\n\n/**\n * Creates a JSON-RPC middleware that handles \"wallet\"-related JSON-RPC methods.\n * \"Wallet\" may have had a specific meaning at some point in the distant past,\n * but at this point it's just an arbitrary label.\n *\n * @param options - The options for the middleware.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @param options.processDecryptMessage - The function to process the decrypt message request.\n * @param options.processEncryptionPublicKey - The function to process the encryption public key request.\n * @param options.processPersonalMessage - The function to process the personal message request.\n * @param options.processTransaction - The function to process the transaction request.\n * @param options.processSignTransaction - The function to process the sign transaction request.\n * @param options.processTypedMessage - The function to process the typed message request.\n * @param options.processTypedMessageV3 - The function to process the typed message v3 request.\n * @param options.processTypedMessageV4 - The function to process the typed message v4 request.\n * @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.\n * @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.\n * @param options.processGetGrantedExecutionPermissions - The function to process the get granted execution permissions request.\n * @param options.processGetSupportedExecutionPermissions - The function to process the get supported execution permissions request.\n * @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.\n */\nexport function createWalletMiddleware({\n getAccounts,\n processDecryptMessage,\n processEncryptionPublicKey,\n processPersonalMessage,\n processTransaction,\n processSignTransaction,\n processTypedMessage,\n processTypedMessageV3,\n processTypedMessageV4,\n processRequestExecutionPermissions,\n processRevokeExecutionPermission,\n processGetGrantedExecutionPermissions,\n processGetSupportedExecutionPermissions,\n}: WalletMiddlewareOptions): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n WalletMiddlewareContext\n> {\n if (!getAccounts) {\n throw new Error('opts.getAccounts is required');\n }\n\n return createScaffoldMiddleware<WalletMiddlewareContext>({\n // account lookups\n eth_accounts: lookupAccounts,\n eth_coinbase: lookupDefaultAccount,\n\n // tx signatures\n eth_sendTransaction: sendTransaction,\n eth_signTransaction: signTransaction,\n\n // message signatures\n eth_signTypedData: signTypedData,\n eth_signTypedData_v3: signTypedDataV3,\n eth_signTypedData_v4: signTypedDataV4,\n personal_sign: personalSign,\n eth_getEncryptionPublicKey: encryptionPublicKey,\n eth_decrypt: decryptMessage,\n personal_ecRecover: personalRecover,\n\n // EIP-7715\n wallet_requestExecutionPermissions:\n createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n }),\n wallet_revokeExecutionPermission:\n createWalletRevokeExecutionPermissionHandler({\n processRevokeExecutionPermission,\n }),\n wallet_getGrantedExecutionPermissions:\n createWalletGetGrantedExecutionPermissionsHandler({\n processGetGrantedExecutionPermissions,\n }),\n wallet_getSupportedExecutionPermissions:\n createWalletGetSupportedExecutionPermissionsHandler({\n processGetSupportedExecutionPermissions,\n }),\n });\n\n //\n // account lookups\n //\n\n /**\n * Gets the accounts for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The accounts for the origin.\n */\n async function lookupAccounts({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n return await getAccounts(context.assertGet('origin'));\n }\n\n /**\n * Gets the default account (i.e. first in the list) for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The default account for the origin.\n */\n async function lookupDefaultAccount({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n const accounts = await getAccounts(context.assertGet('origin'));\n return accounts[0] || null;\n }\n\n //\n // transaction signatures\n //\n\n /**\n * Sends a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The transaction hash.\n */\n async function sendTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processTransaction(txParams, request, context);\n }\n\n /**\n * Signs a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed transaction.\n */\n async function signTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processSignTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processSignTransaction(txParams, request, context);\n }\n\n //\n // message signatures\n //\n\n /**\n * Signs a `eth_signTypedData` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedData({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [\n Record<string, unknown>[],\n string,\n Record<string, string>?,\n ];\n const message = params[0];\n const address = await validateAndNormalizeKeyholder(params[1], context);\n const version = 'V1';\n validateTypedDataV1ForPrototypePollution(message);\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: TypedMessageV1Params = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'eth_signTypedData',\n version,\n };\n\n return await processTypedMessage(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v3` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV3({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV3) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n validateTypedDataForPrototypePollution(message);\n const version = 'V3';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v3',\n };\n\n return await processTypedMessageV3(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v4` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV4({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV4) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n validateTypedDataForPrototypePollution(message);\n const version = 'V4';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v4',\n };\n\n return await processTypedMessageV4(msgParams, request, context, version);\n }\n\n /**\n * Signs a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function personalSign({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processPersonalMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string, TransactionParams?];\n\n // process normally\n const firstParam = params[0];\n const secondParam = params[1];\n // non-standard \"extraParams\" to be appended to our \"msgParams\" obj\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n\n // We initially incorrectly ordered these parameters.\n // To gracefully respect users who adopted this API early,\n // we are currently gracefully recovering from the wrong param order\n // when it is clearly identifiable.\n //\n // That means when the first param is definitely an address,\n // and the second param is definitely not, but is hex.\n let address: string, message: string;\n if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {\n address = firstParam;\n message = secondParam;\n } else {\n message = firstParam;\n address = secondParam;\n }\n address = await validateAndNormalizeKeyholder(address, context);\n\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'personal_sign',\n };\n\n return await processPersonalMessage(msgParams, request, context);\n }\n\n /**\n * Recovers the signer address from a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @returns The recovered signer address.\n */\n async function personalRecover({\n request,\n }: WalletMiddlewareParams): Promise<Json> {\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n const message = params[0];\n const signature = params[1];\n const signerAddress = sigUtil.recoverPersonalSignature({\n data: message,\n signature,\n });\n\n return signerAddress;\n }\n\n /**\n * Gets the encryption public key for an address.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The encryption public key.\n */\n async function encryptionPublicKey({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processEncryptionPublicKey) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n\n return await processEncryptionPublicKey(address, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n /**\n * Decrypts a message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The decrypted message.\n */\n async function decryptMessage({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processDecryptMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n const params = request.params as [string, string, Record<string, Json>?];\n\n const ciphertext: string = params[0];\n const address: string = await validateAndNormalizeKeyholder(\n params[1],\n context,\n );\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: ciphertext,\n };\n\n return await processDecryptMessage(msgParams, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n //\n // utility\n //\n\n /**\n * Validates the keyholder address, and returns a normalized (i.e. lowercase)\n * copy of it.\n *\n * @param address - The address to validate and normalize.\n * @param context - The context of the request.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\n async function validateAndNormalizeKeyholder(\n address: string,\n context: WalletMiddlewareContext,\n ): Promise<string> {\n return validateKeyholder(address as Hex, context, { getAccounts });\n }\n}\n\n/**\n * Validates primary of typedSignMessage, to ensure that it's type definition is present in message.\n *\n * @param data - The data passed in typedSign request.\n */\nfunction validatePrimaryType(data: string): void {\n const { primaryType, types } = parseTypedMessage(data);\n if (!types) {\n throw rpcErrors.invalidInput();\n }\n\n // Primary type can be an array.\n const baseType = stripArrayTypeIfPresent(primaryType);\n\n // Return if the base type is not defined in the types\n const baseTypeDefinitions = types[baseType];\n if (!baseTypeDefinitions) {\n throw rpcErrors.invalidInput();\n }\n}\n\n/**\n * Validates verifyingContract of typedSignMessage.\n *\n * @param data - The data passed in typedSign request.\n * This function allows the verifyingContract to be either:\n * - A valid hex address\n * - The string \"cosmos\" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)\n * - An empty string\n */\nfunction validateVerifyingContract(data: string): void {\n const { domain: { verifyingContract } = {} } = parseTypedMessage(data);\n // Explicit check for cosmos here has been added to address this issue\n // https://github.com/MetaMask/eth-json-rpc-middleware/issues/337\n if (\n verifyingContract &&\n (verifyingContract as string) !== 'cosmos' &&\n !isValidHexAddress(verifyingContract)\n ) {\n throw rpcErrors.invalidInput();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sigUtil from '@metamask/eth-sig-util';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n MiddlewareParams,\n} from '@metamask/json-rpc-engine/v2';\nimport { createScaffoldMiddleware } from '@metamask/json-rpc-engine/v2';\nimport type { MessageRequest } from '@metamask/message-manager';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type { JsonRpcRequest, Json, Hex } from '@metamask/utils';\n\nimport { createWalletGetGrantedExecutionPermissionsHandler } from './methods/wallet-get-granted-execution-permissions';\nimport type { ProcessGetGrantedExecutionPermissionsHook } from './methods/wallet-get-granted-execution-permissions';\nimport { createWalletGetSupportedExecutionPermissionsHandler } from './methods/wallet-get-supported-execution-permissions';\nimport type { ProcessGetSupportedExecutionPermissionsHook } from './methods/wallet-get-supported-execution-permissions';\nimport { createWalletRequestExecutionPermissionsHandler } from './methods/wallet-request-execution-permissions';\nimport type { ProcessRequestExecutionPermissionsHook } from './methods/wallet-request-execution-permissions';\nimport { createWalletRevokeExecutionPermissionHandler } from './methods/wallet-revoke-execution-permission';\nimport type { ProcessRevokeExecutionPermissionHook } from './methods/wallet-revoke-execution-permission';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n resemblesAddress,\n validateAndNormalizeKeyholder as validateKeyholder,\n} from './utils/validation';\n\nexport type TransactionParams = {\n from: string;\n};\n\nexport type MessageParams = TransactionParams & {\n data: string;\n signatureMethod?: string;\n};\n\nexport type TypedMessageParams = MessageParams & {\n version: string;\n};\n\nexport type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {\n data: Record<string, unknown>[];\n};\n\nexport type WalletMiddlewareOptions = {\n getAccounts: (origin: string) => Promise<string[]>;\n processDecryptMessage?: (\n msgParams: MessageParams,\n req: MessageRequest,\n ) => Promise<string>;\n processEncryptionPublicKey?: (\n address: string,\n req: MessageRequest,\n ) => Promise<string>;\n processPersonalMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processSignTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n ) => Promise<string>;\n processTypedMessage?: (\n msgParams: TypedMessageV1Params,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV3?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processTypedMessageV4?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n context: WalletMiddlewareContext,\n version: string,\n ) => Promise<string>;\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n processGetGrantedExecutionPermissions?: ProcessGetGrantedExecutionPermissionsHook;\n processGetSupportedExecutionPermissions?: ProcessGetSupportedExecutionPermissionsHook;\n};\n\nexport type WalletMiddlewareKeyValues = {\n networkClientId: string;\n origin: string;\n securityAlertResponse?: Record<string, Json>;\n traceContext?: unknown;\n};\n\nexport type WalletMiddlewareContext =\n MiddlewareContext<WalletMiddlewareKeyValues>;\n\nexport type WalletMiddlewareParams = MiddlewareParams<\n JsonRpcRequest,\n WalletMiddlewareContext\n>;\n\n/**\n * Creates a JSON-RPC middleware that handles \"wallet\"-related JSON-RPC methods.\n * \"Wallet\" may have had a specific meaning at some point in the distant past,\n * but at this point it's just an arbitrary label.\n *\n * @param options - The options for the middleware.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @param options.processDecryptMessage - The function to process the decrypt message request.\n * @param options.processEncryptionPublicKey - The function to process the encryption public key request.\n * @param options.processPersonalMessage - The function to process the personal message request.\n * @param options.processTransaction - The function to process the transaction request.\n * @param options.processSignTransaction - The function to process the sign transaction request.\n * @param options.processTypedMessage - The function to process the typed message request.\n * @param options.processTypedMessageV3 - The function to process the typed message v3 request.\n * @param options.processTypedMessageV4 - The function to process the typed message v4 request.\n * @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.\n * @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.\n * @param options.processGetGrantedExecutionPermissions - The function to process the get granted execution permissions request.\n * @param options.processGetSupportedExecutionPermissions - The function to process the get supported execution permissions request.\n * @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.\n */\nexport function createWalletMiddleware({\n getAccounts,\n processDecryptMessage,\n processEncryptionPublicKey,\n processPersonalMessage,\n processTransaction,\n processSignTransaction,\n processTypedMessage,\n processTypedMessageV3,\n processTypedMessageV4,\n processRequestExecutionPermissions,\n processRevokeExecutionPermission,\n processGetGrantedExecutionPermissions,\n processGetSupportedExecutionPermissions,\n}: WalletMiddlewareOptions): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n WalletMiddlewareContext\n> {\n if (!getAccounts) {\n throw new Error('opts.getAccounts is required');\n }\n\n return createScaffoldMiddleware<WalletMiddlewareContext>({\n // account lookups\n eth_accounts: lookupAccounts,\n eth_coinbase: lookupDefaultAccount,\n\n // tx signatures\n eth_sendTransaction: sendTransaction,\n eth_signTransaction: signTransaction,\n\n // message signatures\n eth_signTypedData: signTypedData,\n eth_signTypedData_v3: signTypedDataV3,\n eth_signTypedData_v4: signTypedDataV4,\n personal_sign: personalSign,\n eth_getEncryptionPublicKey: encryptionPublicKey,\n eth_decrypt: decryptMessage,\n personal_ecRecover: personalRecover,\n\n // EIP-7715\n wallet_requestExecutionPermissions:\n createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n }),\n wallet_revokeExecutionPermission:\n createWalletRevokeExecutionPermissionHandler({\n processRevokeExecutionPermission,\n }),\n wallet_getGrantedExecutionPermissions:\n createWalletGetGrantedExecutionPermissionsHandler({\n processGetGrantedExecutionPermissions,\n }),\n wallet_getSupportedExecutionPermissions:\n createWalletGetSupportedExecutionPermissionsHandler({\n processGetSupportedExecutionPermissions,\n }),\n });\n\n //\n // account lookups\n //\n\n /**\n * Gets the accounts for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The accounts for the origin.\n */\n async function lookupAccounts({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n return await getAccounts(context.assertGet('origin'));\n }\n\n /**\n * Gets the default account (i.e. first in the list) for the origin.\n *\n * @param options - Options bag.\n * @param options.context - The context of the request.\n * @returns The default account for the origin.\n */\n async function lookupDefaultAccount({\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n const accounts = await getAccounts(context.assertGet('origin'));\n return accounts[0] || null;\n }\n\n //\n // transaction signatures\n //\n\n /**\n * Sends a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The transaction hash.\n */\n async function sendTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processTransaction(txParams, request, context);\n }\n\n /**\n * Signs a transaction.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed transaction.\n */\n async function signTransaction({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processSignTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n from: await validateAndNormalizeKeyholder(params?.from || '', context),\n };\n return await processSignTransaction(txParams, request, context);\n }\n\n //\n // message signatures\n //\n\n /**\n * Signs a `eth_signTypedData` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedData({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [\n Record<string, unknown>[],\n string,\n Record<string, string>?,\n ];\n const message = params[0];\n const address = await validateAndNormalizeKeyholder(params[1], context);\n const version = 'V1';\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: TypedMessageV1Params = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'eth_signTypedData',\n version,\n };\n\n return await processTypedMessage(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v3` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV3({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV3) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n const version = 'V3';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v3',\n };\n\n return await processTypedMessageV3(msgParams, request, context, version);\n }\n\n /**\n * Signs a `eth_signTypedData_v4` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function signTypedDataV4({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processTypedMessageV4) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n const message = normalizeTypedMessage(params[1]);\n validatePrimaryType(message);\n validateVerifyingContract(message);\n const version = 'V4';\n const msgParams: TypedMessageParams = {\n data: message,\n from: address,\n version,\n signatureMethod: 'eth_signTypedData_v4',\n };\n\n return await processTypedMessageV4(msgParams, request, context, version);\n }\n\n /**\n * Signs a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The signed message.\n */\n async function personalSign({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processPersonalMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string, TransactionParams?];\n\n // process normally\n const firstParam = params[0];\n const secondParam = params[1];\n // non-standard \"extraParams\" to be appended to our \"msgParams\" obj\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n\n // We initially incorrectly ordered these parameters.\n // To gracefully respect users who adopted this API early,\n // we are currently gracefully recovering from the wrong param order\n // when it is clearly identifiable.\n //\n // That means when the first param is definitely an address,\n // and the second param is definitely not, but is hex.\n let address: string, message: string;\n if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {\n address = firstParam;\n message = secondParam;\n } else {\n message = firstParam;\n address = secondParam;\n }\n address = await validateAndNormalizeKeyholder(address, context);\n\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'personal_sign',\n };\n\n return await processPersonalMessage(msgParams, request, context);\n }\n\n /**\n * Recovers the signer address from a `personal_sign` message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @returns The recovered signer address.\n */\n async function personalRecover({\n request,\n }: WalletMiddlewareParams): Promise<Json> {\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string, string];\n const message = params[0];\n const signature = params[1];\n const signerAddress = sigUtil.recoverPersonalSignature({\n data: message,\n signature,\n });\n\n return signerAddress;\n }\n\n /**\n * Gets the encryption public key for an address.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The encryption public key.\n */\n async function encryptionPublicKey({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processEncryptionPublicKey) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = request.params as [string];\n\n const address = await validateAndNormalizeKeyholder(params[0], context);\n\n return await processEncryptionPublicKey(address, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n /**\n * Decrypts a message.\n *\n * @param options - Options bag.\n * @param options.request - The request.\n * @param options.context - The context of the request.\n * @returns The decrypted message.\n */\n async function decryptMessage({\n request,\n context,\n }: WalletMiddlewareParams): Promise<Json> {\n if (!processDecryptMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !request.params ||\n !Array.isArray(request.params) ||\n !(request.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n const params = request.params as [string, string, Record<string, Json>?];\n\n const ciphertext: string = params[0];\n const address: string = await validateAndNormalizeKeyholder(\n params[1],\n context,\n );\n // Not using nullish coalescing, since `params` may be `null`.\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const extraParams = params[2] || {};\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: ciphertext,\n };\n\n return await processDecryptMessage(msgParams, {\n id: request.id as string | number,\n origin: context.assertGet('origin'),\n securityAlertResponse: context.get('securityAlertResponse'),\n });\n }\n\n //\n // utility\n //\n\n /**\n * Validates the keyholder address, and returns a normalized (i.e. lowercase)\n * copy of it.\n *\n * @param address - The address to validate and normalize.\n * @param context - The context of the request.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\n async function validateAndNormalizeKeyholder(\n address: string,\n context: WalletMiddlewareContext,\n ): Promise<string> {\n return validateKeyholder(address as Hex, context, { getAccounts });\n }\n}\n\n/**\n * Validates primary of typedSignMessage, to ensure that it's type definition is present in message.\n *\n * @param data - The data passed in typedSign request.\n */\nfunction validatePrimaryType(data: string): void {\n const { primaryType, types } = parseTypedMessage(data);\n if (!types) {\n throw rpcErrors.invalidInput();\n }\n\n // Primary type can be an array.\n const baseType = stripArrayTypeIfPresent(primaryType);\n\n // Return if the base type is not defined in the types\n const baseTypeDefinitions = types[baseType];\n if (!baseTypeDefinitions) {\n throw rpcErrors.invalidInput();\n }\n}\n\n/**\n * Validates verifyingContract of typedSignMessage.\n *\n * @param data - The data passed in typedSign request.\n * This function allows the verifyingContract to be either:\n * - A valid hex address\n * - The string \"cosmos\" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)\n * - An empty string\n */\nfunction validateVerifyingContract(data: string): void {\n const { domain: { verifyingContract } = {} } = parseTypedMessage(data);\n // Explicit check for cosmos here has been added to address this issue\n // https://github.com/MetaMask/eth-json-rpc-middleware/issues/337\n if (\n verifyingContract &&\n (verifyingContract as string) !== 'cosmos' &&\n !isValidHexAddress(verifyingContract)\n ) {\n throw rpcErrors.invalidInput();\n }\n}\n"]}
|