@metamask-previews/eth-json-rpc-middleware 21.0.0-preview-468843ab
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 +23 -0
- package/LICENSE +15 -0
- package/README.md +23 -0
- package/dist/block-cache.cjs +165 -0
- package/dist/block-cache.cjs.map +1 -0
- package/dist/block-cache.d.cts +9 -0
- package/dist/block-cache.d.cts.map +1 -0
- package/dist/block-cache.d.mts +9 -0
- package/dist/block-cache.d.mts.map +1 -0
- package/dist/block-cache.mjs +161 -0
- package/dist/block-cache.mjs.map +1 -0
- package/dist/block-ref-rewrite.cjs +33 -0
- package/dist/block-ref-rewrite.cjs.map +1 -0
- package/dist/block-ref-rewrite.d.cts +9 -0
- package/dist/block-ref-rewrite.d.cts.map +1 -0
- package/dist/block-ref-rewrite.d.mts +9 -0
- package/dist/block-ref-rewrite.d.mts.map +1 -0
- package/dist/block-ref-rewrite.mjs +29 -0
- package/dist/block-ref-rewrite.mjs.map +1 -0
- package/dist/block-ref.cjs +46 -0
- package/dist/block-ref.cjs.map +1 -0
- package/dist/block-ref.d.cts +11 -0
- package/dist/block-ref.d.cts.map +1 -0
- package/dist/block-ref.d.mts +11 -0
- package/dist/block-ref.d.mts.map +1 -0
- package/dist/block-ref.mjs +42 -0
- package/dist/block-ref.mjs.map +1 -0
- package/dist/block-tracker-inspector.cjs +58 -0
- package/dist/block-tracker-inspector.cjs.map +1 -0
- package/dist/block-tracker-inspector.d.cts +9 -0
- package/dist/block-tracker-inspector.d.cts.map +1 -0
- package/dist/block-tracker-inspector.d.mts +9 -0
- package/dist/block-tracker-inspector.d.mts.map +1 -0
- package/dist/block-tracker-inspector.mjs +54 -0
- package/dist/block-tracker-inspector.mjs.map +1 -0
- package/dist/fetch.cjs +48 -0
- package/dist/fetch.cjs.map +1 -0
- package/dist/fetch.d.cts +22 -0
- package/dist/fetch.d.cts.map +1 -0
- package/dist/fetch.d.mts +22 -0
- package/dist/fetch.d.mts.map +1 -0
- package/dist/fetch.mjs +44 -0
- package/dist/fetch.mjs.map +1 -0
- package/dist/index.cjs +28 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/inflight-cache.cjs +80 -0
- package/dist/inflight-cache.cjs.map +1 -0
- package/dist/inflight-cache.d.cts +4 -0
- package/dist/inflight-cache.d.cts.map +1 -0
- package/dist/inflight-cache.d.mts +4 -0
- package/dist/inflight-cache.d.mts.map +1 -0
- package/dist/inflight-cache.mjs +76 -0
- package/dist/inflight-cache.mjs.map +1 -0
- package/dist/logging-utils.cjs +7 -0
- package/dist/logging-utils.cjs.map +1 -0
- package/dist/logging-utils.d.cts +5 -0
- package/dist/logging-utils.d.cts.map +1 -0
- package/dist/logging-utils.d.mts +5 -0
- package/dist/logging-utils.d.mts.map +1 -0
- package/dist/logging-utils.mjs +4 -0
- package/dist/logging-utils.mjs.map +1 -0
- package/dist/methods/wallet-request-execution-permissions.cjs +41 -0
- package/dist/methods/wallet-request-execution-permissions.cjs.map +1 -0
- package/dist/methods/wallet-request-execution-permissions.d.cts +131 -0
- package/dist/methods/wallet-request-execution-permissions.d.cts.map +1 -0
- package/dist/methods/wallet-request-execution-permissions.d.mts +131 -0
- package/dist/methods/wallet-request-execution-permissions.d.mts.map +1 -0
- package/dist/methods/wallet-request-execution-permissions.mjs +37 -0
- package/dist/methods/wallet-request-execution-permissions.mjs.map +1 -0
- package/dist/methods/wallet-revoke-execution-permission.cjs +20 -0
- package/dist/methods/wallet-revoke-execution-permission.cjs.map +1 -0
- package/dist/methods/wallet-revoke-execution-permission.d.cts +13 -0
- package/dist/methods/wallet-revoke-execution-permission.d.cts.map +1 -0
- package/dist/methods/wallet-revoke-execution-permission.d.mts +13 -0
- package/dist/methods/wallet-revoke-execution-permission.d.mts.map +1 -0
- package/dist/methods/wallet-revoke-execution-permission.mjs +16 -0
- package/dist/methods/wallet-revoke-execution-permission.mjs.map +1 -0
- package/dist/providerAsMiddleware.cjs +11 -0
- package/dist/providerAsMiddleware.cjs.map +1 -0
- package/dist/providerAsMiddleware.d.cts +5 -0
- package/dist/providerAsMiddleware.d.cts.map +1 -0
- package/dist/providerAsMiddleware.d.mts +5 -0
- package/dist/providerAsMiddleware.d.mts.map +1 -0
- package/dist/providerAsMiddleware.mjs +7 -0
- package/dist/providerAsMiddleware.mjs.map +1 -0
- package/dist/retryOnEmpty.cjs +100 -0
- package/dist/retryOnEmpty.cjs.map +1 -0
- package/dist/retryOnEmpty.d.cts +11 -0
- package/dist/retryOnEmpty.d.cts.map +1 -0
- package/dist/retryOnEmpty.d.mts +11 -0
- package/dist/retryOnEmpty.d.mts.map +1 -0
- package/dist/retryOnEmpty.mjs +96 -0
- package/dist/retryOnEmpty.mjs.map +1 -0
- package/dist/types.cjs +3 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +25 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +25 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils/cache.cjs +186 -0
- package/dist/utils/cache.cjs.map +1 -0
- package/dist/utils/cache.d.cts +68 -0
- package/dist/utils/cache.d.cts.map +1 -0
- package/dist/utils/cache.d.mts +68 -0
- package/dist/utils/cache.d.mts.map +1 -0
- package/dist/utils/cache.mjs +178 -0
- package/dist/utils/cache.mjs.map +1 -0
- package/dist/utils/common.cjs +17 -0
- package/dist/utils/common.cjs.map +1 -0
- package/dist/utils/common.d.cts +8 -0
- package/dist/utils/common.d.cts.map +1 -0
- package/dist/utils/common.d.mts +8 -0
- package/dist/utils/common.d.mts.map +1 -0
- package/dist/utils/common.mjs +13 -0
- package/dist/utils/common.mjs.map +1 -0
- package/dist/utils/error.cjs +12 -0
- package/dist/utils/error.cjs.map +1 -0
- package/dist/utils/error.d.cts +3 -0
- package/dist/utils/error.d.cts.map +1 -0
- package/dist/utils/error.d.mts +3 -0
- package/dist/utils/error.d.mts.map +1 -0
- package/dist/utils/error.mjs +8 -0
- package/dist/utils/error.mjs.map +1 -0
- package/dist/utils/normalize.cjs +52 -0
- package/dist/utils/normalize.cjs.map +1 -0
- package/dist/utils/normalize.d.cts +26 -0
- package/dist/utils/normalize.d.cts.map +1 -0
- package/dist/utils/normalize.d.mts +26 -0
- package/dist/utils/normalize.d.mts.map +1 -0
- package/dist/utils/normalize.mjs +47 -0
- package/dist/utils/normalize.mjs.map +1 -0
- package/dist/utils/timeout.cjs +14 -0
- package/dist/utils/timeout.cjs.map +1 -0
- package/dist/utils/timeout.d.cts +8 -0
- package/dist/utils/timeout.d.cts.map +1 -0
- package/dist/utils/timeout.d.mts +8 -0
- package/dist/utils/timeout.d.mts.map +1 -0
- package/dist/utils/timeout.mjs +10 -0
- package/dist/utils/timeout.mjs.map +1 -0
- package/dist/utils/validation.cjs +43 -0
- package/dist/utils/validation.cjs.map +1 -0
- package/dist/utils/validation.d.cts +8 -0
- package/dist/utils/validation.d.cts.map +1 -0
- package/dist/utils/validation.d.mts +8 -0
- package/dist/utils/validation.d.mts.map +1 -0
- package/dist/utils/validation.mjs +37 -0
- package/dist/utils/validation.mjs.map +1 -0
- package/dist/wallet.cjs +327 -0
- package/dist/wallet.cjs.map +1 -0
- package/dist/wallet.d.cts +33 -0
- package/dist/wallet.d.cts.map +1 -0
- package/dist/wallet.d.mts +33 -0
- package/dist/wallet.d.mts.map +1 -0
- package/dist/wallet.mjs +300 -0
- package/dist/wallet.mjs.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.timeout = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Wait the specified number of milliseconds.
|
|
6
|
+
*
|
|
7
|
+
* @param duration - The number of milliseconds to wait.
|
|
8
|
+
* @returns A promise that resolves after the specified amount of time.
|
|
9
|
+
*/
|
|
10
|
+
async function timeout(duration) {
|
|
11
|
+
return new Promise((resolve) => setTimeout(resolve, duration));
|
|
12
|
+
}
|
|
13
|
+
exports.timeout = timeout;
|
|
14
|
+
//# sourceMappingURL=timeout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.cjs","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACI,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAFD,0BAEC","sourcesContent":["/**\n * Wait the specified number of milliseconds.\n *\n * @param duration - The number of milliseconds to wait.\n * @returns A promise that resolves after the specified amount of time.\n */\nexport async function timeout(duration: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, duration));\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait the specified number of milliseconds.
|
|
3
|
+
*
|
|
4
|
+
* @param duration - The number of milliseconds to wait.
|
|
5
|
+
* @returns A promise that resolves after the specified amount of time.
|
|
6
|
+
*/
|
|
7
|
+
export declare function timeout(duration: number): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=timeout.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.cts","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait the specified number of milliseconds.
|
|
3
|
+
*
|
|
4
|
+
* @param duration - The number of milliseconds to wait.
|
|
5
|
+
* @returns A promise that resolves after the specified amount of time.
|
|
6
|
+
*/
|
|
7
|
+
export declare function timeout(duration: number): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=timeout.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.mts","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait the specified number of milliseconds.
|
|
3
|
+
*
|
|
4
|
+
* @param duration - The number of milliseconds to wait.
|
|
5
|
+
* @returns A promise that resolves after the specified amount of time.
|
|
6
|
+
*/
|
|
7
|
+
export async function timeout(duration) {
|
|
8
|
+
return new Promise((resolve) => setTimeout(resolve, duration));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=timeout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.mjs","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC","sourcesContent":["/**\n * Wait the specified number of milliseconds.\n *\n * @param duration - The number of milliseconds to wait.\n * @returns A promise that resolves after the specified amount of time.\n */\nexport async function timeout(duration: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, duration));\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resemblesAddress = exports.validateParams = exports.validateAndNormalizeKeyholder = void 0;
|
|
4
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
5
|
+
const superstruct_1 = require("@metamask/superstruct");
|
|
6
|
+
async function validateAndNormalizeKeyholder(address, req, { getAccounts }) {
|
|
7
|
+
if (typeof address === 'string' &&
|
|
8
|
+
address.length > 0 &&
|
|
9
|
+
resemblesAddress(address)) {
|
|
10
|
+
// Ensure that an "unauthorized" error is thrown if the requester
|
|
11
|
+
// does not have the `eth_accounts` permission.
|
|
12
|
+
const accounts = await getAccounts(req);
|
|
13
|
+
const normalizedAccounts = accounts.map((_address) => _address.toLowerCase());
|
|
14
|
+
const normalizedAddress = address.toLowerCase();
|
|
15
|
+
if (normalizedAccounts.includes(normalizedAddress)) {
|
|
16
|
+
return normalizedAddress;
|
|
17
|
+
}
|
|
18
|
+
throw rpc_errors_1.providerErrors.unauthorized();
|
|
19
|
+
}
|
|
20
|
+
throw rpc_errors_1.rpcErrors.invalidParams({
|
|
21
|
+
message: `Invalid parameters: must provide an Ethereum address.`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
exports.validateAndNormalizeKeyholder = validateAndNormalizeKeyholder;
|
|
25
|
+
function validateParams(value, struct) {
|
|
26
|
+
const [error] = (0, superstruct_1.validate)(value, struct);
|
|
27
|
+
if (error) {
|
|
28
|
+
throw rpc_errors_1.rpcErrors.invalidParams(formatValidationError(error, `Invalid params`));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.validateParams = validateParams;
|
|
32
|
+
function resemblesAddress(str) {
|
|
33
|
+
// hex prefix 2 + 20 bytes
|
|
34
|
+
return str.length === 2 + 20 * 2;
|
|
35
|
+
}
|
|
36
|
+
exports.resemblesAddress = resemblesAddress;
|
|
37
|
+
function formatValidationError(error, message) {
|
|
38
|
+
return `${message}\n\n${error
|
|
39
|
+
.failures()
|
|
40
|
+
.map((f) => `${f.path.join(' > ')}${f.path.length ? ' - ' : ''}${f.message}`)
|
|
41
|
+
.join('\n')}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=validation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;;AAAA,qDAAiE;AAEjE,uDAAiD;AAG1C,KAAK,UAAU,6BAA6B,CACjD,OAAY,EACZ,GAAmB,EACnB,EAAE,WAAW,EAA+D;IAE5E,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,gBAAgB,CAAC,OAAO,CAAC,EACzB;QACA,iEAAiE;QACjE,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAExC,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;YAClD,OAAO,iBAAiB,CAAC;SAC1B;QAED,MAAM,2BAAc,CAAC,YAAY,EAAE,CAAC;KACrC;IAED,MAAM,sBAAS,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,uDAAuD;KACjE,CAAC,CAAC;AACL,CAAC;AA9BD,sEA8BC;AAED,SAAgB,cAAc,CAC5B,KAA2B,EAC3B,MAA0B;IAE1B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,KAAK,EAAE;QACT,MAAM,sBAAS,CAAC,aAAa,CAC3B,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAC/C,CAAC;KACH;AACH,CAAC;AAXD,wCAWC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,0BAA0B;IAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAHD,4CAGC;AAED,SAAS,qBAAqB,CAAC,KAAkB,EAAE,OAAe;IAChE,OAAO,GAAG,OAAO,OAAO,KAAK;SAC1B,QAAQ,EAAE;SACV,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CACxE;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, JsonRpcRequest } from '@metamask/utils';\n\nexport async function validateAndNormalizeKeyholder(\n address: Hex,\n req: JsonRpcRequest,\n { getAccounts }: { getAccounts: (req: JsonRpcRequest) => 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(req);\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\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\nexport function resemblesAddress(str: string): boolean {\n // hex prefix 2 + 20 bytes\n return str.length === 2 + 20 * 2;\n}\n\nfunction formatValidationError(error: StructError, message: string): string {\n return `${message}\\n\\n${error\n .failures()\n .map(\n (f) => `${f.path.join(' > ')}${f.path.length ? ' - ' : ''}${f.message}`,\n )\n .join('\\n')}`;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Struct } from "@metamask/superstruct";
|
|
2
|
+
import type { Hex, JsonRpcRequest } from "@metamask/utils";
|
|
3
|
+
export declare function validateAndNormalizeKeyholder(address: Hex, req: JsonRpcRequest, { getAccounts }: {
|
|
4
|
+
getAccounts: (req: JsonRpcRequest) => Promise<string[]>;
|
|
5
|
+
}): Promise<Hex>;
|
|
6
|
+
export declare function validateParams<ParamsType>(value: unknown | ParamsType, struct: Struct<ParamsType>): asserts value is ParamsType;
|
|
7
|
+
export declare function resemblesAddress(str: string): boolean;
|
|
8
|
+
//# sourceMappingURL=validation.d.cts.map
|
|
@@ -0,0 +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,cAAc,EAAE,wBAAwB;AAE3D,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,cAAc,EACnB,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAC3E,OAAO,CAAC,GAAG,CAAC,CA0Bd;AAED,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,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Struct } from "@metamask/superstruct";
|
|
2
|
+
import type { Hex, JsonRpcRequest } from "@metamask/utils";
|
|
3
|
+
export declare function validateAndNormalizeKeyholder(address: Hex, req: JsonRpcRequest, { getAccounts }: {
|
|
4
|
+
getAccounts: (req: JsonRpcRequest) => Promise<string[]>;
|
|
5
|
+
}): Promise<Hex>;
|
|
6
|
+
export declare function validateParams<ParamsType>(value: unknown | ParamsType, struct: Struct<ParamsType>): asserts value is ParamsType;
|
|
7
|
+
export declare function resemblesAddress(str: string): boolean;
|
|
8
|
+
//# sourceMappingURL=validation.d.mts.map
|
|
@@ -0,0 +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,cAAc,EAAE,wBAAwB;AAE3D,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,cAAc,EACnB,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAC3E,OAAO,CAAC,GAAG,CAAC,CA0Bd;AAED,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,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { providerErrors, rpcErrors } from "@metamask/rpc-errors";
|
|
2
|
+
import { validate } from "@metamask/superstruct";
|
|
3
|
+
export async function validateAndNormalizeKeyholder(address, req, { getAccounts }) {
|
|
4
|
+
if (typeof address === 'string' &&
|
|
5
|
+
address.length > 0 &&
|
|
6
|
+
resemblesAddress(address)) {
|
|
7
|
+
// Ensure that an "unauthorized" error is thrown if the requester
|
|
8
|
+
// does not have the `eth_accounts` permission.
|
|
9
|
+
const accounts = await getAccounts(req);
|
|
10
|
+
const normalizedAccounts = accounts.map((_address) => _address.toLowerCase());
|
|
11
|
+
const normalizedAddress = address.toLowerCase();
|
|
12
|
+
if (normalizedAccounts.includes(normalizedAddress)) {
|
|
13
|
+
return normalizedAddress;
|
|
14
|
+
}
|
|
15
|
+
throw providerErrors.unauthorized();
|
|
16
|
+
}
|
|
17
|
+
throw rpcErrors.invalidParams({
|
|
18
|
+
message: `Invalid parameters: must provide an Ethereum address.`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function validateParams(value, struct) {
|
|
22
|
+
const [error] = validate(value, struct);
|
|
23
|
+
if (error) {
|
|
24
|
+
throw rpcErrors.invalidParams(formatValidationError(error, `Invalid params`));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function resemblesAddress(str) {
|
|
28
|
+
// hex prefix 2 + 20 bytes
|
|
29
|
+
return str.length === 2 + 20 * 2;
|
|
30
|
+
}
|
|
31
|
+
function formatValidationError(error, message) {
|
|
32
|
+
return `${message}\n\n${error
|
|
33
|
+
.failures()
|
|
34
|
+
.map((f) => `${f.path.join(' > ')}${f.path.length ? ' - ' : ''}${f.message}`)
|
|
35
|
+
.join('\n')}`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=validation.mjs.map
|
|
@@ -0,0 +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;AAGjD,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAY,EACZ,GAAmB,EACnB,EAAE,WAAW,EAA+D;IAE5E,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,gBAAgB,CAAC,OAAO,CAAC,EACzB;QACA,iEAAiE;QACjE,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAExC,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;YAClD,OAAO,iBAAiB,CAAC;SAC1B;QAED,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;KACrC;IAED,MAAM,SAAS,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,uDAAuD;KACjE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAA2B,EAC3B,MAA0B;IAE1B,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,KAAK,EAAE;QACT,MAAM,SAAS,CAAC,aAAa,CAC3B,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAC/C,CAAC;KACH;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,0BAA0B;IAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAkB,EAAE,OAAe;IAChE,OAAO,GAAG,OAAO,OAAO,KAAK;SAC1B,QAAQ,EAAE;SACV,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CACxE;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, JsonRpcRequest } from '@metamask/utils';\n\nexport async function validateAndNormalizeKeyholder(\n address: Hex,\n req: JsonRpcRequest,\n { getAccounts }: { getAccounts: (req: JsonRpcRequest) => 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(req);\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\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\nexport function resemblesAddress(str: string): boolean {\n // hex prefix 2 + 20 bytes\n return str.length === 2 + 20 * 2;\n}\n\nfunction formatValidationError(error: StructError, message: string): string {\n return `${message}\\n\\n${error\n .failures()\n .map(\n (f) => `${f.path.join(' > ')}${f.path.length ? ' - ' : ''}${f.message}`,\n )\n .join('\\n')}`;\n}\n"]}
|
package/dist/wallet.cjs
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.createWalletMiddleware = void 0;
|
|
27
|
+
const sigUtil = __importStar(require("@metamask/eth-sig-util"));
|
|
28
|
+
const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
|
|
29
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
30
|
+
const utils_1 = require("@metamask/utils");
|
|
31
|
+
const wallet_request_execution_permissions_1 = require("./methods/wallet-request-execution-permissions.cjs");
|
|
32
|
+
const wallet_revoke_execution_permission_1 = require("./methods/wallet-revoke-execution-permission.cjs");
|
|
33
|
+
const common_1 = require("./utils/common.cjs");
|
|
34
|
+
const normalize_1 = require("./utils/normalize.cjs");
|
|
35
|
+
const validation_1 = require("./utils/validation.cjs");
|
|
36
|
+
function createWalletMiddleware({ getAccounts, processDecryptMessage, processEncryptionPublicKey, processPersonalMessage, processTransaction, processSignTransaction, processTypedMessage, processTypedMessageV3, processTypedMessageV4, processRequestExecutionPermissions, processRevokeExecutionPermission, }) {
|
|
37
|
+
if (!getAccounts) {
|
|
38
|
+
throw new Error('opts.getAccounts is required');
|
|
39
|
+
}
|
|
40
|
+
return (0, json_rpc_engine_1.createScaffoldMiddleware)({
|
|
41
|
+
// account lookups
|
|
42
|
+
eth_accounts: (0, json_rpc_engine_1.createAsyncMiddleware)(lookupAccounts),
|
|
43
|
+
eth_coinbase: (0, json_rpc_engine_1.createAsyncMiddleware)(lookupDefaultAccount),
|
|
44
|
+
// tx signatures
|
|
45
|
+
eth_sendTransaction: (0, json_rpc_engine_1.createAsyncMiddleware)(sendTransaction),
|
|
46
|
+
eth_signTransaction: (0, json_rpc_engine_1.createAsyncMiddleware)(signTransaction),
|
|
47
|
+
// message signatures
|
|
48
|
+
eth_signTypedData: (0, json_rpc_engine_1.createAsyncMiddleware)(signTypedData),
|
|
49
|
+
eth_signTypedData_v3: (0, json_rpc_engine_1.createAsyncMiddleware)(signTypedDataV3),
|
|
50
|
+
eth_signTypedData_v4: (0, json_rpc_engine_1.createAsyncMiddleware)(signTypedDataV4),
|
|
51
|
+
personal_sign: (0, json_rpc_engine_1.createAsyncMiddleware)(personalSign),
|
|
52
|
+
eth_getEncryptionPublicKey: (0, json_rpc_engine_1.createAsyncMiddleware)(encryptionPublicKey),
|
|
53
|
+
eth_decrypt: (0, json_rpc_engine_1.createAsyncMiddleware)(decryptMessage),
|
|
54
|
+
personal_ecRecover: (0, json_rpc_engine_1.createAsyncMiddleware)(personalRecover),
|
|
55
|
+
// EIP-7715
|
|
56
|
+
wallet_requestExecutionPermissions: (0, json_rpc_engine_1.createAsyncMiddleware)(async (req, res) => (0, wallet_request_execution_permissions_1.walletRequestExecutionPermissions)(req, res, {
|
|
57
|
+
processRequestExecutionPermissions,
|
|
58
|
+
})),
|
|
59
|
+
wallet_revokeExecutionPermission: (0, json_rpc_engine_1.createAsyncMiddleware)(async (req, res) => (0, wallet_revoke_execution_permission_1.walletRevokeExecutionPermission)(req, res, {
|
|
60
|
+
processRevokeExecutionPermission,
|
|
61
|
+
})),
|
|
62
|
+
});
|
|
63
|
+
//
|
|
64
|
+
// account lookups
|
|
65
|
+
//
|
|
66
|
+
async function lookupAccounts(req, res) {
|
|
67
|
+
res.result = await getAccounts(req);
|
|
68
|
+
}
|
|
69
|
+
async function lookupDefaultAccount(req, res) {
|
|
70
|
+
const accounts = await getAccounts(req);
|
|
71
|
+
res.result = accounts[0] || null;
|
|
72
|
+
}
|
|
73
|
+
//
|
|
74
|
+
// transaction signatures
|
|
75
|
+
//
|
|
76
|
+
async function sendTransaction(req, res) {
|
|
77
|
+
if (!processTransaction) {
|
|
78
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
79
|
+
}
|
|
80
|
+
if (!req.params ||
|
|
81
|
+
!Array.isArray(req.params) ||
|
|
82
|
+
!(req.params.length >= 1)) {
|
|
83
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
84
|
+
}
|
|
85
|
+
const params = req.params[0];
|
|
86
|
+
const txParams = {
|
|
87
|
+
...params,
|
|
88
|
+
from: await validateAndNormalizeKeyholder(params?.from || '', req),
|
|
89
|
+
};
|
|
90
|
+
res.result = await processTransaction(txParams, req);
|
|
91
|
+
}
|
|
92
|
+
async function signTransaction(req, res) {
|
|
93
|
+
if (!processSignTransaction) {
|
|
94
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
95
|
+
}
|
|
96
|
+
if (!req.params ||
|
|
97
|
+
!Array.isArray(req.params) ||
|
|
98
|
+
!(req.params.length >= 1)) {
|
|
99
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
100
|
+
}
|
|
101
|
+
const params = req.params[0];
|
|
102
|
+
const txParams = {
|
|
103
|
+
...params,
|
|
104
|
+
from: await validateAndNormalizeKeyholder(params?.from || '', req),
|
|
105
|
+
};
|
|
106
|
+
res.result = await processSignTransaction(txParams, req);
|
|
107
|
+
}
|
|
108
|
+
//
|
|
109
|
+
// message signatures
|
|
110
|
+
//
|
|
111
|
+
async function signTypedData(req, res) {
|
|
112
|
+
if (!processTypedMessage) {
|
|
113
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
114
|
+
}
|
|
115
|
+
if (!req?.params ||
|
|
116
|
+
!Array.isArray(req.params) ||
|
|
117
|
+
!(req.params.length >= 2)) {
|
|
118
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
119
|
+
}
|
|
120
|
+
const params = req.params;
|
|
121
|
+
const message = params[0];
|
|
122
|
+
const address = await validateAndNormalizeKeyholder(params[1], req);
|
|
123
|
+
const version = 'V1';
|
|
124
|
+
const extraParams = params[2] || {};
|
|
125
|
+
const msgParams = {
|
|
126
|
+
...extraParams,
|
|
127
|
+
from: address,
|
|
128
|
+
data: message,
|
|
129
|
+
signatureMethod: 'eth_signTypedData',
|
|
130
|
+
version,
|
|
131
|
+
};
|
|
132
|
+
res.result = await processTypedMessage(msgParams, req, version);
|
|
133
|
+
}
|
|
134
|
+
async function signTypedDataV3(req, res) {
|
|
135
|
+
if (!processTypedMessageV3) {
|
|
136
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
137
|
+
}
|
|
138
|
+
if (!req?.params ||
|
|
139
|
+
!Array.isArray(req.params) ||
|
|
140
|
+
!(req.params.length >= 2)) {
|
|
141
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
142
|
+
}
|
|
143
|
+
const params = req.params;
|
|
144
|
+
const address = await validateAndNormalizeKeyholder(params[0], req);
|
|
145
|
+
const message = (0, normalize_1.normalizeTypedMessage)(params[1]);
|
|
146
|
+
validatePrimaryType(message);
|
|
147
|
+
validateVerifyingContract(message);
|
|
148
|
+
const version = 'V3';
|
|
149
|
+
const msgParams = {
|
|
150
|
+
data: message,
|
|
151
|
+
from: address,
|
|
152
|
+
version,
|
|
153
|
+
signatureMethod: 'eth_signTypedData_v3',
|
|
154
|
+
};
|
|
155
|
+
res.result = await processTypedMessageV3(msgParams, req, version);
|
|
156
|
+
}
|
|
157
|
+
async function signTypedDataV4(req, res) {
|
|
158
|
+
if (!processTypedMessageV4) {
|
|
159
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
160
|
+
}
|
|
161
|
+
if (!req?.params ||
|
|
162
|
+
!Array.isArray(req.params) ||
|
|
163
|
+
!(req.params.length >= 2)) {
|
|
164
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
165
|
+
}
|
|
166
|
+
const params = req.params;
|
|
167
|
+
const address = await validateAndNormalizeKeyholder(params[0], req);
|
|
168
|
+
const message = (0, normalize_1.normalizeTypedMessage)(params[1]);
|
|
169
|
+
validatePrimaryType(message);
|
|
170
|
+
validateVerifyingContract(message);
|
|
171
|
+
const version = 'V4';
|
|
172
|
+
const msgParams = {
|
|
173
|
+
data: message,
|
|
174
|
+
from: address,
|
|
175
|
+
version,
|
|
176
|
+
signatureMethod: 'eth_signTypedData_v4',
|
|
177
|
+
};
|
|
178
|
+
res.result = await processTypedMessageV4(msgParams, req, version);
|
|
179
|
+
}
|
|
180
|
+
async function personalSign(req, res) {
|
|
181
|
+
if (!processPersonalMessage) {
|
|
182
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
183
|
+
}
|
|
184
|
+
if (!req?.params ||
|
|
185
|
+
!Array.isArray(req.params) ||
|
|
186
|
+
!(req.params.length >= 2)) {
|
|
187
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
188
|
+
}
|
|
189
|
+
const params = req.params;
|
|
190
|
+
// process normally
|
|
191
|
+
const firstParam = params[0];
|
|
192
|
+
const secondParam = params[1];
|
|
193
|
+
// non-standard "extraParams" to be appended to our "msgParams" obj
|
|
194
|
+
const extraParams = params[2] || {};
|
|
195
|
+
// We initially incorrectly ordered these parameters.
|
|
196
|
+
// To gracefully respect users who adopted this API early,
|
|
197
|
+
// we are currently gracefully recovering from the wrong param order
|
|
198
|
+
// when it is clearly identifiable.
|
|
199
|
+
//
|
|
200
|
+
// That means when the first param is definitely an address,
|
|
201
|
+
// and the second param is definitely not, but is hex.
|
|
202
|
+
let address, message;
|
|
203
|
+
if ((0, validation_1.resemblesAddress)(firstParam) && !(0, validation_1.resemblesAddress)(secondParam)) {
|
|
204
|
+
let warning = `The eth_personalSign method requires params ordered `;
|
|
205
|
+
warning += `[message, address]. This was previously handled incorrectly, `;
|
|
206
|
+
warning += `and has been corrected automatically. `;
|
|
207
|
+
warning += `Please switch this param order for smooth behavior in the future.`;
|
|
208
|
+
res.warning = warning;
|
|
209
|
+
address = firstParam;
|
|
210
|
+
message = secondParam;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
message = firstParam;
|
|
214
|
+
address = secondParam;
|
|
215
|
+
}
|
|
216
|
+
address = await validateAndNormalizeKeyholder(address, req);
|
|
217
|
+
const msgParams = {
|
|
218
|
+
...extraParams,
|
|
219
|
+
from: address,
|
|
220
|
+
data: message,
|
|
221
|
+
signatureMethod: 'personal_sign',
|
|
222
|
+
};
|
|
223
|
+
res.result = await processPersonalMessage(msgParams, req);
|
|
224
|
+
}
|
|
225
|
+
async function personalRecover(req, res) {
|
|
226
|
+
if (!req?.params ||
|
|
227
|
+
!Array.isArray(req.params) ||
|
|
228
|
+
!(req.params.length >= 2)) {
|
|
229
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
230
|
+
}
|
|
231
|
+
const params = req.params;
|
|
232
|
+
const message = params[0];
|
|
233
|
+
const signature = params[1];
|
|
234
|
+
const signerAddress = sigUtil.recoverPersonalSignature({
|
|
235
|
+
data: message,
|
|
236
|
+
signature,
|
|
237
|
+
});
|
|
238
|
+
res.result = signerAddress;
|
|
239
|
+
}
|
|
240
|
+
async function encryptionPublicKey(req, res) {
|
|
241
|
+
if (!processEncryptionPublicKey) {
|
|
242
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
243
|
+
}
|
|
244
|
+
if (!req?.params ||
|
|
245
|
+
!Array.isArray(req.params) ||
|
|
246
|
+
!(req.params.length >= 1)) {
|
|
247
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
248
|
+
}
|
|
249
|
+
const params = req.params;
|
|
250
|
+
const address = await validateAndNormalizeKeyholder(params[0], req);
|
|
251
|
+
res.result = await processEncryptionPublicKey(address, req);
|
|
252
|
+
}
|
|
253
|
+
async function decryptMessage(req, res) {
|
|
254
|
+
if (!processDecryptMessage) {
|
|
255
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported();
|
|
256
|
+
}
|
|
257
|
+
if (!req?.params ||
|
|
258
|
+
!Array.isArray(req.params) ||
|
|
259
|
+
!(req.params.length >= 1)) {
|
|
260
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
261
|
+
}
|
|
262
|
+
const params = req.params;
|
|
263
|
+
const ciphertext = params[0];
|
|
264
|
+
const address = await validateAndNormalizeKeyholder(params[1], req);
|
|
265
|
+
const extraParams = params[2] || {};
|
|
266
|
+
const msgParams = {
|
|
267
|
+
...extraParams,
|
|
268
|
+
from: address,
|
|
269
|
+
data: ciphertext,
|
|
270
|
+
};
|
|
271
|
+
res.result = await processDecryptMessage(msgParams, req);
|
|
272
|
+
}
|
|
273
|
+
//
|
|
274
|
+
// utility
|
|
275
|
+
//
|
|
276
|
+
/**
|
|
277
|
+
* Validates the keyholder address, and returns a normalized (i.e. lowercase)
|
|
278
|
+
* copy of it.
|
|
279
|
+
*
|
|
280
|
+
* @param address - The address to validate and normalize.
|
|
281
|
+
* @param req - The request object.
|
|
282
|
+
* @returns The normalized address, if valid. Otherwise, throws
|
|
283
|
+
* an error
|
|
284
|
+
*/
|
|
285
|
+
async function validateAndNormalizeKeyholder(address, req) {
|
|
286
|
+
return (0, validation_1.validateAndNormalizeKeyholder)(address, req, { getAccounts });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
exports.createWalletMiddleware = createWalletMiddleware;
|
|
290
|
+
/**
|
|
291
|
+
* Validates primary of typedSignMessage, to ensure that it's type definition is present in message.
|
|
292
|
+
*
|
|
293
|
+
* @param data - The data passed in typedSign request.
|
|
294
|
+
*/
|
|
295
|
+
function validatePrimaryType(data) {
|
|
296
|
+
const { primaryType, types } = (0, normalize_1.parseTypedMessage)(data);
|
|
297
|
+
if (!types) {
|
|
298
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
299
|
+
}
|
|
300
|
+
// Primary type can be an array.
|
|
301
|
+
const baseType = (0, common_1.stripArrayTypeIfPresent)(primaryType);
|
|
302
|
+
// Return if the base type is not defined in the types
|
|
303
|
+
const baseTypeDefinitions = types[baseType];
|
|
304
|
+
if (!baseTypeDefinitions) {
|
|
305
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Validates verifyingContract of typedSignMessage.
|
|
310
|
+
*
|
|
311
|
+
* @param data - The data passed in typedSign request.
|
|
312
|
+
* This function allows the verifyingContract to be either:
|
|
313
|
+
* - A valid hex address
|
|
314
|
+
* - The string "cosmos" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)
|
|
315
|
+
* - An empty string
|
|
316
|
+
*/
|
|
317
|
+
function validateVerifyingContract(data) {
|
|
318
|
+
const { domain: { verifyingContract } = {} } = (0, normalize_1.parseTypedMessage)(data);
|
|
319
|
+
// Explicit check for cosmos here has been added to address this issue
|
|
320
|
+
// https://github.com/MetaMask/eth-json-rpc-middleware/issues/337
|
|
321
|
+
if (verifyingContract &&
|
|
322
|
+
verifyingContract !== 'cosmos' &&
|
|
323
|
+
!(0, utils_1.isValidHexAddress)(verifyingContract)) {
|
|
324
|
+
throw rpc_errors_1.rpcErrors.invalidInput();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=wallet.cjs.map
|
|
@@ -0,0 +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 { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport {\n createAsyncMiddleware,\n createScaffoldMiddleware,\n} from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type {\n JsonRpcRequest,\n PendingJsonRpcResponse,\n Json,\n Hex,\n} from '@metamask/utils';\n\nimport {\n type ProcessRequestExecutionPermissionsHook,\n walletRequestExecutionPermissions,\n} from './methods/wallet-request-execution-permissions';\nimport {\n type ProcessRevokeExecutionPermissionHook,\n walletRevokeExecutionPermission,\n} from './methods/wallet-revoke-execution-permission';\nimport type { Block } from './types';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n resemblesAddress,\n validateAndNormalizeKeyholder as validateKeyholder,\n} from './utils/validation';\n\n/*\nexport type TransactionParams = {\n [prop: string]: Json;\n from: string;\n}\n*/\n\n/*\nexport type TransactionParams = JsonRpcParams & {\n from: string;\n}\n*/\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 interface WalletMiddlewareOptions {\n getAccounts: (req: JsonRpcRequest) => Promise<string[]>;\n processDecryptMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n ) => Promise<string>;\n processEncryptionPublicKey?: (\n address: string,\n req: JsonRpcRequest,\n ) => Promise<string>;\n processPersonalMessage?: (\n msgParams: MessageParams,\n req: JsonRpcRequest,\n ) => Promise<string>;\n processTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n ) => Promise<string>;\n processSignTransaction?: (\n txParams: TransactionParams,\n req: JsonRpcRequest,\n ) => Promise<string>;\n processTypedMessage?: (\n msgParams: TypedMessageV1Params,\n req: JsonRpcRequest,\n version: string,\n ) => Promise<string>;\n processTypedMessageV3?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n version: string,\n ) => Promise<string>;\n processTypedMessageV4?: (\n msgParams: TypedMessageParams,\n req: JsonRpcRequest,\n version: string,\n ) => Promise<string>;\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n}\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}: // }: WalletMiddlewareOptions): JsonRpcMiddleware<string, Block> {\nWalletMiddlewareOptions): JsonRpcMiddleware<any, Block> {\n if (!getAccounts) {\n throw new Error('opts.getAccounts is required');\n }\n\n return createScaffoldMiddleware({\n // account lookups\n eth_accounts: createAsyncMiddleware(lookupAccounts),\n eth_coinbase: createAsyncMiddleware(lookupDefaultAccount),\n\n // tx signatures\n eth_sendTransaction: createAsyncMiddleware(sendTransaction),\n eth_signTransaction: createAsyncMiddleware(signTransaction),\n\n // message signatures\n eth_signTypedData: createAsyncMiddleware(signTypedData),\n eth_signTypedData_v3: createAsyncMiddleware(signTypedDataV3),\n eth_signTypedData_v4: createAsyncMiddleware(signTypedDataV4),\n personal_sign: createAsyncMiddleware(personalSign),\n eth_getEncryptionPublicKey: createAsyncMiddleware(encryptionPublicKey),\n eth_decrypt: createAsyncMiddleware(decryptMessage),\n personal_ecRecover: createAsyncMiddleware(personalRecover),\n\n // EIP-7715\n wallet_requestExecutionPermissions: createAsyncMiddleware(\n async (req, res) =>\n walletRequestExecutionPermissions(req, res, {\n processRequestExecutionPermissions,\n }),\n ),\n wallet_revokeExecutionPermission: createAsyncMiddleware(async (req, res) =>\n walletRevokeExecutionPermission(req, res, {\n processRevokeExecutionPermission,\n }),\n ),\n });\n\n //\n // account lookups\n //\n\n async function lookupAccounts(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n res.result = await getAccounts(req);\n }\n\n async function lookupDefaultAccount(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n const accounts = await getAccounts(req);\n res.result = accounts[0] || null;\n }\n\n //\n // transaction signatures\n //\n\n async function sendTransaction(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n from: await validateAndNormalizeKeyholder(params?.from || '', req),\n };\n res.result = await processTransaction(txParams, req);\n }\n\n async function signTransaction(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processSignTransaction) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.params[0] as TransactionParams | undefined;\n const txParams: TransactionParams = {\n ...params,\n from: await validateAndNormalizeKeyholder(params?.from || '', req),\n };\n res.result = await processSignTransaction(txParams, req);\n }\n\n //\n // message signatures\n //\n async function signTypedData(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processTypedMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.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], req);\n const version = 'V1';\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 res.result = await processTypedMessage(msgParams, req, version);\n }\n\n async function signTypedDataV3(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processTypedMessageV3) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], req);\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 res.result = await processTypedMessageV3(msgParams, req, version);\n }\n\n async function signTypedDataV4(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processTypedMessageV4) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.params as [string, string];\n\n const address = await validateAndNormalizeKeyholder(params[0], req);\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 res.result = await processTypedMessageV4(msgParams, req, version);\n }\n\n async function personalSign(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processPersonalMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.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 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 let warning = `The eth_personalSign method requires params ordered `;\n warning += `[message, address]. This was previously handled incorrectly, `;\n warning += `and has been corrected automatically. `;\n warning += `Please switch this param order for smooth behavior in the future.`;\n (res as any).warning = warning;\n\n address = firstParam;\n message = secondParam;\n } else {\n message = firstParam;\n address = secondParam;\n }\n address = await validateAndNormalizeKeyholder(address, req);\n\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: message,\n signatureMethod: 'personal_sign',\n };\n\n res.result = await processPersonalMessage(msgParams, req);\n }\n\n async function personalRecover(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 2)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.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 res.result = signerAddress;\n }\n\n async function encryptionPublicKey(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processEncryptionPublicKey) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n\n const params = req.params as [string];\n\n const address = await validateAndNormalizeKeyholder(params[0], req);\n\n res.result = await processEncryptionPublicKey(address, req);\n }\n\n async function decryptMessage(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n ): Promise<void> {\n if (!processDecryptMessage) {\n throw rpcErrors.methodNotSupported();\n }\n if (\n !req?.params ||\n !Array.isArray(req.params) ||\n !(req.params.length >= 1)\n ) {\n throw rpcErrors.invalidInput();\n }\n const params = req.params as [string, string, Record<string, Json>?];\n\n const ciphertext: string = params[0];\n const address: string = await validateAndNormalizeKeyholder(params[1], req);\n const extraParams = params[2] || {};\n const msgParams: MessageParams = {\n ...extraParams,\n from: address,\n data: ciphertext,\n };\n\n res.result = await processDecryptMessage(msgParams, req);\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 req - The request object.\n * @returns The normalized address, if valid. Otherwise, throws\n * an error\n */\n async function validateAndNormalizeKeyholder(\n address: string,\n req: JsonRpcRequest,\n ): Promise<string> {\n return validateKeyholder(address as Hex, req, { 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) {\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) {\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"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { JsonRpcMiddleware } from "@metamask/json-rpc-engine";
|
|
2
|
+
import type { JsonRpcRequest } from "@metamask/utils";
|
|
3
|
+
import { type ProcessRequestExecutionPermissionsHook } from "./methods/wallet-request-execution-permissions.cjs";
|
|
4
|
+
import { type ProcessRevokeExecutionPermissionHook } from "./methods/wallet-revoke-execution-permission.cjs";
|
|
5
|
+
import type { Block } from "./types.cjs";
|
|
6
|
+
export type TransactionParams = {
|
|
7
|
+
from: string;
|
|
8
|
+
};
|
|
9
|
+
export type MessageParams = TransactionParams & {
|
|
10
|
+
data: string;
|
|
11
|
+
signatureMethod?: string;
|
|
12
|
+
};
|
|
13
|
+
export type TypedMessageParams = MessageParams & {
|
|
14
|
+
version: string;
|
|
15
|
+
};
|
|
16
|
+
export type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {
|
|
17
|
+
data: Record<string, unknown>[];
|
|
18
|
+
};
|
|
19
|
+
export interface WalletMiddlewareOptions {
|
|
20
|
+
getAccounts: (req: JsonRpcRequest) => Promise<string[]>;
|
|
21
|
+
processDecryptMessage?: (msgParams: MessageParams, req: JsonRpcRequest) => Promise<string>;
|
|
22
|
+
processEncryptionPublicKey?: (address: string, req: JsonRpcRequest) => Promise<string>;
|
|
23
|
+
processPersonalMessage?: (msgParams: MessageParams, req: JsonRpcRequest) => Promise<string>;
|
|
24
|
+
processTransaction?: (txParams: TransactionParams, req: JsonRpcRequest) => Promise<string>;
|
|
25
|
+
processSignTransaction?: (txParams: TransactionParams, req: JsonRpcRequest) => Promise<string>;
|
|
26
|
+
processTypedMessage?: (msgParams: TypedMessageV1Params, req: JsonRpcRequest, version: string) => Promise<string>;
|
|
27
|
+
processTypedMessageV3?: (msgParams: TypedMessageParams, req: JsonRpcRequest, version: string) => Promise<string>;
|
|
28
|
+
processTypedMessageV4?: (msgParams: TypedMessageParams, req: JsonRpcRequest, version: string) => Promise<string>;
|
|
29
|
+
processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
|
|
30
|
+
processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;
|
|
31
|
+
}
|
|
32
|
+
export declare function createWalletMiddleware({ getAccounts, processDecryptMessage, processEncryptionPublicKey, processPersonalMessage, processTransaction, processSignTransaction, processTypedMessage, processTypedMessageV3, processTypedMessageV4, processRequestExecutionPermissions, processRevokeExecutionPermission, }: WalletMiddlewareOptions): JsonRpcMiddleware<any, Block>;
|
|
33
|
+
//# sourceMappingURL=wallet.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAOnE,OAAO,KAAK,EACV,cAAc,EAIf,wBAAwB;AAEzB,OAAO,EACL,KAAK,sCAAsC,EAE5C,2DAAuD;AACxD,OAAO,EACL,KAAK,oCAAoC,EAE1C,yDAAqD;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAgB;AAqBrC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG;IACpE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,0BAA0B,CAAC,EAAE,CAC3B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,CAAC,EAAE,CACvB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,kBAAkB,CAAC,EAAE,CACnB,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,CAAC,EAAE,CACvB,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,mBAAmB,CAAC,EAAE,CACpB,SAAS,EAAE,oBAAoB,EAC/B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,kBAAkB,EAC7B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,kBAAkB,EAC7B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;IAC5E,gCAAgC,CAAC,EAAE,oCAAoC,CAAC;CACzE;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,kCAAkC,EAClC,gCAAgC,GACjC,EACD,uBAAuB,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAoWtD"}
|