@metamask-previews/eth-ledger-bridge-keyring 12.2.0-6bf9188 → 12.2.0-e51c895

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 CHANGED
@@ -7,9 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Fixed
10
+ ### Changed
11
11
 
12
- - Throw `HardwareWalletError` with `DeviceStateOnlyV4Supported` when `signTypedData` is called with a non-V4 version ([#575](https://github.com/MetaMask/accounts/pull/575))
12
+ - Bump `@metamask/hw-wallet-sdk` from `^0.8.0` to `^0.9.0` ([#576](https://github.com/MetaMask/accounts/pull/576))
13
13
 
14
14
  ## [12.2.0]
15
15
 
package/dist/errors.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createKeyringStateError = exports.getLedgerErrorMapping = exports.isKnownLedgerError = exports.createLedgerError = void 0;
3
+ exports.getLedgerErrorMapping = exports.isKnownLedgerError = exports.createLedgerError = void 0;
4
4
  const hw_wallet_sdk_1 = require("@metamask/hw-wallet-sdk");
5
5
  /**
6
6
  * Factory function to create a HardwareWalletError from a Ledger error code.
@@ -54,30 +54,4 @@ function getLedgerErrorMapping(ledgerErrorCode) {
54
54
  return hw_wallet_sdk_1.LEDGER_ERROR_MAPPINGS[ledgerErrorCode];
55
55
  }
56
56
  exports.getLedgerErrorMapping = getLedgerErrorMapping;
57
- /**
58
- * Factory function to create a HardwareWalletError from a keyring-level error code.
59
- *
60
- * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)
61
- * @returns A HardwareWalletError instance with mapped error details
62
- */
63
- function createKeyringStateError(code) {
64
- const errorMapping = hw_wallet_sdk_1.KEYRING_ERROR_MAPPINGS[code];
65
- if (errorMapping) {
66
- const message = `Ledger: ${errorMapping.message}`;
67
- return new hw_wallet_sdk_1.HardwareWalletError(message, {
68
- code: errorMapping.code,
69
- severity: errorMapping.severity,
70
- category: errorMapping.category,
71
- userMessage: errorMapping.userMessage ?? message,
72
- });
73
- }
74
- const fallbackMessage = `Unknown Ledger keyring error: ${code}`;
75
- return new hw_wallet_sdk_1.HardwareWalletError(fallbackMessage, {
76
- code: hw_wallet_sdk_1.ErrorCode.Unknown,
77
- severity: hw_wallet_sdk_1.Severity.Err,
78
- category: hw_wallet_sdk_1.Category.Unknown,
79
- userMessage: fallbackMessage,
80
- });
81
- }
82
- exports.createKeyringStateError = createKeyringStateError;
83
57
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,2DAQiC;AAEjC;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,eAAuB,EACvB,OAAgB;IAEhB,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,KAAK,OAAO,GAAG;YACxC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAEzB,OAAO,IAAI,mCAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,yBAAyB,eAAe,KAAK,OAAO,GAAG;QACzD,CAAC,CAAC,yBAAyB,eAAe,EAAE,CAAC;IAE/C,OAAO,IAAI,mCAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,yBAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,wBAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,wBAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC;AA9BD,8CA8BC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,eAAuB;IACxD,OAAO,eAAe,IAAI,qCAAqB,CAAC;AAClD,CAAC;AAFD,gDAEC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,eAAuB;IAEvB,OAAO,qCAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AAJD,sDAIC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,IAAe;IACrD,MAAM,YAAY,GAAG,sCAAsB,CAAC,IAAI,CAAC,CAAC;IAElD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,WAAW,YAAY,CAAC,OAAO,EAAE,CAAC;QAElD,OAAO,IAAI,mCAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,iCAAiC,IAAI,EAAE,CAAC;IAEhE,OAAO,IAAI,mCAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,yBAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,wBAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,wBAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC;AAtBD,0DAsBC","sourcesContent":["import {\n ErrorMapping,\n ErrorCode,\n Severity,\n Category,\n HardwareWalletError,\n LEDGER_ERROR_MAPPINGS,\n KEYRING_ERROR_MAPPINGS,\n} from '@metamask/hw-wallet-sdk';\n\n/**\n * Factory function to create a HardwareWalletError from a Ledger error code.\n *\n * @param ledgerErrorCode - The Ledger error code (e.g., '0x6985', '0x5515')\n * @param context - Optional additional context to append to the error message\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createLedgerError(\n ledgerErrorCode: string,\n context?: string,\n): HardwareWalletError {\n const errorMapping = getLedgerErrorMapping(ledgerErrorCode);\n\n if (errorMapping) {\n const message = context\n ? `${errorMapping.message} (${context})`\n : errorMapping.message;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n // Fallback for unknown error codes\n const fallbackMessage = context\n ? `Unknown Ledger error: ${ledgerErrorCode} (${context})`\n : `Unknown Ledger error: ${ledgerErrorCode}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n\n/**\n * Checks if a Ledger error code exists in the error mappings.\n *\n * @param ledgerErrorCode - The Ledger error code to check\n * @returns True if the error code is mapped, false otherwise\n */\nexport function isKnownLedgerError(ledgerErrorCode: string): boolean {\n return ledgerErrorCode in LEDGER_ERROR_MAPPINGS;\n}\n\n/**\n * Gets the error mapping details for a Ledger error code without creating an error instance.\n *\n * @param ledgerErrorCode - The Ledger error code to look up\n * @returns The error mapping details or undefined if not found\n */\nexport function getLedgerErrorMapping(\n ledgerErrorCode: string,\n): ErrorMapping | undefined {\n return LEDGER_ERROR_MAPPINGS[ledgerErrorCode];\n}\n\n/**\n * Factory function to create a HardwareWalletError from a keyring-level error code.\n *\n * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createKeyringStateError(code: ErrorCode): HardwareWalletError {\n const errorMapping = KEYRING_ERROR_MAPPINGS[code];\n\n if (errorMapping) {\n const message = `Ledger: ${errorMapping.message}`;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n const fallbackMessage = `Unknown Ledger keyring error: ${code}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n"]}
1
+ {"version":3,"file":"errors.cjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,2DAOiC;AAEjC;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,eAAuB,EACvB,OAAgB;IAEhB,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,KAAK,OAAO,GAAG;YACxC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAEzB,OAAO,IAAI,mCAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,yBAAyB,eAAe,KAAK,OAAO,GAAG;QACzD,CAAC,CAAC,yBAAyB,eAAe,EAAE,CAAC;IAE/C,OAAO,IAAI,mCAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,yBAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,wBAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,wBAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC;AA9BD,8CA8BC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,eAAuB;IACxD,OAAO,eAAe,IAAI,qCAAqB,CAAC;AAClD,CAAC;AAFD,gDAEC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,eAAuB;IAEvB,OAAO,qCAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AAJD,sDAIC","sourcesContent":["import {\n ErrorMapping,\n ErrorCode,\n Severity,\n Category,\n HardwareWalletError,\n LEDGER_ERROR_MAPPINGS,\n} from '@metamask/hw-wallet-sdk';\n\n/**\n * Factory function to create a HardwareWalletError from a Ledger error code.\n *\n * @param ledgerErrorCode - The Ledger error code (e.g., '0x6985', '0x5515')\n * @param context - Optional additional context to append to the error message\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createLedgerError(\n ledgerErrorCode: string,\n context?: string,\n): HardwareWalletError {\n const errorMapping = getLedgerErrorMapping(ledgerErrorCode);\n\n if (errorMapping) {\n const message = context\n ? `${errorMapping.message} (${context})`\n : errorMapping.message;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n // Fallback for unknown error codes\n const fallbackMessage = context\n ? `Unknown Ledger error: ${ledgerErrorCode} (${context})`\n : `Unknown Ledger error: ${ledgerErrorCode}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n\n/**\n * Checks if a Ledger error code exists in the error mappings.\n *\n * @param ledgerErrorCode - The Ledger error code to check\n * @returns True if the error code is mapped, false otherwise\n */\nexport function isKnownLedgerError(ledgerErrorCode: string): boolean {\n return ledgerErrorCode in LEDGER_ERROR_MAPPINGS;\n}\n\n/**\n * Gets the error mapping details for a Ledger error code without creating an error instance.\n *\n * @param ledgerErrorCode - The Ledger error code to look up\n * @returns The error mapping details or undefined if not found\n */\nexport function getLedgerErrorMapping(\n ledgerErrorCode: string,\n): ErrorMapping | undefined {\n return LEDGER_ERROR_MAPPINGS[ledgerErrorCode];\n}\n"]}
package/dist/errors.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { ErrorMapping, ErrorCode, HardwareWalletError } from "@metamask/hw-wallet-sdk";
1
+ import { ErrorMapping, HardwareWalletError } from "@metamask/hw-wallet-sdk";
2
2
  /**
3
3
  * Factory function to create a HardwareWalletError from a Ledger error code.
4
4
  *
@@ -21,11 +21,4 @@ export declare function isKnownLedgerError(ledgerErrorCode: string): boolean;
21
21
  * @returns The error mapping details or undefined if not found
22
22
  */
23
23
  export declare function getLedgerErrorMapping(ledgerErrorCode: string): ErrorMapping | undefined;
24
- /**
25
- * Factory function to create a HardwareWalletError from a keyring-level error code.
26
- *
27
- * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)
28
- * @returns A HardwareWalletError instance with mapped error details
29
- */
30
- export declare function createKeyringStateError(code: ErrorCode): HardwareWalletError;
31
24
  //# sourceMappingURL=errors.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.cts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EAGT,mBAAmB,EAGpB,gCAAgC;AAEjC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,CA2BrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,SAAS,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,CAsB5E"}
1
+ {"version":3,"file":"errors.d.cts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAIZ,mBAAmB,EAEpB,gCAAgC;AAEjC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,CA2BrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,SAAS,CAE1B"}
package/dist/errors.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { ErrorMapping, ErrorCode, HardwareWalletError } from "@metamask/hw-wallet-sdk";
1
+ import { ErrorMapping, HardwareWalletError } from "@metamask/hw-wallet-sdk";
2
2
  /**
3
3
  * Factory function to create a HardwareWalletError from a Ledger error code.
4
4
  *
@@ -21,11 +21,4 @@ export declare function isKnownLedgerError(ledgerErrorCode: string): boolean;
21
21
  * @returns The error mapping details or undefined if not found
22
22
  */
23
23
  export declare function getLedgerErrorMapping(ledgerErrorCode: string): ErrorMapping | undefined;
24
- /**
25
- * Factory function to create a HardwareWalletError from a keyring-level error code.
26
- *
27
- * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)
28
- * @returns A HardwareWalletError instance with mapped error details
29
- */
30
- export declare function createKeyringStateError(code: ErrorCode): HardwareWalletError;
31
24
  //# sourceMappingURL=errors.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.mts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EAGT,mBAAmB,EAGpB,gCAAgC;AAEjC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,CA2BrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,SAAS,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,CAsB5E"}
1
+ {"version":3,"file":"errors.d.mts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAIZ,mBAAmB,EAEpB,gCAAgC;AAEjC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,CA2BrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,SAAS,CAE1B"}
package/dist/errors.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { ErrorCode, Severity, Category, HardwareWalletError, LEDGER_ERROR_MAPPINGS, KEYRING_ERROR_MAPPINGS } from "@metamask/hw-wallet-sdk";
1
+ import { ErrorCode, Severity, Category, HardwareWalletError, LEDGER_ERROR_MAPPINGS } from "@metamask/hw-wallet-sdk";
2
2
  /**
3
3
  * Factory function to create a HardwareWalletError from a Ledger error code.
4
4
  *
@@ -48,29 +48,4 @@ export function isKnownLedgerError(ledgerErrorCode) {
48
48
  export function getLedgerErrorMapping(ledgerErrorCode) {
49
49
  return LEDGER_ERROR_MAPPINGS[ledgerErrorCode];
50
50
  }
51
- /**
52
- * Factory function to create a HardwareWalletError from a keyring-level error code.
53
- *
54
- * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)
55
- * @returns A HardwareWalletError instance with mapped error details
56
- */
57
- export function createKeyringStateError(code) {
58
- const errorMapping = KEYRING_ERROR_MAPPINGS[code];
59
- if (errorMapping) {
60
- const message = `Ledger: ${errorMapping.message}`;
61
- return new HardwareWalletError(message, {
62
- code: errorMapping.code,
63
- severity: errorMapping.severity,
64
- category: errorMapping.category,
65
- userMessage: errorMapping.userMessage ?? message,
66
- });
67
- }
68
- const fallbackMessage = `Unknown Ledger keyring error: ${code}`;
69
- return new HardwareWalletError(fallbackMessage, {
70
- code: ErrorCode.Unknown,
71
- severity: Severity.Err,
72
- category: Category.Unknown,
73
- userMessage: fallbackMessage,
74
- });
75
- }
76
51
  //# sourceMappingURL=errors.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACvB,gCAAgC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAAuB,EACvB,OAAgB;IAEhB,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,KAAK,OAAO,GAAG;YACxC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAEzB,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,yBAAyB,eAAe,KAAK,OAAO,GAAG;QACzD,CAAC,CAAC,yBAAyB,eAAe,EAAE,CAAC;IAE/C,OAAO,IAAI,mBAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB;IACxD,OAAO,eAAe,IAAI,qBAAqB,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAuB;IAEvB,OAAO,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAe;IACrD,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAElD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,WAAW,YAAY,CAAC,OAAO,EAAE,CAAC;QAElD,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,iCAAiC,IAAI,EAAE,CAAC;IAEhE,OAAO,IAAI,mBAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n ErrorMapping,\n ErrorCode,\n Severity,\n Category,\n HardwareWalletError,\n LEDGER_ERROR_MAPPINGS,\n KEYRING_ERROR_MAPPINGS,\n} from '@metamask/hw-wallet-sdk';\n\n/**\n * Factory function to create a HardwareWalletError from a Ledger error code.\n *\n * @param ledgerErrorCode - The Ledger error code (e.g., '0x6985', '0x5515')\n * @param context - Optional additional context to append to the error message\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createLedgerError(\n ledgerErrorCode: string,\n context?: string,\n): HardwareWalletError {\n const errorMapping = getLedgerErrorMapping(ledgerErrorCode);\n\n if (errorMapping) {\n const message = context\n ? `${errorMapping.message} (${context})`\n : errorMapping.message;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n // Fallback for unknown error codes\n const fallbackMessage = context\n ? `Unknown Ledger error: ${ledgerErrorCode} (${context})`\n : `Unknown Ledger error: ${ledgerErrorCode}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n\n/**\n * Checks if a Ledger error code exists in the error mappings.\n *\n * @param ledgerErrorCode - The Ledger error code to check\n * @returns True if the error code is mapped, false otherwise\n */\nexport function isKnownLedgerError(ledgerErrorCode: string): boolean {\n return ledgerErrorCode in LEDGER_ERROR_MAPPINGS;\n}\n\n/**\n * Gets the error mapping details for a Ledger error code without creating an error instance.\n *\n * @param ledgerErrorCode - The Ledger error code to look up\n * @returns The error mapping details or undefined if not found\n */\nexport function getLedgerErrorMapping(\n ledgerErrorCode: string,\n): ErrorMapping | undefined {\n return LEDGER_ERROR_MAPPINGS[ledgerErrorCode];\n}\n\n/**\n * Factory function to create a HardwareWalletError from a keyring-level error code.\n *\n * @param code - The keyring error code (e.g., ErrorCode.DeviceStateOnlyV4Supported)\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createKeyringStateError(code: ErrorCode): HardwareWalletError {\n const errorMapping = KEYRING_ERROR_MAPPINGS[code];\n\n if (errorMapping) {\n const message = `Ledger: ${errorMapping.message}`;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n const fallbackMessage = `Unknown Ledger keyring error: ${code}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n"]}
1
+ {"version":3,"file":"errors.mjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EACtB,gCAAgC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAAuB,EACvB,OAAgB;IAEhB,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,KAAK,OAAO,GAAG;YACxC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAEzB,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO;SACjD,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,yBAAyB,eAAe,KAAK,OAAO,GAAG;QACzD,CAAC,CAAC,yBAAyB,eAAe,EAAE,CAAC;IAE/C,OAAO,IAAI,mBAAmB,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB;IACxD,OAAO,eAAe,IAAI,qBAAqB,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAuB;IAEvB,OAAO,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import {\n ErrorMapping,\n ErrorCode,\n Severity,\n Category,\n HardwareWalletError,\n LEDGER_ERROR_MAPPINGS,\n} from '@metamask/hw-wallet-sdk';\n\n/**\n * Factory function to create a HardwareWalletError from a Ledger error code.\n *\n * @param ledgerErrorCode - The Ledger error code (e.g., '0x6985', '0x5515')\n * @param context - Optional additional context to append to the error message\n * @returns A HardwareWalletError instance with mapped error details\n */\nexport function createLedgerError(\n ledgerErrorCode: string,\n context?: string,\n): HardwareWalletError {\n const errorMapping = getLedgerErrorMapping(ledgerErrorCode);\n\n if (errorMapping) {\n const message = context\n ? `${errorMapping.message} (${context})`\n : errorMapping.message;\n\n return new HardwareWalletError(message, {\n code: errorMapping.code,\n severity: errorMapping.severity,\n category: errorMapping.category,\n userMessage: errorMapping.userMessage ?? message,\n });\n }\n\n // Fallback for unknown error codes\n const fallbackMessage = context\n ? `Unknown Ledger error: ${ledgerErrorCode} (${context})`\n : `Unknown Ledger error: ${ledgerErrorCode}`;\n\n return new HardwareWalletError(fallbackMessage, {\n code: ErrorCode.Unknown,\n severity: Severity.Err,\n category: Category.Unknown,\n userMessage: fallbackMessage,\n });\n}\n\n/**\n * Checks if a Ledger error code exists in the error mappings.\n *\n * @param ledgerErrorCode - The Ledger error code to check\n * @returns True if the error code is mapped, false otherwise\n */\nexport function isKnownLedgerError(ledgerErrorCode: string): boolean {\n return ledgerErrorCode in LEDGER_ERROR_MAPPINGS;\n}\n\n/**\n * Gets the error mapping details for a Ledger error code without creating an error instance.\n *\n * @param ledgerErrorCode - The Ledger error code to look up\n * @returns The error mapping details or undefined if not found\n */\nexport function getLedgerErrorMapping(\n ledgerErrorCode: string,\n): ErrorMapping | undefined {\n return LEDGER_ERROR_MAPPINGS[ledgerErrorCode];\n}\n"]}
@@ -14,11 +14,9 @@ const rlp_1 = require("@ethereumjs/rlp");
14
14
  const tx_1 = require("@ethereumjs/tx");
15
15
  const util_1 = require("@ethereumjs/util");
16
16
  const eth_sig_util_1 = require("@metamask/eth-sig-util");
17
- const hw_wallet_sdk_1 = require("@metamask/hw-wallet-sdk");
18
17
  const utils_1 = require("@metamask/utils");
19
18
  const buffer_1 = require("buffer");
20
19
  const hdkey_1 = __importDefault(require("hdkey"));
21
- const errors_1 = require("./errors.cjs");
22
20
  const ledger_error_handler_1 = require("./ledger-error-handler.cjs");
23
21
  const pathBase = 'm';
24
22
  const hdPathString = `${pathBase}/44'/60'/0'`;
@@ -327,7 +325,7 @@ class LedgerKeyring {
327
325
  const { version } = options ?? {};
328
326
  const isV4 = version === 'V4';
329
327
  if (!isV4) {
330
- throw (0, errors_1.createKeyringStateError)(hw_wallet_sdk_1.ErrorCode.DeviceStateOnlyV4Supported);
328
+ throw new Error('Ledger: Only version 4 of typed data signing is supported');
331
329
  }
332
330
  const { domain, types, primaryType, message } = eth_sig_util_1.TypedDataUtils.sanitizeData(data);
333
331
  const hdPath = await this.unlockAccountByAddress(withAccount);
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-keyring.cjs","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { RLP } from '@ethereumjs/rlp';\nimport { TransactionFactory, TypedTxData } from '@ethereumjs/tx';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { publicToAddress } from '@ethereumjs/util';\nimport type { MessageTypes, TypedMessage } from '@metamask/eth-sig-util';\nimport {\n recoverEIP7702Authorization,\n recoverPersonalSignature,\n recoverTypedSignature,\n SignTypedDataVersion,\n TypedDataUtils,\n} from '@metamask/eth-sig-util';\nimport { ErrorCode } from '@metamask/hw-wallet-sdk';\nimport type { Keyring } from '@metamask/keyring-utils';\nimport {\n add0x,\n bytesToHex,\n getChecksumAddress,\n Hex,\n hexToNumber,\n isStrictHexString,\n remove0x,\n} from '@metamask/utils';\nimport { Buffer } from 'buffer';\nimport type OldEthJsTransaction from 'ethereumjs-tx';\nimport HDKey from 'hdkey';\n\nimport { createKeyringStateError } from './errors';\nimport {\n AppConfigurationResponse,\n GetAppNameAndVersionResponse,\n LedgerBridge,\n LedgerBridgeOptions,\n} from './ledger-bridge';\nimport { handleLedgerTransportError } from './ledger-error-handler';\n\nconst pathBase = 'm';\nconst hdPathString = `${pathBase}/44'/60'/0'`;\nconst keyringType = 'Ledger Hardware';\n\n// This number causes one of our failing tests to run very slowly, as the for loop needs to iterate 1000 times.\nconst MAX_INDEX = 1000;\n\nenum NetworkApiUrls {\n Ropsten = 'https://api-ropsten.etherscan.io',\n Kovan = 'https://api-kovan.etherscan.io',\n Rinkeby = 'https://api-rinkeby.etherscan.io',\n Mainnet = `https://api.etherscan.io`,\n}\n\ntype SignTransactionPayload = Awaited<\n ReturnType<LedgerBridge<LedgerBridgeOptions>['deviceSignTransaction']>\n>;\n\nexport type AccountPageEntry = {\n address: string;\n balance: number | null;\n index: number;\n};\n\nexport type AccountPage = AccountPageEntry[];\n\nexport type AccountDetails = {\n index?: number;\n bip44?: boolean;\n hdPath?: string;\n};\n\nexport type LedgerBridgeKeyringOptions = {\n hdPath: string;\n accounts: Hex[];\n deviceId: string;\n accountDetails: Readonly<Record<Hex, AccountDetails>>;\n accountIndexes: Readonly<Record<Hex, number>>;\n implementFullBIP44: boolean;\n};\n\nexport type LedgerKeyringSerializedState = Partial<LedgerBridgeKeyringOptions>;\n\n/**\n * Check if the given transaction is made with ethereumjs-tx or @ethereumjs/tx\n *\n * Transactions built with older versions of ethereumjs-tx have a\n * getChainId method that newer versions do not.\n * Older versions are mutable\n * while newer versions default to being immutable.\n * Expected shape and type\n * of data for v, r and s differ (Buffer (old) vs BN (new)).\n *\n * @param tx - Transaction to check, instance of either ethereumjs-tx or @ethereumjs/tx.\n * @returns Returns `true` if tx is an old-style ethereumjs-tx transaction.\n */\nfunction isOldStyleEthereumjsTx(\n tx: TypedTransaction | OldEthJsTransaction,\n): tx is OldEthJsTransaction {\n return 'getChainId' in tx && typeof tx.getChainId === 'function';\n}\n\nexport class LedgerKeyring implements Keyring {\n static type: string = keyringType;\n\n deviceId = '';\n\n readonly type: string = keyringType;\n\n page = 0;\n\n perPage = 5;\n\n unlockedAccount = 0;\n\n accounts: readonly Hex[] = [];\n\n accountDetails: Record<string, AccountDetails> = {};\n\n hdk = new HDKey();\n\n hdPath = hdPathString;\n\n paths: Record<string, number> = {};\n\n network: NetworkApiUrls = NetworkApiUrls.Mainnet;\n\n implementFullBIP44 = false;\n\n bridge: LedgerBridge<LedgerBridgeOptions>;\n\n constructor({ bridge }: { bridge: LedgerBridge<LedgerBridgeOptions> }) {\n if (!bridge) {\n throw new Error('Bridge is a required dependency for the keyring');\n }\n\n this.bridge = bridge;\n }\n\n async init(): Promise<void> {\n return this.bridge.init();\n }\n\n async destroy(): Promise<void> {\n return this.bridge.destroy();\n }\n\n async serialize(): Promise<\n Omit<LedgerKeyringSerializedState, 'accountIndexes'>\n > {\n return {\n hdPath: this.hdPath,\n accounts: this.accounts.slice(),\n deviceId: this.deviceId,\n accountDetails: this.accountDetails,\n implementFullBIP44: false,\n };\n }\n\n async deserialize(opts: LedgerKeyringSerializedState): Promise<void> {\n this.hdPath = opts.hdPath ?? hdPathString;\n this.accounts = opts.accounts ?? [];\n this.deviceId = opts.deviceId ?? '';\n this.accountDetails = opts.accountDetails ?? {};\n\n if (!opts.accountDetails) {\n this.#migrateAccountDetails(opts);\n }\n\n this.implementFullBIP44 = opts.implementFullBIP44 ?? false;\n\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // Remove accounts that don't have corresponding account details\n this.accounts = this.accounts.filter((account) =>\n keys.has(this.#getChecksumHexAddress(account)),\n );\n\n return Promise.resolve();\n }\n\n public setDeviceId(deviceId: string): void {\n this.deviceId = deviceId;\n }\n\n public getDeviceId(): string {\n return this.deviceId;\n }\n\n #migrateAccountDetails(opts: Partial<LedgerBridgeKeyringOptions>): void {\n if (this.#isLedgerLiveHdPath() && opts.accountIndexes) {\n for (const [account, index] of Object.entries(opts.accountIndexes)) {\n this.accountDetails[account] = {\n bip44: true,\n hdPath: this.#getPathForIndex(index),\n };\n }\n }\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // try to migrate non-LedgerLive accounts too\n if (!this.#isLedgerLiveHdPath()) {\n this.accounts.forEach((account) => {\n const key = this.#getChecksumHexAddress(account);\n\n if (!keys.has(key)) {\n this.accountDetails[key] = {\n bip44: false,\n hdPath: this.#pathFromAddress(account),\n };\n }\n });\n }\n }\n\n isUnlocked(): boolean {\n return Boolean(this.hdk.publicKey);\n }\n\n isConnected(): boolean {\n return this.bridge.isDeviceConnected;\n }\n\n setAccountToUnlock(index: number): void {\n this.unlockedAccount = index;\n }\n\n setHdPath(hdPath: string): void {\n // Reset HDKey if the path changes\n if (this.hdPath !== hdPath) {\n this.hdk = new HDKey();\n }\n this.hdPath = hdPath;\n }\n\n async unlock(hdPath?: string, updateHdk = true): Promise<Hex> {\n if (this.isUnlocked() && !hdPath) {\n // if the device is already unlocked and no path is provided,\n // we return the checksummed address of the public key stored in\n // `this.hdk`, which is the root address of the last unlocked path.\n return this.#getChecksumHexAddress(\n bytesToHex(publicToAddress(this.hdk.publicKey, true)),\n );\n }\n const path = hdPath ? this.#toLedgerPath(hdPath) : this.hdPath;\n\n let payload;\n try {\n payload = await this.bridge.getPublicKey({\n hdPath: path,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while unlocking account',\n );\n }\n\n if (updateHdk && payload.chainCode) {\n this.hdk.publicKey = Buffer.from(payload.publicKey, 'hex');\n this.hdk.chainCode = Buffer.from(payload.chainCode, 'hex');\n }\n\n return add0x(payload.address);\n }\n\n async addAccounts(amount: number): Promise<Hex[]> {\n return new Promise((resolve, reject) => {\n this.unlock()\n .then(async (_) => {\n const from = this.unlockedAccount;\n const to = from + amount;\n const newAccounts: Hex[] = [];\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n let address: Hex;\n if (this.#isLedgerLiveHdPath()) {\n address = await this.unlock(path);\n } else {\n address = this.#addressFromIndex(pathBase, i);\n }\n\n this.accountDetails[this.#getChecksumHexAddress(address)] = {\n // TODO: consider renaming this property, as the current name is misleading\n // It's currently used to represent whether an account uses the Ledger Live path.\n bip44: this.#isLedgerLiveHdPath(),\n hdPath: path,\n };\n\n if (!this.accounts.includes(address)) {\n this.accounts = [...this.accounts, address];\n newAccounts.push(address);\n }\n this.page = 0;\n }\n resolve(newAccounts);\n })\n .catch(reject);\n });\n }\n\n getName(): string {\n return keyringType;\n }\n\n async getFirstPage(): Promise<AccountPage> {\n this.page = 0;\n return this.#getPage(1);\n }\n\n async getNextPage(): Promise<AccountPage> {\n return this.#getPage(1);\n }\n\n async getPreviousPage(): Promise<AccountPage> {\n return this.#getPage(-1);\n }\n\n async getAccounts(): Promise<Hex[]> {\n return Promise.resolve(this.accounts.slice());\n }\n\n removeAccount(address: string): void {\n const filteredAccounts = this.accounts.filter(\n (a) => a.toLowerCase() !== address.toLowerCase(),\n );\n\n if (filteredAccounts.length === this.accounts.length) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.accounts = filteredAccounts;\n delete this.accountDetails[this.#getChecksumHexAddress(address)];\n }\n\n async attemptMakeApp(): Promise<boolean> {\n return this.bridge.attemptMakeApp();\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n return this.bridge.updateTransportMethod(transportType);\n }\n\n async getAppNameAndVersion(): Promise<GetAppNameAndVersionResponse> {\n try {\n return await this.bridge.getAppNameAndVersion();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app name and version',\n );\n }\n }\n\n async getAppConfiguration(): Promise<AppConfigurationResponse> {\n try {\n return await this.bridge.getAppConfiguration();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app configuration',\n );\n }\n }\n\n // tx is an instance of the ethereumjs-transaction class.\n async signTransaction(\n address: Hex,\n tx: TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n let rawTxHex;\n // transactions built with older versions of ethereumjs-tx have a\n // getChainId method that newer versions do not. Older versions are mutable\n // while newer versions default to being immutable. Expected shape and type\n // of data for v, r and s differ (Buffer (old) vs BN (new))\n if (isOldStyleEthereumjsTx(tx)) {\n // In this version of ethereumjs-tx we must add the chainId in hex format\n // to the initial v value. The chainId must be included in the serialized\n // transaction which is only communicated to ethereumjs-tx in this\n // value. In newer versions the chainId is communicated via the 'Common'\n // object.\n tx.v = tx.getChainId();\n // @ts-expect-error tx.r should be a Buffer, but we are assigning a string\n tx.r = '0x00';\n // @ts-expect-error tx.s should be a Buffer, but we are assigning a string\n tx.s = '0x00';\n\n rawTxHex = tx.serialize().toString('hex');\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n tx.v = Buffer.from(payload.v, 'hex');\n tx.r = Buffer.from(payload.r, 'hex');\n tx.s = Buffer.from(payload.s, 'hex');\n return tx;\n });\n }\n\n // The below `encode` call is only necessary for legacy transactions, as `getMessageToSign`\n // calls `rlp.encode` internally for non-legacy transactions. As per the \"Transaction Execution\"\n // section of the ethereum yellow paper, transactions need to be \"well-formed RLP, with no additional\n // trailing bytes\".\n\n // Note also that `getMessageToSign` will return valid RLP for all transaction types, whereas the\n // `serialize` method will not for any transaction type except legacy. This is because `serialize` includes\n // empty r, s and v values in the encoded rlp. This is why we use `getMessageToSign` here instead of `serialize`.\n const messageToSign = tx.getMessageToSign();\n\n rawTxHex = Array.isArray(messageToSign)\n ? Buffer.from(RLP.encode(messageToSign)).toString('hex')\n : bytesToHex(messageToSign);\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n // Because tx will be immutable, first get a plain javascript object that\n // represents the transaction. Using txData here as it aligns with the\n // nomenclature of ethereumjs/tx.\n const txData: TypedTxData = tx.toJSON();\n // The fromTxData utility expects a type to support transactions with a type other than 0\n txData.type = tx.type;\n // The fromTxData utility expects v,r and s to be hex prefixed\n txData.v = add0x(payload.v);\n txData.r = add0x(payload.r);\n txData.s = add0x(payload.s);\n // Adopt the 'common' option from the original transaction and set the\n // returned object to be frozen if the original is frozen.\n return TransactionFactory.fromTxData(txData, {\n common: tx.common,\n freeze: Object.isFrozen(tx),\n });\n });\n }\n\n async #signTransaction(\n address: Hex,\n rawTxHex: string,\n handleSigning: (\n payload: SignTransactionPayload,\n ) => TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n const hdPath = await this.unlockAccountByAddress(address);\n\n if (!hdPath) {\n throw new Error('Ledger: hdPath is empty while signing transaction');\n }\n\n let payload;\n\n try {\n payload = await this.bridge.deviceSignTransaction({\n tx: remove0x(rawTxHex),\n hdPath,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing transaction',\n );\n }\n\n const newOrMutatedTx = handleSigning(payload);\n const valid = newOrMutatedTx.verifySignature();\n if (valid) {\n return newOrMutatedTx;\n }\n throw new Error('Ledger: The transaction signature is not valid');\n }\n\n async signMessage(withAccount: Hex, data: string): Promise<string> {\n return this.signPersonalMessage(withAccount, data);\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n withAccount: Hex,\n message: string,\n ): Promise<string> {\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignMessage({\n hdPath,\n message: remove0x(message),\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const modifiedV = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n\n const signature = `0x${payload.r}${payload.s}${modifiedV}`;\n const addressSignedWith = recoverPersonalSignature({\n data: message,\n signature,\n });\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async unlockAccountByAddress(address: Hex): Promise<string | undefined> {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n const accountDetails = this.accountDetails[checksummedAddress];\n if (!accountDetails) {\n throw new Error(\n `Ledger: Account for address '${checksummedAddress}' not found`,\n );\n }\n const { hdPath } = accountDetails;\n const unlockedAddress = await this.unlock(hdPath, false);\n\n // unlock resolves to the address for the given hdPath as reported by the ledger device\n // if that address is not the requested address, then this account belongs to a different device or seed\n if (unlockedAddress.toLowerCase() !== address.toLowerCase()) {\n throw new Error(\n `Ledger: Account ${address} does not belong to the connected device`,\n );\n }\n return hdPath;\n }\n\n async signTypedData<\n Version extends SignTypedDataVersion.V4,\n Types extends MessageTypes,\n Options extends { version?: Version },\n >(\n withAccount: Hex,\n data: TypedMessage<Types>,\n options?: Options,\n ): Promise<string> {\n const { version } = options ?? {};\n const isV4 = version === 'V4';\n if (!isV4) {\n throw createKeyringStateError(ErrorCode.DeviceStateOnlyV4Supported);\n }\n\n const { domain, types, primaryType, message } =\n TypedDataUtils.sanitizeData(data);\n\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignTypedData({\n hdPath,\n message: {\n domain: {\n name: domain.name,\n chainId: domain.chainId,\n version: domain.version,\n verifyingContract: domain.verifyingContract,\n salt:\n domain.salt instanceof ArrayBuffer\n ? Buffer.from(domain.salt).toString('hex')\n : domain.salt,\n },\n types,\n primaryType: primaryType.toString(),\n message,\n },\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const recoveryId = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${recoveryId}`;\n const addressSignedWith = recoverTypedSignature({\n data,\n signature,\n version: SignTypedDataVersion.V4,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async signEip7702Authorization(\n withAccount: Hex,\n authorization: [chainId: number, contractAddress: Hex, nonce: number],\n ): Promise<string> {\n const [chainId, contractAddress, nonce] = authorization;\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error(\n 'Ledger: Missing hdPath while signing EIP-7702 authorization',\n );\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignDelegationAuthorization({\n hdPath,\n chainId,\n contractAddress: remove0x(contractAddress),\n nonce,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Error while signing EIP-7702 authorization',\n );\n }\n\n // EIP-7702 authorization signatures use yParity (0 or 1), unlike\n // EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n const yParity = this.#normalizeYParity(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${yParity}`;\n\n const addressSignedWith = recoverEIP7702Authorization({\n signature,\n authorization,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error(\n 'Ledger: The EIP-7702 authorization signature does not match the right address',\n );\n }\n return signature;\n }\n\n forgetDevice(): void {\n this.deviceId = '';\n this.accounts = [];\n this.page = 0;\n this.unlockedAccount = 0;\n this.paths = {};\n this.accountDetails = {};\n this.hdk = new HDKey();\n }\n\n /* PRIVATE METHODS */\n async #getPage(increment: number): Promise<AccountPage> {\n this.page += increment;\n\n if (this.page <= 0) {\n this.page = 1;\n }\n const from = (this.page - 1) * this.perPage;\n const to = from + this.perPage;\n\n await this.unlock();\n let accounts;\n if (this.#isLedgerLiveHdPath()) {\n accounts = await this.#getAccountsBIP44(from, to);\n } else {\n accounts = this.#getAccountsLegacy(from, to);\n }\n return accounts;\n }\n\n async #getAccountsBIP44(from: number, to: number): Promise<AccountPage> {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n const address = await this.unlock(path);\n const valid = this.implementFullBIP44\n ? await this.#hasPreviousTransactions(address)\n : true;\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n\n // PER BIP44\n // \"Software should prevent a creation of an account if\n // a previous account does not have a transaction history\n // (meaning none of its addresses have been used before).\"\n if (!valid) {\n break;\n }\n }\n return accounts;\n }\n\n #getAccountsLegacy(from: number, to: number): AccountPage {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const address = this.#addressFromIndex(pathBase, i);\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n this.paths[this.#getChecksumHexAddress(address)] = i;\n }\n return accounts;\n }\n\n #addressFromIndex(basePath: string, i: number): Hex {\n const dkey = this.hdk.derive(`${basePath}/${i}`);\n const address = bytesToHex(publicToAddress(dkey.publicKey, true));\n return this.#getChecksumHexAddress(address);\n }\n\n #pathFromAddress(address: string): string {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n let index = this.paths[checksummedAddress];\n if (typeof index === 'undefined') {\n for (let i = 0; i < MAX_INDEX; i++) {\n if (checksummedAddress === this.#addressFromIndex(pathBase, i)) {\n index = i;\n break;\n }\n }\n }\n\n if (typeof index === 'undefined') {\n throw new Error('Unknown address');\n }\n return this.#getPathForIndex(index);\n }\n\n #getPathForIndex(index: number): string {\n // Check if the path is BIP 44 (Ledger Live)\n return this.#isLedgerLiveHdPath()\n ? `m/44'/60'/${index}'/0/0`\n : `${this.hdPath}/${index}`;\n }\n\n #isLedgerLiveHdPath(): boolean {\n return this.hdPath === `m/44'/60'/0'/0/0`;\n }\n\n #toLedgerPath(path: string): string {\n return path.toString().replace('m/', '');\n }\n\n async #hasPreviousTransactions(address: string): Promise<boolean> {\n const apiUrl = this.#getApiUrl();\n const response = await window.fetch(\n `${apiUrl}/api?module=account&action=txlist&address=${address}&tag=latest&page=1&offset=1`,\n );\n const parsedResponse = await response.json();\n return parsedResponse.status !== '0' && parsedResponse.result.length > 0;\n }\n\n #getApiUrl(): NetworkApiUrls {\n return this.network;\n }\n\n #getChecksumHexAddress(address: string): Hex {\n return getChecksumAddress(add0x(address));\n }\n\n /**\n * Parses the recovery parameter (`v`) returned by a Ledger device.\n * Ledger may return `v` as a number, a `0x`-prefixed hex string, a bare hex\n * string (e.g. `'1b'` for 27), or a decimal string.\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The recovery parameter as a number.\n */\n #parseLedgerRecoveryParam(recoveryParam: string | number): number {\n if (typeof recoveryParam === 'number') {\n return recoveryParam;\n }\n\n const value = String(recoveryParam).trim();\n\n if (value.startsWith('0x') || value.startsWith('0X')) {\n if (!isStrictHexString(value)) {\n throw new Error(`Invalid hex recovery parameter: \"${recoveryParam}\"`);\n }\n return hexToNumber(value);\n }\n\n // If the string contains hex letters (a-f), interpret it as hex;\n // otherwise interpret it as a regular decimal number.\n const radix = /[a-f]/iu.test(value) ? 16 : 10;\n const result = parseInt(value, radix);\n\n if (Number.isNaN(result)) {\n throw new Error(`Invalid recovery parameter: \"${recoveryParam}\"`);\n }\n\n return result;\n }\n\n /**\n * Normalizes the signature recovery parameter (v) to legacy format.\n * Ledger devices may return v as 0 or 1 (modern format), but signature\n * recovery expects 27 or 28 (legacy format per EIP-191/EIP-712).\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The normalized recovery parameter as a hex string.\n */\n #normalizeRecoveryParam(recoveryParam: number): string {\n if (recoveryParam === 0 || recoveryParam === 1) {\n return (recoveryParam + 27).toString(16);\n }\n return recoveryParam.toString(16);\n }\n\n /**\n * Normalizes the signature recovery parameter (`v`) to yParity format and\n * returns it as a 2-character hex string suitable for appending to a signature.\n *\n * Ledger devices may return `v` as 0/1 (yParity) or 27/28 (legacy). EIP-7702\n * authorization signatures require the yParity value (0 or 1), unlike\n * EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n *\n * @param recoveryParam - The parsed recovery parameter from Ledger.\n * @returns The yParity as a 2-character lowercase hex string ('00' or '01').\n */\n #normalizeYParity(recoveryParam: number): string {\n const yParity =\n recoveryParam === 0 || recoveryParam === 1\n ? recoveryParam\n : recoveryParam - 27;\n return yParity.toString(16).padStart(2, '0');\n }\n}\n"]}
1
+ {"version":3,"file":"ledger-keyring.cjs","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { RLP } from '@ethereumjs/rlp';\nimport { TransactionFactory, TypedTxData } from '@ethereumjs/tx';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { publicToAddress } from '@ethereumjs/util';\nimport type { MessageTypes, TypedMessage } from '@metamask/eth-sig-util';\nimport {\n recoverEIP7702Authorization,\n recoverPersonalSignature,\n recoverTypedSignature,\n SignTypedDataVersion,\n TypedDataUtils,\n} from '@metamask/eth-sig-util';\nimport type { Keyring } from '@metamask/keyring-utils';\nimport {\n add0x,\n bytesToHex,\n getChecksumAddress,\n Hex,\n hexToNumber,\n isStrictHexString,\n remove0x,\n} from '@metamask/utils';\nimport { Buffer } from 'buffer';\nimport type OldEthJsTransaction from 'ethereumjs-tx';\nimport HDKey from 'hdkey';\n\nimport {\n AppConfigurationResponse,\n GetAppNameAndVersionResponse,\n LedgerBridge,\n LedgerBridgeOptions,\n} from './ledger-bridge';\nimport { handleLedgerTransportError } from './ledger-error-handler';\n\nconst pathBase = 'm';\nconst hdPathString = `${pathBase}/44'/60'/0'`;\nconst keyringType = 'Ledger Hardware';\n\n// This number causes one of our failing tests to run very slowly, as the for loop needs to iterate 1000 times.\nconst MAX_INDEX = 1000;\n\nenum NetworkApiUrls {\n Ropsten = 'https://api-ropsten.etherscan.io',\n Kovan = 'https://api-kovan.etherscan.io',\n Rinkeby = 'https://api-rinkeby.etherscan.io',\n Mainnet = `https://api.etherscan.io`,\n}\n\ntype SignTransactionPayload = Awaited<\n ReturnType<LedgerBridge<LedgerBridgeOptions>['deviceSignTransaction']>\n>;\n\nexport type AccountPageEntry = {\n address: string;\n balance: number | null;\n index: number;\n};\n\nexport type AccountPage = AccountPageEntry[];\n\nexport type AccountDetails = {\n index?: number;\n bip44?: boolean;\n hdPath?: string;\n};\n\nexport type LedgerBridgeKeyringOptions = {\n hdPath: string;\n accounts: Hex[];\n deviceId: string;\n accountDetails: Readonly<Record<Hex, AccountDetails>>;\n accountIndexes: Readonly<Record<Hex, number>>;\n implementFullBIP44: boolean;\n};\n\nexport type LedgerKeyringSerializedState = Partial<LedgerBridgeKeyringOptions>;\n\n/**\n * Check if the given transaction is made with ethereumjs-tx or @ethereumjs/tx\n *\n * Transactions built with older versions of ethereumjs-tx have a\n * getChainId method that newer versions do not.\n * Older versions are mutable\n * while newer versions default to being immutable.\n * Expected shape and type\n * of data for v, r and s differ (Buffer (old) vs BN (new)).\n *\n * @param tx - Transaction to check, instance of either ethereumjs-tx or @ethereumjs/tx.\n * @returns Returns `true` if tx is an old-style ethereumjs-tx transaction.\n */\nfunction isOldStyleEthereumjsTx(\n tx: TypedTransaction | OldEthJsTransaction,\n): tx is OldEthJsTransaction {\n return 'getChainId' in tx && typeof tx.getChainId === 'function';\n}\n\nexport class LedgerKeyring implements Keyring {\n static type: string = keyringType;\n\n deviceId = '';\n\n readonly type: string = keyringType;\n\n page = 0;\n\n perPage = 5;\n\n unlockedAccount = 0;\n\n accounts: readonly Hex[] = [];\n\n accountDetails: Record<string, AccountDetails> = {};\n\n hdk = new HDKey();\n\n hdPath = hdPathString;\n\n paths: Record<string, number> = {};\n\n network: NetworkApiUrls = NetworkApiUrls.Mainnet;\n\n implementFullBIP44 = false;\n\n bridge: LedgerBridge<LedgerBridgeOptions>;\n\n constructor({ bridge }: { bridge: LedgerBridge<LedgerBridgeOptions> }) {\n if (!bridge) {\n throw new Error('Bridge is a required dependency for the keyring');\n }\n\n this.bridge = bridge;\n }\n\n async init(): Promise<void> {\n return this.bridge.init();\n }\n\n async destroy(): Promise<void> {\n return this.bridge.destroy();\n }\n\n async serialize(): Promise<\n Omit<LedgerKeyringSerializedState, 'accountIndexes'>\n > {\n return {\n hdPath: this.hdPath,\n accounts: this.accounts.slice(),\n deviceId: this.deviceId,\n accountDetails: this.accountDetails,\n implementFullBIP44: false,\n };\n }\n\n async deserialize(opts: LedgerKeyringSerializedState): Promise<void> {\n this.hdPath = opts.hdPath ?? hdPathString;\n this.accounts = opts.accounts ?? [];\n this.deviceId = opts.deviceId ?? '';\n this.accountDetails = opts.accountDetails ?? {};\n\n if (!opts.accountDetails) {\n this.#migrateAccountDetails(opts);\n }\n\n this.implementFullBIP44 = opts.implementFullBIP44 ?? false;\n\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // Remove accounts that don't have corresponding account details\n this.accounts = this.accounts.filter((account) =>\n keys.has(this.#getChecksumHexAddress(account)),\n );\n\n return Promise.resolve();\n }\n\n public setDeviceId(deviceId: string): void {\n this.deviceId = deviceId;\n }\n\n public getDeviceId(): string {\n return this.deviceId;\n }\n\n #migrateAccountDetails(opts: Partial<LedgerBridgeKeyringOptions>): void {\n if (this.#isLedgerLiveHdPath() && opts.accountIndexes) {\n for (const [account, index] of Object.entries(opts.accountIndexes)) {\n this.accountDetails[account] = {\n bip44: true,\n hdPath: this.#getPathForIndex(index),\n };\n }\n }\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // try to migrate non-LedgerLive accounts too\n if (!this.#isLedgerLiveHdPath()) {\n this.accounts.forEach((account) => {\n const key = this.#getChecksumHexAddress(account);\n\n if (!keys.has(key)) {\n this.accountDetails[key] = {\n bip44: false,\n hdPath: this.#pathFromAddress(account),\n };\n }\n });\n }\n }\n\n isUnlocked(): boolean {\n return Boolean(this.hdk.publicKey);\n }\n\n isConnected(): boolean {\n return this.bridge.isDeviceConnected;\n }\n\n setAccountToUnlock(index: number): void {\n this.unlockedAccount = index;\n }\n\n setHdPath(hdPath: string): void {\n // Reset HDKey if the path changes\n if (this.hdPath !== hdPath) {\n this.hdk = new HDKey();\n }\n this.hdPath = hdPath;\n }\n\n async unlock(hdPath?: string, updateHdk = true): Promise<Hex> {\n if (this.isUnlocked() && !hdPath) {\n // if the device is already unlocked and no path is provided,\n // we return the checksummed address of the public key stored in\n // `this.hdk`, which is the root address of the last unlocked path.\n return this.#getChecksumHexAddress(\n bytesToHex(publicToAddress(this.hdk.publicKey, true)),\n );\n }\n const path = hdPath ? this.#toLedgerPath(hdPath) : this.hdPath;\n\n let payload;\n try {\n payload = await this.bridge.getPublicKey({\n hdPath: path,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while unlocking account',\n );\n }\n\n if (updateHdk && payload.chainCode) {\n this.hdk.publicKey = Buffer.from(payload.publicKey, 'hex');\n this.hdk.chainCode = Buffer.from(payload.chainCode, 'hex');\n }\n\n return add0x(payload.address);\n }\n\n async addAccounts(amount: number): Promise<Hex[]> {\n return new Promise((resolve, reject) => {\n this.unlock()\n .then(async (_) => {\n const from = this.unlockedAccount;\n const to = from + amount;\n const newAccounts: Hex[] = [];\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n let address: Hex;\n if (this.#isLedgerLiveHdPath()) {\n address = await this.unlock(path);\n } else {\n address = this.#addressFromIndex(pathBase, i);\n }\n\n this.accountDetails[this.#getChecksumHexAddress(address)] = {\n // TODO: consider renaming this property, as the current name is misleading\n // It's currently used to represent whether an account uses the Ledger Live path.\n bip44: this.#isLedgerLiveHdPath(),\n hdPath: path,\n };\n\n if (!this.accounts.includes(address)) {\n this.accounts = [...this.accounts, address];\n newAccounts.push(address);\n }\n this.page = 0;\n }\n resolve(newAccounts);\n })\n .catch(reject);\n });\n }\n\n getName(): string {\n return keyringType;\n }\n\n async getFirstPage(): Promise<AccountPage> {\n this.page = 0;\n return this.#getPage(1);\n }\n\n async getNextPage(): Promise<AccountPage> {\n return this.#getPage(1);\n }\n\n async getPreviousPage(): Promise<AccountPage> {\n return this.#getPage(-1);\n }\n\n async getAccounts(): Promise<Hex[]> {\n return Promise.resolve(this.accounts.slice());\n }\n\n removeAccount(address: string): void {\n const filteredAccounts = this.accounts.filter(\n (a) => a.toLowerCase() !== address.toLowerCase(),\n );\n\n if (filteredAccounts.length === this.accounts.length) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.accounts = filteredAccounts;\n delete this.accountDetails[this.#getChecksumHexAddress(address)];\n }\n\n async attemptMakeApp(): Promise<boolean> {\n return this.bridge.attemptMakeApp();\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n return this.bridge.updateTransportMethod(transportType);\n }\n\n async getAppNameAndVersion(): Promise<GetAppNameAndVersionResponse> {\n try {\n return await this.bridge.getAppNameAndVersion();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app name and version',\n );\n }\n }\n\n async getAppConfiguration(): Promise<AppConfigurationResponse> {\n try {\n return await this.bridge.getAppConfiguration();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app configuration',\n );\n }\n }\n\n // tx is an instance of the ethereumjs-transaction class.\n async signTransaction(\n address: Hex,\n tx: TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n let rawTxHex;\n // transactions built with older versions of ethereumjs-tx have a\n // getChainId method that newer versions do not. Older versions are mutable\n // while newer versions default to being immutable. Expected shape and type\n // of data for v, r and s differ (Buffer (old) vs BN (new))\n if (isOldStyleEthereumjsTx(tx)) {\n // In this version of ethereumjs-tx we must add the chainId in hex format\n // to the initial v value. The chainId must be included in the serialized\n // transaction which is only communicated to ethereumjs-tx in this\n // value. In newer versions the chainId is communicated via the 'Common'\n // object.\n tx.v = tx.getChainId();\n // @ts-expect-error tx.r should be a Buffer, but we are assigning a string\n tx.r = '0x00';\n // @ts-expect-error tx.s should be a Buffer, but we are assigning a string\n tx.s = '0x00';\n\n rawTxHex = tx.serialize().toString('hex');\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n tx.v = Buffer.from(payload.v, 'hex');\n tx.r = Buffer.from(payload.r, 'hex');\n tx.s = Buffer.from(payload.s, 'hex');\n return tx;\n });\n }\n\n // The below `encode` call is only necessary for legacy transactions, as `getMessageToSign`\n // calls `rlp.encode` internally for non-legacy transactions. As per the \"Transaction Execution\"\n // section of the ethereum yellow paper, transactions need to be \"well-formed RLP, with no additional\n // trailing bytes\".\n\n // Note also that `getMessageToSign` will return valid RLP for all transaction types, whereas the\n // `serialize` method will not for any transaction type except legacy. This is because `serialize` includes\n // empty r, s and v values in the encoded rlp. This is why we use `getMessageToSign` here instead of `serialize`.\n const messageToSign = tx.getMessageToSign();\n\n rawTxHex = Array.isArray(messageToSign)\n ? Buffer.from(RLP.encode(messageToSign)).toString('hex')\n : bytesToHex(messageToSign);\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n // Because tx will be immutable, first get a plain javascript object that\n // represents the transaction. Using txData here as it aligns with the\n // nomenclature of ethereumjs/tx.\n const txData: TypedTxData = tx.toJSON();\n // The fromTxData utility expects a type to support transactions with a type other than 0\n txData.type = tx.type;\n // The fromTxData utility expects v,r and s to be hex prefixed\n txData.v = add0x(payload.v);\n txData.r = add0x(payload.r);\n txData.s = add0x(payload.s);\n // Adopt the 'common' option from the original transaction and set the\n // returned object to be frozen if the original is frozen.\n return TransactionFactory.fromTxData(txData, {\n common: tx.common,\n freeze: Object.isFrozen(tx),\n });\n });\n }\n\n async #signTransaction(\n address: Hex,\n rawTxHex: string,\n handleSigning: (\n payload: SignTransactionPayload,\n ) => TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n const hdPath = await this.unlockAccountByAddress(address);\n\n if (!hdPath) {\n throw new Error('Ledger: hdPath is empty while signing transaction');\n }\n\n let payload;\n\n try {\n payload = await this.bridge.deviceSignTransaction({\n tx: remove0x(rawTxHex),\n hdPath,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing transaction',\n );\n }\n\n const newOrMutatedTx = handleSigning(payload);\n const valid = newOrMutatedTx.verifySignature();\n if (valid) {\n return newOrMutatedTx;\n }\n throw new Error('Ledger: The transaction signature is not valid');\n }\n\n async signMessage(withAccount: Hex, data: string): Promise<string> {\n return this.signPersonalMessage(withAccount, data);\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n withAccount: Hex,\n message: string,\n ): Promise<string> {\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignMessage({\n hdPath,\n message: remove0x(message),\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const modifiedV = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n\n const signature = `0x${payload.r}${payload.s}${modifiedV}`;\n const addressSignedWith = recoverPersonalSignature({\n data: message,\n signature,\n });\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async unlockAccountByAddress(address: Hex): Promise<string | undefined> {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n const accountDetails = this.accountDetails[checksummedAddress];\n if (!accountDetails) {\n throw new Error(\n `Ledger: Account for address '${checksummedAddress}' not found`,\n );\n }\n const { hdPath } = accountDetails;\n const unlockedAddress = await this.unlock(hdPath, false);\n\n // unlock resolves to the address for the given hdPath as reported by the ledger device\n // if that address is not the requested address, then this account belongs to a different device or seed\n if (unlockedAddress.toLowerCase() !== address.toLowerCase()) {\n throw new Error(\n `Ledger: Account ${address} does not belong to the connected device`,\n );\n }\n return hdPath;\n }\n\n async signTypedData<\n Version extends SignTypedDataVersion.V4,\n Types extends MessageTypes,\n Options extends { version?: Version },\n >(\n withAccount: Hex,\n data: TypedMessage<Types>,\n options?: Options,\n ): Promise<string> {\n const { version } = options ?? {};\n const isV4 = version === 'V4';\n if (!isV4) {\n throw new Error(\n 'Ledger: Only version 4 of typed data signing is supported',\n );\n }\n\n const { domain, types, primaryType, message } =\n TypedDataUtils.sanitizeData(data);\n\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignTypedData({\n hdPath,\n message: {\n domain: {\n name: domain.name,\n chainId: domain.chainId,\n version: domain.version,\n verifyingContract: domain.verifyingContract,\n salt:\n domain.salt instanceof ArrayBuffer\n ? Buffer.from(domain.salt).toString('hex')\n : domain.salt,\n },\n types,\n primaryType: primaryType.toString(),\n message,\n },\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const recoveryId = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${recoveryId}`;\n const addressSignedWith = recoverTypedSignature({\n data,\n signature,\n version: SignTypedDataVersion.V4,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async signEip7702Authorization(\n withAccount: Hex,\n authorization: [chainId: number, contractAddress: Hex, nonce: number],\n ): Promise<string> {\n const [chainId, contractAddress, nonce] = authorization;\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error(\n 'Ledger: Missing hdPath while signing EIP-7702 authorization',\n );\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignDelegationAuthorization({\n hdPath,\n chainId,\n contractAddress: remove0x(contractAddress),\n nonce,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Error while signing EIP-7702 authorization',\n );\n }\n\n // EIP-7702 authorization signatures use yParity (0 or 1), unlike\n // EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n const yParity = this.#normalizeYParity(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${yParity}`;\n\n const addressSignedWith = recoverEIP7702Authorization({\n signature,\n authorization,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error(\n 'Ledger: The EIP-7702 authorization signature does not match the right address',\n );\n }\n return signature;\n }\n\n forgetDevice(): void {\n this.deviceId = '';\n this.accounts = [];\n this.page = 0;\n this.unlockedAccount = 0;\n this.paths = {};\n this.accountDetails = {};\n this.hdk = new HDKey();\n }\n\n /* PRIVATE METHODS */\n async #getPage(increment: number): Promise<AccountPage> {\n this.page += increment;\n\n if (this.page <= 0) {\n this.page = 1;\n }\n const from = (this.page - 1) * this.perPage;\n const to = from + this.perPage;\n\n await this.unlock();\n let accounts;\n if (this.#isLedgerLiveHdPath()) {\n accounts = await this.#getAccountsBIP44(from, to);\n } else {\n accounts = this.#getAccountsLegacy(from, to);\n }\n return accounts;\n }\n\n async #getAccountsBIP44(from: number, to: number): Promise<AccountPage> {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n const address = await this.unlock(path);\n const valid = this.implementFullBIP44\n ? await this.#hasPreviousTransactions(address)\n : true;\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n\n // PER BIP44\n // \"Software should prevent a creation of an account if\n // a previous account does not have a transaction history\n // (meaning none of its addresses have been used before).\"\n if (!valid) {\n break;\n }\n }\n return accounts;\n }\n\n #getAccountsLegacy(from: number, to: number): AccountPage {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const address = this.#addressFromIndex(pathBase, i);\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n this.paths[this.#getChecksumHexAddress(address)] = i;\n }\n return accounts;\n }\n\n #addressFromIndex(basePath: string, i: number): Hex {\n const dkey = this.hdk.derive(`${basePath}/${i}`);\n const address = bytesToHex(publicToAddress(dkey.publicKey, true));\n return this.#getChecksumHexAddress(address);\n }\n\n #pathFromAddress(address: string): string {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n let index = this.paths[checksummedAddress];\n if (typeof index === 'undefined') {\n for (let i = 0; i < MAX_INDEX; i++) {\n if (checksummedAddress === this.#addressFromIndex(pathBase, i)) {\n index = i;\n break;\n }\n }\n }\n\n if (typeof index === 'undefined') {\n throw new Error('Unknown address');\n }\n return this.#getPathForIndex(index);\n }\n\n #getPathForIndex(index: number): string {\n // Check if the path is BIP 44 (Ledger Live)\n return this.#isLedgerLiveHdPath()\n ? `m/44'/60'/${index}'/0/0`\n : `${this.hdPath}/${index}`;\n }\n\n #isLedgerLiveHdPath(): boolean {\n return this.hdPath === `m/44'/60'/0'/0/0`;\n }\n\n #toLedgerPath(path: string): string {\n return path.toString().replace('m/', '');\n }\n\n async #hasPreviousTransactions(address: string): Promise<boolean> {\n const apiUrl = this.#getApiUrl();\n const response = await window.fetch(\n `${apiUrl}/api?module=account&action=txlist&address=${address}&tag=latest&page=1&offset=1`,\n );\n const parsedResponse = await response.json();\n return parsedResponse.status !== '0' && parsedResponse.result.length > 0;\n }\n\n #getApiUrl(): NetworkApiUrls {\n return this.network;\n }\n\n #getChecksumHexAddress(address: string): Hex {\n return getChecksumAddress(add0x(address));\n }\n\n /**\n * Parses the recovery parameter (`v`) returned by a Ledger device.\n * Ledger may return `v` as a number, a `0x`-prefixed hex string, a bare hex\n * string (e.g. `'1b'` for 27), or a decimal string.\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The recovery parameter as a number.\n */\n #parseLedgerRecoveryParam(recoveryParam: string | number): number {\n if (typeof recoveryParam === 'number') {\n return recoveryParam;\n }\n\n const value = String(recoveryParam).trim();\n\n if (value.startsWith('0x') || value.startsWith('0X')) {\n if (!isStrictHexString(value)) {\n throw new Error(`Invalid hex recovery parameter: \"${recoveryParam}\"`);\n }\n return hexToNumber(value);\n }\n\n // If the string contains hex letters (a-f), interpret it as hex;\n // otherwise interpret it as a regular decimal number.\n const radix = /[a-f]/iu.test(value) ? 16 : 10;\n const result = parseInt(value, radix);\n\n if (Number.isNaN(result)) {\n throw new Error(`Invalid recovery parameter: \"${recoveryParam}\"`);\n }\n\n return result;\n }\n\n /**\n * Normalizes the signature recovery parameter (v) to legacy format.\n * Ledger devices may return v as 0 or 1 (modern format), but signature\n * recovery expects 27 or 28 (legacy format per EIP-191/EIP-712).\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The normalized recovery parameter as a hex string.\n */\n #normalizeRecoveryParam(recoveryParam: number): string {\n if (recoveryParam === 0 || recoveryParam === 1) {\n return (recoveryParam + 27).toString(16);\n }\n return recoveryParam.toString(16);\n }\n\n /**\n * Normalizes the signature recovery parameter (`v`) to yParity format and\n * returns it as a 2-character hex string suitable for appending to a signature.\n *\n * Ledger devices may return `v` as 0/1 (yParity) or 27/28 (legacy). EIP-7702\n * authorization signatures require the yParity value (0 or 1), unlike\n * EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n *\n * @param recoveryParam - The parsed recovery parameter from Ledger.\n * @returns The yParity as a 2-character lowercase hex string ('00' or '01').\n */\n #normalizeYParity(recoveryParam: number): string {\n const yParity =\n recoveryParam === 0 || recoveryParam === 1\n ? recoveryParam\n : recoveryParam - 27;\n return yParity.toString(16).padStart(2, '0');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-keyring.d.cts","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-keyring.d.cts","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-keyring.d.mts","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-keyring.d.mts","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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"}
@@ -14,12 +14,10 @@ import { RLP } from "@ethereumjs/rlp";
14
14
  import { TransactionFactory } from "@ethereumjs/tx";
15
15
  import { publicToAddress } from "@ethereumjs/util";
16
16
  import { recoverEIP7702Authorization, recoverPersonalSignature, recoverTypedSignature, SignTypedDataVersion, TypedDataUtils } from "@metamask/eth-sig-util";
17
- import { ErrorCode } from "@metamask/hw-wallet-sdk";
18
17
  import { add0x, bytesToHex, getChecksumAddress, hexToNumber, isStrictHexString, remove0x } from "@metamask/utils";
19
18
  import { Buffer } from "buffer";
20
19
  import $HDKey from "hdkey";
21
20
  const HDKey = $importDefault($HDKey);
22
- import { createKeyringStateError } from "./errors.mjs";
23
21
  import { handleLedgerTransportError } from "./ledger-error-handler.mjs";
24
22
  const pathBase = 'm';
25
23
  const hdPathString = `${pathBase}/44'/60'/0'`;
@@ -328,7 +326,7 @@ export class LedgerKeyring {
328
326
  const { version } = options ?? {};
329
327
  const isV4 = version === 'V4';
330
328
  if (!isV4) {
331
- throw createKeyringStateError(ErrorCode.DeviceStateOnlyV4Supported);
329
+ throw new Error('Ledger: Only version 4 of typed data signing is supported');
332
330
  }
333
331
  const { domain, types, primaryType, message } = TypedDataUtils.sanitizeData(data);
334
332
  const hdPath = await this.unlockAccountByAddress(withAccount);
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-keyring.mjs","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { RLP } from '@ethereumjs/rlp';\nimport { TransactionFactory, TypedTxData } from '@ethereumjs/tx';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { publicToAddress } from '@ethereumjs/util';\nimport type { MessageTypes, TypedMessage } from '@metamask/eth-sig-util';\nimport {\n recoverEIP7702Authorization,\n recoverPersonalSignature,\n recoverTypedSignature,\n SignTypedDataVersion,\n TypedDataUtils,\n} from '@metamask/eth-sig-util';\nimport { ErrorCode } from '@metamask/hw-wallet-sdk';\nimport type { Keyring } from '@metamask/keyring-utils';\nimport {\n add0x,\n bytesToHex,\n getChecksumAddress,\n Hex,\n hexToNumber,\n isStrictHexString,\n remove0x,\n} from '@metamask/utils';\nimport { Buffer } from 'buffer';\nimport type OldEthJsTransaction from 'ethereumjs-tx';\nimport HDKey from 'hdkey';\n\nimport { createKeyringStateError } from './errors';\nimport {\n AppConfigurationResponse,\n GetAppNameAndVersionResponse,\n LedgerBridge,\n LedgerBridgeOptions,\n} from './ledger-bridge';\nimport { handleLedgerTransportError } from './ledger-error-handler';\n\nconst pathBase = 'm';\nconst hdPathString = `${pathBase}/44'/60'/0'`;\nconst keyringType = 'Ledger Hardware';\n\n// This number causes one of our failing tests to run very slowly, as the for loop needs to iterate 1000 times.\nconst MAX_INDEX = 1000;\n\nenum NetworkApiUrls {\n Ropsten = 'https://api-ropsten.etherscan.io',\n Kovan = 'https://api-kovan.etherscan.io',\n Rinkeby = 'https://api-rinkeby.etherscan.io',\n Mainnet = `https://api.etherscan.io`,\n}\n\ntype SignTransactionPayload = Awaited<\n ReturnType<LedgerBridge<LedgerBridgeOptions>['deviceSignTransaction']>\n>;\n\nexport type AccountPageEntry = {\n address: string;\n balance: number | null;\n index: number;\n};\n\nexport type AccountPage = AccountPageEntry[];\n\nexport type AccountDetails = {\n index?: number;\n bip44?: boolean;\n hdPath?: string;\n};\n\nexport type LedgerBridgeKeyringOptions = {\n hdPath: string;\n accounts: Hex[];\n deviceId: string;\n accountDetails: Readonly<Record<Hex, AccountDetails>>;\n accountIndexes: Readonly<Record<Hex, number>>;\n implementFullBIP44: boolean;\n};\n\nexport type LedgerKeyringSerializedState = Partial<LedgerBridgeKeyringOptions>;\n\n/**\n * Check if the given transaction is made with ethereumjs-tx or @ethereumjs/tx\n *\n * Transactions built with older versions of ethereumjs-tx have a\n * getChainId method that newer versions do not.\n * Older versions are mutable\n * while newer versions default to being immutable.\n * Expected shape and type\n * of data for v, r and s differ (Buffer (old) vs BN (new)).\n *\n * @param tx - Transaction to check, instance of either ethereumjs-tx or @ethereumjs/tx.\n * @returns Returns `true` if tx is an old-style ethereumjs-tx transaction.\n */\nfunction isOldStyleEthereumjsTx(\n tx: TypedTransaction | OldEthJsTransaction,\n): tx is OldEthJsTransaction {\n return 'getChainId' in tx && typeof tx.getChainId === 'function';\n}\n\nexport class LedgerKeyring implements Keyring {\n static type: string = keyringType;\n\n deviceId = '';\n\n readonly type: string = keyringType;\n\n page = 0;\n\n perPage = 5;\n\n unlockedAccount = 0;\n\n accounts: readonly Hex[] = [];\n\n accountDetails: Record<string, AccountDetails> = {};\n\n hdk = new HDKey();\n\n hdPath = hdPathString;\n\n paths: Record<string, number> = {};\n\n network: NetworkApiUrls = NetworkApiUrls.Mainnet;\n\n implementFullBIP44 = false;\n\n bridge: LedgerBridge<LedgerBridgeOptions>;\n\n constructor({ bridge }: { bridge: LedgerBridge<LedgerBridgeOptions> }) {\n if (!bridge) {\n throw new Error('Bridge is a required dependency for the keyring');\n }\n\n this.bridge = bridge;\n }\n\n async init(): Promise<void> {\n return this.bridge.init();\n }\n\n async destroy(): Promise<void> {\n return this.bridge.destroy();\n }\n\n async serialize(): Promise<\n Omit<LedgerKeyringSerializedState, 'accountIndexes'>\n > {\n return {\n hdPath: this.hdPath,\n accounts: this.accounts.slice(),\n deviceId: this.deviceId,\n accountDetails: this.accountDetails,\n implementFullBIP44: false,\n };\n }\n\n async deserialize(opts: LedgerKeyringSerializedState): Promise<void> {\n this.hdPath = opts.hdPath ?? hdPathString;\n this.accounts = opts.accounts ?? [];\n this.deviceId = opts.deviceId ?? '';\n this.accountDetails = opts.accountDetails ?? {};\n\n if (!opts.accountDetails) {\n this.#migrateAccountDetails(opts);\n }\n\n this.implementFullBIP44 = opts.implementFullBIP44 ?? false;\n\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // Remove accounts that don't have corresponding account details\n this.accounts = this.accounts.filter((account) =>\n keys.has(this.#getChecksumHexAddress(account)),\n );\n\n return Promise.resolve();\n }\n\n public setDeviceId(deviceId: string): void {\n this.deviceId = deviceId;\n }\n\n public getDeviceId(): string {\n return this.deviceId;\n }\n\n #migrateAccountDetails(opts: Partial<LedgerBridgeKeyringOptions>): void {\n if (this.#isLedgerLiveHdPath() && opts.accountIndexes) {\n for (const [account, index] of Object.entries(opts.accountIndexes)) {\n this.accountDetails[account] = {\n bip44: true,\n hdPath: this.#getPathForIndex(index),\n };\n }\n }\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // try to migrate non-LedgerLive accounts too\n if (!this.#isLedgerLiveHdPath()) {\n this.accounts.forEach((account) => {\n const key = this.#getChecksumHexAddress(account);\n\n if (!keys.has(key)) {\n this.accountDetails[key] = {\n bip44: false,\n hdPath: this.#pathFromAddress(account),\n };\n }\n });\n }\n }\n\n isUnlocked(): boolean {\n return Boolean(this.hdk.publicKey);\n }\n\n isConnected(): boolean {\n return this.bridge.isDeviceConnected;\n }\n\n setAccountToUnlock(index: number): void {\n this.unlockedAccount = index;\n }\n\n setHdPath(hdPath: string): void {\n // Reset HDKey if the path changes\n if (this.hdPath !== hdPath) {\n this.hdk = new HDKey();\n }\n this.hdPath = hdPath;\n }\n\n async unlock(hdPath?: string, updateHdk = true): Promise<Hex> {\n if (this.isUnlocked() && !hdPath) {\n // if the device is already unlocked and no path is provided,\n // we return the checksummed address of the public key stored in\n // `this.hdk`, which is the root address of the last unlocked path.\n return this.#getChecksumHexAddress(\n bytesToHex(publicToAddress(this.hdk.publicKey, true)),\n );\n }\n const path = hdPath ? this.#toLedgerPath(hdPath) : this.hdPath;\n\n let payload;\n try {\n payload = await this.bridge.getPublicKey({\n hdPath: path,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while unlocking account',\n );\n }\n\n if (updateHdk && payload.chainCode) {\n this.hdk.publicKey = Buffer.from(payload.publicKey, 'hex');\n this.hdk.chainCode = Buffer.from(payload.chainCode, 'hex');\n }\n\n return add0x(payload.address);\n }\n\n async addAccounts(amount: number): Promise<Hex[]> {\n return new Promise((resolve, reject) => {\n this.unlock()\n .then(async (_) => {\n const from = this.unlockedAccount;\n const to = from + amount;\n const newAccounts: Hex[] = [];\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n let address: Hex;\n if (this.#isLedgerLiveHdPath()) {\n address = await this.unlock(path);\n } else {\n address = this.#addressFromIndex(pathBase, i);\n }\n\n this.accountDetails[this.#getChecksumHexAddress(address)] = {\n // TODO: consider renaming this property, as the current name is misleading\n // It's currently used to represent whether an account uses the Ledger Live path.\n bip44: this.#isLedgerLiveHdPath(),\n hdPath: path,\n };\n\n if (!this.accounts.includes(address)) {\n this.accounts = [...this.accounts, address];\n newAccounts.push(address);\n }\n this.page = 0;\n }\n resolve(newAccounts);\n })\n .catch(reject);\n });\n }\n\n getName(): string {\n return keyringType;\n }\n\n async getFirstPage(): Promise<AccountPage> {\n this.page = 0;\n return this.#getPage(1);\n }\n\n async getNextPage(): Promise<AccountPage> {\n return this.#getPage(1);\n }\n\n async getPreviousPage(): Promise<AccountPage> {\n return this.#getPage(-1);\n }\n\n async getAccounts(): Promise<Hex[]> {\n return Promise.resolve(this.accounts.slice());\n }\n\n removeAccount(address: string): void {\n const filteredAccounts = this.accounts.filter(\n (a) => a.toLowerCase() !== address.toLowerCase(),\n );\n\n if (filteredAccounts.length === this.accounts.length) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.accounts = filteredAccounts;\n delete this.accountDetails[this.#getChecksumHexAddress(address)];\n }\n\n async attemptMakeApp(): Promise<boolean> {\n return this.bridge.attemptMakeApp();\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n return this.bridge.updateTransportMethod(transportType);\n }\n\n async getAppNameAndVersion(): Promise<GetAppNameAndVersionResponse> {\n try {\n return await this.bridge.getAppNameAndVersion();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app name and version',\n );\n }\n }\n\n async getAppConfiguration(): Promise<AppConfigurationResponse> {\n try {\n return await this.bridge.getAppConfiguration();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app configuration',\n );\n }\n }\n\n // tx is an instance of the ethereumjs-transaction class.\n async signTransaction(\n address: Hex,\n tx: TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n let rawTxHex;\n // transactions built with older versions of ethereumjs-tx have a\n // getChainId method that newer versions do not. Older versions are mutable\n // while newer versions default to being immutable. Expected shape and type\n // of data for v, r and s differ (Buffer (old) vs BN (new))\n if (isOldStyleEthereumjsTx(tx)) {\n // In this version of ethereumjs-tx we must add the chainId in hex format\n // to the initial v value. The chainId must be included in the serialized\n // transaction which is only communicated to ethereumjs-tx in this\n // value. In newer versions the chainId is communicated via the 'Common'\n // object.\n tx.v = tx.getChainId();\n // @ts-expect-error tx.r should be a Buffer, but we are assigning a string\n tx.r = '0x00';\n // @ts-expect-error tx.s should be a Buffer, but we are assigning a string\n tx.s = '0x00';\n\n rawTxHex = tx.serialize().toString('hex');\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n tx.v = Buffer.from(payload.v, 'hex');\n tx.r = Buffer.from(payload.r, 'hex');\n tx.s = Buffer.from(payload.s, 'hex');\n return tx;\n });\n }\n\n // The below `encode` call is only necessary for legacy transactions, as `getMessageToSign`\n // calls `rlp.encode` internally for non-legacy transactions. As per the \"Transaction Execution\"\n // section of the ethereum yellow paper, transactions need to be \"well-formed RLP, with no additional\n // trailing bytes\".\n\n // Note also that `getMessageToSign` will return valid RLP for all transaction types, whereas the\n // `serialize` method will not for any transaction type except legacy. This is because `serialize` includes\n // empty r, s and v values in the encoded rlp. This is why we use `getMessageToSign` here instead of `serialize`.\n const messageToSign = tx.getMessageToSign();\n\n rawTxHex = Array.isArray(messageToSign)\n ? Buffer.from(RLP.encode(messageToSign)).toString('hex')\n : bytesToHex(messageToSign);\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n // Because tx will be immutable, first get a plain javascript object that\n // represents the transaction. Using txData here as it aligns with the\n // nomenclature of ethereumjs/tx.\n const txData: TypedTxData = tx.toJSON();\n // The fromTxData utility expects a type to support transactions with a type other than 0\n txData.type = tx.type;\n // The fromTxData utility expects v,r and s to be hex prefixed\n txData.v = add0x(payload.v);\n txData.r = add0x(payload.r);\n txData.s = add0x(payload.s);\n // Adopt the 'common' option from the original transaction and set the\n // returned object to be frozen if the original is frozen.\n return TransactionFactory.fromTxData(txData, {\n common: tx.common,\n freeze: Object.isFrozen(tx),\n });\n });\n }\n\n async #signTransaction(\n address: Hex,\n rawTxHex: string,\n handleSigning: (\n payload: SignTransactionPayload,\n ) => TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n const hdPath = await this.unlockAccountByAddress(address);\n\n if (!hdPath) {\n throw new Error('Ledger: hdPath is empty while signing transaction');\n }\n\n let payload;\n\n try {\n payload = await this.bridge.deviceSignTransaction({\n tx: remove0x(rawTxHex),\n hdPath,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing transaction',\n );\n }\n\n const newOrMutatedTx = handleSigning(payload);\n const valid = newOrMutatedTx.verifySignature();\n if (valid) {\n return newOrMutatedTx;\n }\n throw new Error('Ledger: The transaction signature is not valid');\n }\n\n async signMessage(withAccount: Hex, data: string): Promise<string> {\n return this.signPersonalMessage(withAccount, data);\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n withAccount: Hex,\n message: string,\n ): Promise<string> {\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignMessage({\n hdPath,\n message: remove0x(message),\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const modifiedV = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n\n const signature = `0x${payload.r}${payload.s}${modifiedV}`;\n const addressSignedWith = recoverPersonalSignature({\n data: message,\n signature,\n });\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async unlockAccountByAddress(address: Hex): Promise<string | undefined> {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n const accountDetails = this.accountDetails[checksummedAddress];\n if (!accountDetails) {\n throw new Error(\n `Ledger: Account for address '${checksummedAddress}' not found`,\n );\n }\n const { hdPath } = accountDetails;\n const unlockedAddress = await this.unlock(hdPath, false);\n\n // unlock resolves to the address for the given hdPath as reported by the ledger device\n // if that address is not the requested address, then this account belongs to a different device or seed\n if (unlockedAddress.toLowerCase() !== address.toLowerCase()) {\n throw new Error(\n `Ledger: Account ${address} does not belong to the connected device`,\n );\n }\n return hdPath;\n }\n\n async signTypedData<\n Version extends SignTypedDataVersion.V4,\n Types extends MessageTypes,\n Options extends { version?: Version },\n >(\n withAccount: Hex,\n data: TypedMessage<Types>,\n options?: Options,\n ): Promise<string> {\n const { version } = options ?? {};\n const isV4 = version === 'V4';\n if (!isV4) {\n throw createKeyringStateError(ErrorCode.DeviceStateOnlyV4Supported);\n }\n\n const { domain, types, primaryType, message } =\n TypedDataUtils.sanitizeData(data);\n\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignTypedData({\n hdPath,\n message: {\n domain: {\n name: domain.name,\n chainId: domain.chainId,\n version: domain.version,\n verifyingContract: domain.verifyingContract,\n salt:\n domain.salt instanceof ArrayBuffer\n ? Buffer.from(domain.salt).toString('hex')\n : domain.salt,\n },\n types,\n primaryType: primaryType.toString(),\n message,\n },\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const recoveryId = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${recoveryId}`;\n const addressSignedWith = recoverTypedSignature({\n data,\n signature,\n version: SignTypedDataVersion.V4,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async signEip7702Authorization(\n withAccount: Hex,\n authorization: [chainId: number, contractAddress: Hex, nonce: number],\n ): Promise<string> {\n const [chainId, contractAddress, nonce] = authorization;\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error(\n 'Ledger: Missing hdPath while signing EIP-7702 authorization',\n );\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignDelegationAuthorization({\n hdPath,\n chainId,\n contractAddress: remove0x(contractAddress),\n nonce,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Error while signing EIP-7702 authorization',\n );\n }\n\n // EIP-7702 authorization signatures use yParity (0 or 1), unlike\n // EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n const yParity = this.#normalizeYParity(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${yParity}`;\n\n const addressSignedWith = recoverEIP7702Authorization({\n signature,\n authorization,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error(\n 'Ledger: The EIP-7702 authorization signature does not match the right address',\n );\n }\n return signature;\n }\n\n forgetDevice(): void {\n this.deviceId = '';\n this.accounts = [];\n this.page = 0;\n this.unlockedAccount = 0;\n this.paths = {};\n this.accountDetails = {};\n this.hdk = new HDKey();\n }\n\n /* PRIVATE METHODS */\n async #getPage(increment: number): Promise<AccountPage> {\n this.page += increment;\n\n if (this.page <= 0) {\n this.page = 1;\n }\n const from = (this.page - 1) * this.perPage;\n const to = from + this.perPage;\n\n await this.unlock();\n let accounts;\n if (this.#isLedgerLiveHdPath()) {\n accounts = await this.#getAccountsBIP44(from, to);\n } else {\n accounts = this.#getAccountsLegacy(from, to);\n }\n return accounts;\n }\n\n async #getAccountsBIP44(from: number, to: number): Promise<AccountPage> {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n const address = await this.unlock(path);\n const valid = this.implementFullBIP44\n ? await this.#hasPreviousTransactions(address)\n : true;\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n\n // PER BIP44\n // \"Software should prevent a creation of an account if\n // a previous account does not have a transaction history\n // (meaning none of its addresses have been used before).\"\n if (!valid) {\n break;\n }\n }\n return accounts;\n }\n\n #getAccountsLegacy(from: number, to: number): AccountPage {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const address = this.#addressFromIndex(pathBase, i);\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n this.paths[this.#getChecksumHexAddress(address)] = i;\n }\n return accounts;\n }\n\n #addressFromIndex(basePath: string, i: number): Hex {\n const dkey = this.hdk.derive(`${basePath}/${i}`);\n const address = bytesToHex(publicToAddress(dkey.publicKey, true));\n return this.#getChecksumHexAddress(address);\n }\n\n #pathFromAddress(address: string): string {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n let index = this.paths[checksummedAddress];\n if (typeof index === 'undefined') {\n for (let i = 0; i < MAX_INDEX; i++) {\n if (checksummedAddress === this.#addressFromIndex(pathBase, i)) {\n index = i;\n break;\n }\n }\n }\n\n if (typeof index === 'undefined') {\n throw new Error('Unknown address');\n }\n return this.#getPathForIndex(index);\n }\n\n #getPathForIndex(index: number): string {\n // Check if the path is BIP 44 (Ledger Live)\n return this.#isLedgerLiveHdPath()\n ? `m/44'/60'/${index}'/0/0`\n : `${this.hdPath}/${index}`;\n }\n\n #isLedgerLiveHdPath(): boolean {\n return this.hdPath === `m/44'/60'/0'/0/0`;\n }\n\n #toLedgerPath(path: string): string {\n return path.toString().replace('m/', '');\n }\n\n async #hasPreviousTransactions(address: string): Promise<boolean> {\n const apiUrl = this.#getApiUrl();\n const response = await window.fetch(\n `${apiUrl}/api?module=account&action=txlist&address=${address}&tag=latest&page=1&offset=1`,\n );\n const parsedResponse = await response.json();\n return parsedResponse.status !== '0' && parsedResponse.result.length > 0;\n }\n\n #getApiUrl(): NetworkApiUrls {\n return this.network;\n }\n\n #getChecksumHexAddress(address: string): Hex {\n return getChecksumAddress(add0x(address));\n }\n\n /**\n * Parses the recovery parameter (`v`) returned by a Ledger device.\n * Ledger may return `v` as a number, a `0x`-prefixed hex string, a bare hex\n * string (e.g. `'1b'` for 27), or a decimal string.\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The recovery parameter as a number.\n */\n #parseLedgerRecoveryParam(recoveryParam: string | number): number {\n if (typeof recoveryParam === 'number') {\n return recoveryParam;\n }\n\n const value = String(recoveryParam).trim();\n\n if (value.startsWith('0x') || value.startsWith('0X')) {\n if (!isStrictHexString(value)) {\n throw new Error(`Invalid hex recovery parameter: \"${recoveryParam}\"`);\n }\n return hexToNumber(value);\n }\n\n // If the string contains hex letters (a-f), interpret it as hex;\n // otherwise interpret it as a regular decimal number.\n const radix = /[a-f]/iu.test(value) ? 16 : 10;\n const result = parseInt(value, radix);\n\n if (Number.isNaN(result)) {\n throw new Error(`Invalid recovery parameter: \"${recoveryParam}\"`);\n }\n\n return result;\n }\n\n /**\n * Normalizes the signature recovery parameter (v) to legacy format.\n * Ledger devices may return v as 0 or 1 (modern format), but signature\n * recovery expects 27 or 28 (legacy format per EIP-191/EIP-712).\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The normalized recovery parameter as a hex string.\n */\n #normalizeRecoveryParam(recoveryParam: number): string {\n if (recoveryParam === 0 || recoveryParam === 1) {\n return (recoveryParam + 27).toString(16);\n }\n return recoveryParam.toString(16);\n }\n\n /**\n * Normalizes the signature recovery parameter (`v`) to yParity format and\n * returns it as a 2-character hex string suitable for appending to a signature.\n *\n * Ledger devices may return `v` as 0/1 (yParity) or 27/28 (legacy). EIP-7702\n * authorization signatures require the yParity value (0 or 1), unlike\n * EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n *\n * @param recoveryParam - The parsed recovery parameter from Ledger.\n * @returns The yParity as a 2-character lowercase hex string ('00' or '01').\n */\n #normalizeYParity(recoveryParam: number): string {\n const yParity =\n recoveryParam === 0 || recoveryParam === 1\n ? recoveryParam\n : recoveryParam - 27;\n return yParity.toString(16).padStart(2, '0');\n }\n}\n"]}
1
+ {"version":3,"file":"ledger-keyring.mjs","sourceRoot":"","sources":["../src/ledger-keyring.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,wBAAwB;AACtC,OAAO,EAAE,kBAAkB,EAAe,uBAAuB;AAEjE,OAAO,EAAE,eAAe,EAAE,yBAAyB;AAEnD,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACf,+BAA+B;AAEhC,OAAO,EACL,KAAK,EACL,UAAU,EACV,kBAAkB,EAElB,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACT,wBAAwB;AACzB,OAAO,EAAE,MAAM,EAAE,eAAe;AAEhC,OAAO,MAAK,cAAc;;AAQ1B,OAAO,EAAE,0BAA0B,EAAE,mCAA+B;AAEpE,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,YAAY,GAAG,GAAG,QAAQ,aAAa,CAAC;AAC9C,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,+GAA+G;AAC/G,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,IAAK,cAKJ;AALD,WAAK,cAAc;IACjB,8DAA4C,CAAA;IAC5C,0DAAwC,CAAA;IACxC,8DAA4C,CAAA;IAC5C,sDAAoC,CAAA;AACtC,CAAC,EALI,cAAc,KAAd,cAAc,QAKlB;AA+BD;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAC7B,EAA0C;IAE1C,OAAO,YAAY,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC;AACnE,CAAC;AAED,MAAM,OAAO,aAAa;IA6BxB,YAAY,EAAE,MAAM,EAAiD;;QA1BrE,aAAQ,GAAG,EAAE,CAAC;QAEL,SAAI,GAAW,WAAW,CAAC;QAEpC,SAAI,GAAG,CAAC,CAAC;QAET,YAAO,GAAG,CAAC,CAAC;QAEZ,oBAAe,GAAG,CAAC,CAAC;QAEpB,aAAQ,GAAmB,EAAE,CAAC;QAE9B,mBAAc,GAAmC,EAAE,CAAC;QAEpD,QAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QAElB,WAAM,GAAG,YAAY,CAAC;QAEtB,UAAK,GAA2B,EAAE,CAAC;QAEnC,YAAO,GAAmB,cAAc,CAAC,OAAO,CAAC;QAEjD,uBAAkB,GAAG,KAAK,CAAC;QAKzB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QAGb,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,kBAAkB,EAAE,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAkC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QAEhD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAE3D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/D,gEAAgE;QAChE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/C,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC,CAC/C,CAAC;QAEF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEM,WAAW,CAAC,QAAgB;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IA2BD,UAAU;QACR,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACvC,CAAC;IAED,kBAAkB,CAAC,KAAa;QAC9B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,kCAAkC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAe,EAAE,SAAS,GAAG,IAAI;QAC5C,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,6DAA6D;YAC7D,gEAAgE;YAChE,mEAAmE;YACnE,OAAO,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EACT,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CACtD,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,uBAAA,IAAI,6DAAc,MAAlB,IAAI,EAAe,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAE/D,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBACvC,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B,CACxB,KAAK,EACL,+CAA+C,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,EAAE;iBACV,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;gBAClC,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC;gBACzB,MAAM,WAAW,GAAU,EAAE,CAAC;gBAC9B,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAG,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,CAAC,CAAC,CAAC;oBACtC,IAAI,OAAY,CAAC;oBACjB,IAAI,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB,EAAE,CAAC;wBAC/B,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC;oBAChD,CAAC;oBAED,IAAI,CAAC,cAAc,CAAC,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC,GAAG;wBAC1D,2EAA2E;wBAC3E,iFAAiF;wBACjF,KAAK,EAAE,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB;wBACjC,MAAM,EAAE,IAAI;qBACb,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACrC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBAC5C,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC5B,CAAC;oBACD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChB,CAAC;gBACD,OAAO,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC,CAAC;iBACD,KAAK,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,OAAO,uBAAA,IAAI,wDAAS,MAAb,IAAI,EAAU,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,uBAAA,IAAI,wDAAS,MAAb,IAAI,EAAU,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,uBAAA,IAAI,wDAAS,MAAb,IAAI,EAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CACjD,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,4BAA4B,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,aAAqB;QAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,0BAA0B,CAC/B,KAAK,EACL,0DAA0D,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,0BAA0B,CAC/B,KAAK,EACL,uDAAuD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,eAAe,CACnB,OAAY,EACZ,EAA0C;QAE1C,IAAI,QAAQ,CAAC;QACb,iEAAiE;QACjE,2EAA2E;QAC3E,2EAA2E;QAC3E,2DAA2D;QAC3D,IAAI,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,yEAAyE;YACzE,yEAAyE;YACzE,kEAAkE;YAClE,wEAAwE;YACxE,UAAU;YACV,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;YACvB,0EAA0E;YAC1E,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;YACd,0EAA0E;YAC1E,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;YAEd,QAAQ,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE1C,OAAO,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1D,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,2FAA2F;QAC3F,gGAAgG;QAChG,qGAAqG;QACrG,mBAAmB;QAEnB,iGAAiG;QACjG,2GAA2G;QAC3G,iHAAiH;QACjH,MAAM,aAAa,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;QAE5C,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YACrC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxD,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAE9B,OAAO,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1D,yEAAyE;YACzE,sEAAsE;YACtE,iCAAiC;YACjC,MAAM,MAAM,GAAgB,EAAE,CAAC,MAAM,EAAE,CAAC;YACxC,yFAAyF;YACzF,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;YACtB,8DAA8D;YAC9D,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,sEAAsE;YACtE,0DAA0D;YAC1D,OAAO,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE;gBAC3C,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAqCD,KAAK,CAAC,WAAW,CAAC,WAAgB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,mBAAmB,CACvB,WAAgB,EAChB,OAAe;QAEf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBAC5C,MAAM;gBACN,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B,CACxB,KAAK,EACL,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,uBAAA,IAAI,uEAAwB,MAA5B,IAAI,EACpB,uBAAA,IAAI,yEAA0B,MAA9B,IAAI,EAA2B,OAAO,CAAC,CAAC,CAAC,CAC1C,CAAC;QAEF,MAAM,SAAS,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;QAC3D,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;YACjD,IAAI,EAAE,OAAO;YACb,SAAS;SACV,CAAC,CAAC;QACH,IACE,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,iBAAiB,CAAC;YAC9C,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,WAAW,CAAC,EACxC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAY;QACvC,MAAM,kBAAkB,GAAG,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,gCAAgC,kBAAkB,aAAa,CAChE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;QAClC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEzD,uFAAuF;QACvF,wGAAwG;QACxG,IAAI,eAAe,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CACb,mBAAmB,OAAO,0CAA0C,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAKjB,WAAgB,EAChB,IAAyB,EACzB,OAAiB;QAEjB,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAC3C,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;gBAC9C,MAAM;gBACN,OAAO,EAAE;oBACP,MAAM,EAAE;wBACN,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;wBAC3C,IAAI,EACF,MAAM,CAAC,IAAI,YAAY,WAAW;4BAChC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;4BAC1C,CAAC,CAAC,MAAM,CAAC,IAAI;qBAClB;oBACD,KAAK;oBACL,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;oBACnC,OAAO;iBACR;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B,CACxB,KAAK,EACL,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,uBAAA,IAAI,uEAAwB,MAA5B,IAAI,EACrB,uBAAA,IAAI,yEAA0B,MAA9B,IAAI,EAA2B,OAAO,CAAC,CAAC,CAAC,CAC1C,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;QAC5D,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;YAC9C,IAAI;YACJ,SAAS;YACT,OAAO,EAAE,oBAAoB,CAAC,EAAE;SACjC,CAAC,CAAC;QAEH,IACE,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,iBAAiB,CAAC;YAC9C,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,WAAW,CAAC,EACxC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,WAAgB,EAChB,aAAqE;QAErE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC;gBAC5D,MAAM;gBACN,OAAO;gBACP,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC;gBAC1C,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B,CACxB,KAAK,EACL,oDAAoD,CACrD,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,qEAAqE;QACrE,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAClB,uBAAA,IAAI,yEAA0B,MAA9B,IAAI,EAA2B,OAAO,CAAC,CAAC,CAAC,CAC1C,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC;QAEzD,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;YACpD,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QAEH,IACE,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,iBAAiB,CAAC;YAC9C,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,WAAW,CAAC,EACxC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,YAAY;QACV,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IACzB,CAAC;;+HA1dsB,IAAyC;IAC9D,IAAI,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG;gBAC7B,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,KAAK,CAAC;aACrC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,6CAA6C;IAC7C,IAAI,CAAC,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,GAAG,GAAG,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG;oBACzB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,OAAO,CAAC;iBACvC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,mCA0ND,KAAK,yCACH,OAAY,EACZ,QAAgB,EAChB,aAE2C;IAE3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;YAChD,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACtB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,0BAA0B,CACxB,KAAK,EACL,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;IAC/C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC;AA0MD,qBAAqB;AACrB,KAAK,iCAAU,SAAiB;IAC9B,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAEvB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAE/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACpB,IAAI,QAAQ,CAAC;IACb,IAAI,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB,EAAE,CAAC;QAC/B,QAAQ,GAAG,MAAM,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,IAAI,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,uBAAA,IAAI,kEAAmB,MAAvB,IAAI,EAAoB,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,oCAED,KAAK,0CAAmB,IAAY,EAAE,EAAU;IAC9C,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,CAAC,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB;YACnC,CAAC,CAAC,MAAM,uBAAA,IAAI,wEAAyB,MAA7B,IAAI,EAA0B,OAAO,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,YAAY;QACZ,uDAAuD;QACvD,yDAAyD;QACzD,0DAA0D;QAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,+EAEkB,IAAY,EAAE,EAAU;IACzC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,6EAEiB,QAAgB,EAAE,CAAS;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC;AAC9C,CAAC,2EAEgB,OAAe;IAC9B,MAAM,kBAAkB,GAAG,uBAAA,IAAI,sEAAuB,MAA3B,IAAI,EAAwB,OAAO,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,kBAAkB,KAAK,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC/D,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,uBAAA,IAAI,gEAAiB,MAArB,IAAI,EAAkB,KAAK,CAAC,CAAC;AACtC,CAAC,2EAEgB,KAAa;IAC5B,4CAA4C;IAC5C,OAAO,uBAAA,IAAI,mEAAoB,MAAxB,IAAI,CAAsB;QAC/B,CAAC,CAAC,aAAa,KAAK,OAAO;QAC3B,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;AAChC,CAAC;IAGC,OAAO,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAC;AAC5C,CAAC,qEAEa,IAAY;IACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC,2CAED,KAAK,iDAA0B,OAAe;IAC5C,MAAM,MAAM,GAAG,uBAAA,IAAI,0DAAW,MAAf,IAAI,CAAa,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,GAAG,MAAM,6CAA6C,OAAO,6BAA6B,CAC3F,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,cAAc,CAAC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC;IAGC,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC,uFAEsB,OAAe;IACpC,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC,6FAUyB,aAA8B;IACtD,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,aAAa,GAAG,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,iEAAiE;IACjE,sDAAsD;IACtD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEtC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,aAAa,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,yFAUuB,aAAqB;IAC3C,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC,6EAaiB,aAAqB;IACrC,MAAM,OAAO,GACX,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC;QACxC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC;IACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAxuBM,kBAAI,GAAW,WAAW,AAAtB,CAAuB","sourcesContent":["import { RLP } from '@ethereumjs/rlp';\nimport { TransactionFactory, TypedTxData } from '@ethereumjs/tx';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { publicToAddress } from '@ethereumjs/util';\nimport type { MessageTypes, TypedMessage } from '@metamask/eth-sig-util';\nimport {\n recoverEIP7702Authorization,\n recoverPersonalSignature,\n recoverTypedSignature,\n SignTypedDataVersion,\n TypedDataUtils,\n} from '@metamask/eth-sig-util';\nimport type { Keyring } from '@metamask/keyring-utils';\nimport {\n add0x,\n bytesToHex,\n getChecksumAddress,\n Hex,\n hexToNumber,\n isStrictHexString,\n remove0x,\n} from '@metamask/utils';\nimport { Buffer } from 'buffer';\nimport type OldEthJsTransaction from 'ethereumjs-tx';\nimport HDKey from 'hdkey';\n\nimport {\n AppConfigurationResponse,\n GetAppNameAndVersionResponse,\n LedgerBridge,\n LedgerBridgeOptions,\n} from './ledger-bridge';\nimport { handleLedgerTransportError } from './ledger-error-handler';\n\nconst pathBase = 'm';\nconst hdPathString = `${pathBase}/44'/60'/0'`;\nconst keyringType = 'Ledger Hardware';\n\n// This number causes one of our failing tests to run very slowly, as the for loop needs to iterate 1000 times.\nconst MAX_INDEX = 1000;\n\nenum NetworkApiUrls {\n Ropsten = 'https://api-ropsten.etherscan.io',\n Kovan = 'https://api-kovan.etherscan.io',\n Rinkeby = 'https://api-rinkeby.etherscan.io',\n Mainnet = `https://api.etherscan.io`,\n}\n\ntype SignTransactionPayload = Awaited<\n ReturnType<LedgerBridge<LedgerBridgeOptions>['deviceSignTransaction']>\n>;\n\nexport type AccountPageEntry = {\n address: string;\n balance: number | null;\n index: number;\n};\n\nexport type AccountPage = AccountPageEntry[];\n\nexport type AccountDetails = {\n index?: number;\n bip44?: boolean;\n hdPath?: string;\n};\n\nexport type LedgerBridgeKeyringOptions = {\n hdPath: string;\n accounts: Hex[];\n deviceId: string;\n accountDetails: Readonly<Record<Hex, AccountDetails>>;\n accountIndexes: Readonly<Record<Hex, number>>;\n implementFullBIP44: boolean;\n};\n\nexport type LedgerKeyringSerializedState = Partial<LedgerBridgeKeyringOptions>;\n\n/**\n * Check if the given transaction is made with ethereumjs-tx or @ethereumjs/tx\n *\n * Transactions built with older versions of ethereumjs-tx have a\n * getChainId method that newer versions do not.\n * Older versions are mutable\n * while newer versions default to being immutable.\n * Expected shape and type\n * of data for v, r and s differ (Buffer (old) vs BN (new)).\n *\n * @param tx - Transaction to check, instance of either ethereumjs-tx or @ethereumjs/tx.\n * @returns Returns `true` if tx is an old-style ethereumjs-tx transaction.\n */\nfunction isOldStyleEthereumjsTx(\n tx: TypedTransaction | OldEthJsTransaction,\n): tx is OldEthJsTransaction {\n return 'getChainId' in tx && typeof tx.getChainId === 'function';\n}\n\nexport class LedgerKeyring implements Keyring {\n static type: string = keyringType;\n\n deviceId = '';\n\n readonly type: string = keyringType;\n\n page = 0;\n\n perPage = 5;\n\n unlockedAccount = 0;\n\n accounts: readonly Hex[] = [];\n\n accountDetails: Record<string, AccountDetails> = {};\n\n hdk = new HDKey();\n\n hdPath = hdPathString;\n\n paths: Record<string, number> = {};\n\n network: NetworkApiUrls = NetworkApiUrls.Mainnet;\n\n implementFullBIP44 = false;\n\n bridge: LedgerBridge<LedgerBridgeOptions>;\n\n constructor({ bridge }: { bridge: LedgerBridge<LedgerBridgeOptions> }) {\n if (!bridge) {\n throw new Error('Bridge is a required dependency for the keyring');\n }\n\n this.bridge = bridge;\n }\n\n async init(): Promise<void> {\n return this.bridge.init();\n }\n\n async destroy(): Promise<void> {\n return this.bridge.destroy();\n }\n\n async serialize(): Promise<\n Omit<LedgerKeyringSerializedState, 'accountIndexes'>\n > {\n return {\n hdPath: this.hdPath,\n accounts: this.accounts.slice(),\n deviceId: this.deviceId,\n accountDetails: this.accountDetails,\n implementFullBIP44: false,\n };\n }\n\n async deserialize(opts: LedgerKeyringSerializedState): Promise<void> {\n this.hdPath = opts.hdPath ?? hdPathString;\n this.accounts = opts.accounts ?? [];\n this.deviceId = opts.deviceId ?? '';\n this.accountDetails = opts.accountDetails ?? {};\n\n if (!opts.accountDetails) {\n this.#migrateAccountDetails(opts);\n }\n\n this.implementFullBIP44 = opts.implementFullBIP44 ?? false;\n\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // Remove accounts that don't have corresponding account details\n this.accounts = this.accounts.filter((account) =>\n keys.has(this.#getChecksumHexAddress(account)),\n );\n\n return Promise.resolve();\n }\n\n public setDeviceId(deviceId: string): void {\n this.deviceId = deviceId;\n }\n\n public getDeviceId(): string {\n return this.deviceId;\n }\n\n #migrateAccountDetails(opts: Partial<LedgerBridgeKeyringOptions>): void {\n if (this.#isLedgerLiveHdPath() && opts.accountIndexes) {\n for (const [account, index] of Object.entries(opts.accountIndexes)) {\n this.accountDetails[account] = {\n bip44: true,\n hdPath: this.#getPathForIndex(index),\n };\n }\n }\n const keys = new Set<string>(Object.keys(this.accountDetails));\n // try to migrate non-LedgerLive accounts too\n if (!this.#isLedgerLiveHdPath()) {\n this.accounts.forEach((account) => {\n const key = this.#getChecksumHexAddress(account);\n\n if (!keys.has(key)) {\n this.accountDetails[key] = {\n bip44: false,\n hdPath: this.#pathFromAddress(account),\n };\n }\n });\n }\n }\n\n isUnlocked(): boolean {\n return Boolean(this.hdk.publicKey);\n }\n\n isConnected(): boolean {\n return this.bridge.isDeviceConnected;\n }\n\n setAccountToUnlock(index: number): void {\n this.unlockedAccount = index;\n }\n\n setHdPath(hdPath: string): void {\n // Reset HDKey if the path changes\n if (this.hdPath !== hdPath) {\n this.hdk = new HDKey();\n }\n this.hdPath = hdPath;\n }\n\n async unlock(hdPath?: string, updateHdk = true): Promise<Hex> {\n if (this.isUnlocked() && !hdPath) {\n // if the device is already unlocked and no path is provided,\n // we return the checksummed address of the public key stored in\n // `this.hdk`, which is the root address of the last unlocked path.\n return this.#getChecksumHexAddress(\n bytesToHex(publicToAddress(this.hdk.publicKey, true)),\n );\n }\n const path = hdPath ? this.#toLedgerPath(hdPath) : this.hdPath;\n\n let payload;\n try {\n payload = await this.bridge.getPublicKey({\n hdPath: path,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while unlocking account',\n );\n }\n\n if (updateHdk && payload.chainCode) {\n this.hdk.publicKey = Buffer.from(payload.publicKey, 'hex');\n this.hdk.chainCode = Buffer.from(payload.chainCode, 'hex');\n }\n\n return add0x(payload.address);\n }\n\n async addAccounts(amount: number): Promise<Hex[]> {\n return new Promise((resolve, reject) => {\n this.unlock()\n .then(async (_) => {\n const from = this.unlockedAccount;\n const to = from + amount;\n const newAccounts: Hex[] = [];\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n let address: Hex;\n if (this.#isLedgerLiveHdPath()) {\n address = await this.unlock(path);\n } else {\n address = this.#addressFromIndex(pathBase, i);\n }\n\n this.accountDetails[this.#getChecksumHexAddress(address)] = {\n // TODO: consider renaming this property, as the current name is misleading\n // It's currently used to represent whether an account uses the Ledger Live path.\n bip44: this.#isLedgerLiveHdPath(),\n hdPath: path,\n };\n\n if (!this.accounts.includes(address)) {\n this.accounts = [...this.accounts, address];\n newAccounts.push(address);\n }\n this.page = 0;\n }\n resolve(newAccounts);\n })\n .catch(reject);\n });\n }\n\n getName(): string {\n return keyringType;\n }\n\n async getFirstPage(): Promise<AccountPage> {\n this.page = 0;\n return this.#getPage(1);\n }\n\n async getNextPage(): Promise<AccountPage> {\n return this.#getPage(1);\n }\n\n async getPreviousPage(): Promise<AccountPage> {\n return this.#getPage(-1);\n }\n\n async getAccounts(): Promise<Hex[]> {\n return Promise.resolve(this.accounts.slice());\n }\n\n removeAccount(address: string): void {\n const filteredAccounts = this.accounts.filter(\n (a) => a.toLowerCase() !== address.toLowerCase(),\n );\n\n if (filteredAccounts.length === this.accounts.length) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.accounts = filteredAccounts;\n delete this.accountDetails[this.#getChecksumHexAddress(address)];\n }\n\n async attemptMakeApp(): Promise<boolean> {\n return this.bridge.attemptMakeApp();\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n return this.bridge.updateTransportMethod(transportType);\n }\n\n async getAppNameAndVersion(): Promise<GetAppNameAndVersionResponse> {\n try {\n return await this.bridge.getAppNameAndVersion();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app name and version',\n );\n }\n }\n\n async getAppConfiguration(): Promise<AppConfigurationResponse> {\n try {\n return await this.bridge.getAppConfiguration();\n } catch (error: unknown) {\n return handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while getting app configuration',\n );\n }\n }\n\n // tx is an instance of the ethereumjs-transaction class.\n async signTransaction(\n address: Hex,\n tx: TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n let rawTxHex;\n // transactions built with older versions of ethereumjs-tx have a\n // getChainId method that newer versions do not. Older versions are mutable\n // while newer versions default to being immutable. Expected shape and type\n // of data for v, r and s differ (Buffer (old) vs BN (new))\n if (isOldStyleEthereumjsTx(tx)) {\n // In this version of ethereumjs-tx we must add the chainId in hex format\n // to the initial v value. The chainId must be included in the serialized\n // transaction which is only communicated to ethereumjs-tx in this\n // value. In newer versions the chainId is communicated via the 'Common'\n // object.\n tx.v = tx.getChainId();\n // @ts-expect-error tx.r should be a Buffer, but we are assigning a string\n tx.r = '0x00';\n // @ts-expect-error tx.s should be a Buffer, but we are assigning a string\n tx.s = '0x00';\n\n rawTxHex = tx.serialize().toString('hex');\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n tx.v = Buffer.from(payload.v, 'hex');\n tx.r = Buffer.from(payload.r, 'hex');\n tx.s = Buffer.from(payload.s, 'hex');\n return tx;\n });\n }\n\n // The below `encode` call is only necessary for legacy transactions, as `getMessageToSign`\n // calls `rlp.encode` internally for non-legacy transactions. As per the \"Transaction Execution\"\n // section of the ethereum yellow paper, transactions need to be \"well-formed RLP, with no additional\n // trailing bytes\".\n\n // Note also that `getMessageToSign` will return valid RLP for all transaction types, whereas the\n // `serialize` method will not for any transaction type except legacy. This is because `serialize` includes\n // empty r, s and v values in the encoded rlp. This is why we use `getMessageToSign` here instead of `serialize`.\n const messageToSign = tx.getMessageToSign();\n\n rawTxHex = Array.isArray(messageToSign)\n ? Buffer.from(RLP.encode(messageToSign)).toString('hex')\n : bytesToHex(messageToSign);\n\n return this.#signTransaction(address, rawTxHex, (payload) => {\n // Because tx will be immutable, first get a plain javascript object that\n // represents the transaction. Using txData here as it aligns with the\n // nomenclature of ethereumjs/tx.\n const txData: TypedTxData = tx.toJSON();\n // The fromTxData utility expects a type to support transactions with a type other than 0\n txData.type = tx.type;\n // The fromTxData utility expects v,r and s to be hex prefixed\n txData.v = add0x(payload.v);\n txData.r = add0x(payload.r);\n txData.s = add0x(payload.s);\n // Adopt the 'common' option from the original transaction and set the\n // returned object to be frozen if the original is frozen.\n return TransactionFactory.fromTxData(txData, {\n common: tx.common,\n freeze: Object.isFrozen(tx),\n });\n });\n }\n\n async #signTransaction(\n address: Hex,\n rawTxHex: string,\n handleSigning: (\n payload: SignTransactionPayload,\n ) => TypedTransaction | OldEthJsTransaction,\n ): Promise<TypedTransaction | OldEthJsTransaction> {\n const hdPath = await this.unlockAccountByAddress(address);\n\n if (!hdPath) {\n throw new Error('Ledger: hdPath is empty while signing transaction');\n }\n\n let payload;\n\n try {\n payload = await this.bridge.deviceSignTransaction({\n tx: remove0x(rawTxHex),\n hdPath,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing transaction',\n );\n }\n\n const newOrMutatedTx = handleSigning(payload);\n const valid = newOrMutatedTx.verifySignature();\n if (valid) {\n return newOrMutatedTx;\n }\n throw new Error('Ledger: The transaction signature is not valid');\n }\n\n async signMessage(withAccount: Hex, data: string): Promise<string> {\n return this.signPersonalMessage(withAccount, data);\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n withAccount: Hex,\n message: string,\n ): Promise<string> {\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignMessage({\n hdPath,\n message: remove0x(message),\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const modifiedV = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n\n const signature = `0x${payload.r}${payload.s}${modifiedV}`;\n const addressSignedWith = recoverPersonalSignature({\n data: message,\n signature,\n });\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async unlockAccountByAddress(address: Hex): Promise<string | undefined> {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n const accountDetails = this.accountDetails[checksummedAddress];\n if (!accountDetails) {\n throw new Error(\n `Ledger: Account for address '${checksummedAddress}' not found`,\n );\n }\n const { hdPath } = accountDetails;\n const unlockedAddress = await this.unlock(hdPath, false);\n\n // unlock resolves to the address for the given hdPath as reported by the ledger device\n // if that address is not the requested address, then this account belongs to a different device or seed\n if (unlockedAddress.toLowerCase() !== address.toLowerCase()) {\n throw new Error(\n `Ledger: Account ${address} does not belong to the connected device`,\n );\n }\n return hdPath;\n }\n\n async signTypedData<\n Version extends SignTypedDataVersion.V4,\n Types extends MessageTypes,\n Options extends { version?: Version },\n >(\n withAccount: Hex,\n data: TypedMessage<Types>,\n options?: Options,\n ): Promise<string> {\n const { version } = options ?? {};\n const isV4 = version === 'V4';\n if (!isV4) {\n throw new Error(\n 'Ledger: Only version 4 of typed data signing is supported',\n );\n }\n\n const { domain, types, primaryType, message } =\n TypedDataUtils.sanitizeData(data);\n\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error('Ledger: Unknown error while signing message');\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignTypedData({\n hdPath,\n message: {\n domain: {\n name: domain.name,\n chainId: domain.chainId,\n version: domain.version,\n verifyingContract: domain.verifyingContract,\n salt:\n domain.salt instanceof ArrayBuffer\n ? Buffer.from(domain.salt).toString('hex')\n : domain.salt,\n },\n types,\n primaryType: primaryType.toString(),\n message,\n },\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Unknown error while signing message',\n );\n }\n\n const recoveryId = this.#normalizeRecoveryParam(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${recoveryId}`;\n const addressSignedWith = recoverTypedSignature({\n data,\n signature,\n version: SignTypedDataVersion.V4,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error('Ledger: The signature doesnt match the right address');\n }\n return signature;\n }\n\n async signEip7702Authorization(\n withAccount: Hex,\n authorization: [chainId: number, contractAddress: Hex, nonce: number],\n ): Promise<string> {\n const [chainId, contractAddress, nonce] = authorization;\n const hdPath = await this.unlockAccountByAddress(withAccount);\n\n if (!hdPath) {\n throw new Error(\n 'Ledger: Missing hdPath while signing EIP-7702 authorization',\n );\n }\n\n let payload;\n try {\n payload = await this.bridge.deviceSignDelegationAuthorization({\n hdPath,\n chainId,\n contractAddress: remove0x(contractAddress),\n nonce,\n });\n } catch (error: unknown) {\n handleLedgerTransportError(\n error,\n 'Ledger: Error while signing EIP-7702 authorization',\n );\n }\n\n // EIP-7702 authorization signatures use yParity (0 or 1), unlike\n // EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n const yParity = this.#normalizeYParity(\n this.#parseLedgerRecoveryParam(payload.v),\n );\n const signature = `0x${payload.r}${payload.s}${yParity}`;\n\n const addressSignedWith = recoverEIP7702Authorization({\n signature,\n authorization,\n });\n\n if (\n this.#getChecksumHexAddress(addressSignedWith) !==\n this.#getChecksumHexAddress(withAccount)\n ) {\n throw new Error(\n 'Ledger: The EIP-7702 authorization signature does not match the right address',\n );\n }\n return signature;\n }\n\n forgetDevice(): void {\n this.deviceId = '';\n this.accounts = [];\n this.page = 0;\n this.unlockedAccount = 0;\n this.paths = {};\n this.accountDetails = {};\n this.hdk = new HDKey();\n }\n\n /* PRIVATE METHODS */\n async #getPage(increment: number): Promise<AccountPage> {\n this.page += increment;\n\n if (this.page <= 0) {\n this.page = 1;\n }\n const from = (this.page - 1) * this.perPage;\n const to = from + this.perPage;\n\n await this.unlock();\n let accounts;\n if (this.#isLedgerLiveHdPath()) {\n accounts = await this.#getAccountsBIP44(from, to);\n } else {\n accounts = this.#getAccountsLegacy(from, to);\n }\n return accounts;\n }\n\n async #getAccountsBIP44(from: number, to: number): Promise<AccountPage> {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const path = this.#getPathForIndex(i);\n const address = await this.unlock(path);\n const valid = this.implementFullBIP44\n ? await this.#hasPreviousTransactions(address)\n : true;\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n\n // PER BIP44\n // \"Software should prevent a creation of an account if\n // a previous account does not have a transaction history\n // (meaning none of its addresses have been used before).\"\n if (!valid) {\n break;\n }\n }\n return accounts;\n }\n\n #getAccountsLegacy(from: number, to: number): AccountPage {\n const accounts: AccountPage = [];\n\n for (let i = from; i < to; i++) {\n const address = this.#addressFromIndex(pathBase, i);\n accounts.push({\n address,\n balance: null,\n index: i,\n });\n this.paths[this.#getChecksumHexAddress(address)] = i;\n }\n return accounts;\n }\n\n #addressFromIndex(basePath: string, i: number): Hex {\n const dkey = this.hdk.derive(`${basePath}/${i}`);\n const address = bytesToHex(publicToAddress(dkey.publicKey, true));\n return this.#getChecksumHexAddress(address);\n }\n\n #pathFromAddress(address: string): string {\n const checksummedAddress = this.#getChecksumHexAddress(address);\n let index = this.paths[checksummedAddress];\n if (typeof index === 'undefined') {\n for (let i = 0; i < MAX_INDEX; i++) {\n if (checksummedAddress === this.#addressFromIndex(pathBase, i)) {\n index = i;\n break;\n }\n }\n }\n\n if (typeof index === 'undefined') {\n throw new Error('Unknown address');\n }\n return this.#getPathForIndex(index);\n }\n\n #getPathForIndex(index: number): string {\n // Check if the path is BIP 44 (Ledger Live)\n return this.#isLedgerLiveHdPath()\n ? `m/44'/60'/${index}'/0/0`\n : `${this.hdPath}/${index}`;\n }\n\n #isLedgerLiveHdPath(): boolean {\n return this.hdPath === `m/44'/60'/0'/0/0`;\n }\n\n #toLedgerPath(path: string): string {\n return path.toString().replace('m/', '');\n }\n\n async #hasPreviousTransactions(address: string): Promise<boolean> {\n const apiUrl = this.#getApiUrl();\n const response = await window.fetch(\n `${apiUrl}/api?module=account&action=txlist&address=${address}&tag=latest&page=1&offset=1`,\n );\n const parsedResponse = await response.json();\n return parsedResponse.status !== '0' && parsedResponse.result.length > 0;\n }\n\n #getApiUrl(): NetworkApiUrls {\n return this.network;\n }\n\n #getChecksumHexAddress(address: string): Hex {\n return getChecksumAddress(add0x(address));\n }\n\n /**\n * Parses the recovery parameter (`v`) returned by a Ledger device.\n * Ledger may return `v` as a number, a `0x`-prefixed hex string, a bare hex\n * string (e.g. `'1b'` for 27), or a decimal string.\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The recovery parameter as a number.\n */\n #parseLedgerRecoveryParam(recoveryParam: string | number): number {\n if (typeof recoveryParam === 'number') {\n return recoveryParam;\n }\n\n const value = String(recoveryParam).trim();\n\n if (value.startsWith('0x') || value.startsWith('0X')) {\n if (!isStrictHexString(value)) {\n throw new Error(`Invalid hex recovery parameter: \"${recoveryParam}\"`);\n }\n return hexToNumber(value);\n }\n\n // If the string contains hex letters (a-f), interpret it as hex;\n // otherwise interpret it as a regular decimal number.\n const radix = /[a-f]/iu.test(value) ? 16 : 10;\n const result = parseInt(value, radix);\n\n if (Number.isNaN(result)) {\n throw new Error(`Invalid recovery parameter: \"${recoveryParam}\"`);\n }\n\n return result;\n }\n\n /**\n * Normalizes the signature recovery parameter (v) to legacy format.\n * Ledger devices may return v as 0 or 1 (modern format), but signature\n * recovery expects 27 or 28 (legacy format per EIP-191/EIP-712).\n *\n * @param recoveryParam - The recovery parameter from Ledger.\n * @returns The normalized recovery parameter as a hex string.\n */\n #normalizeRecoveryParam(recoveryParam: number): string {\n if (recoveryParam === 0 || recoveryParam === 1) {\n return (recoveryParam + 27).toString(16);\n }\n return recoveryParam.toString(16);\n }\n\n /**\n * Normalizes the signature recovery parameter (`v`) to yParity format and\n * returns it as a 2-character hex string suitable for appending to a signature.\n *\n * Ledger devices may return `v` as 0/1 (yParity) or 27/28 (legacy). EIP-7702\n * authorization signatures require the yParity value (0 or 1), unlike\n * EIP-191/EIP-712 signatures which use the legacy format (27 or 28).\n *\n * @param recoveryParam - The parsed recovery parameter from Ledger.\n * @returns The yParity as a 2-character lowercase hex string ('00' or '01').\n */\n #normalizeYParity(recoveryParam: number): string {\n const yParity =\n recoveryParam === 0 || recoveryParam === 1\n ? recoveryParam\n : recoveryParam - 27;\n return yParity.toString(16).padStart(2, '0');\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/eth-ledger-bridge-keyring",
3
- "version": "12.2.0-6bf9188",
3
+ "version": "12.2.0-e51c895",
4
4
  "description": "A MetaMask compatible keyring, for ledger hardware wallets",
5
5
  "keywords": [
6
6
  "ethereum",
@@ -77,7 +77,7 @@
77
77
  "@ledgerhq/hw-app-eth": "^6.42.0",
78
78
  "@ledgerhq/hw-transport": "^6.31.3",
79
79
  "@metamask/eth-sig-util": "^8.2.0",
80
- "@metamask/hw-wallet-sdk": "0.8.0",
80
+ "@metamask/hw-wallet-sdk": "0.9.0",
81
81
  "@metamask/keyring-api": "23.3.0",
82
82
  "@metamask/keyring-sdk": "2.2.0",
83
83
  "hdkey": "^2.1.0",