Repository: OneKeyHQ/hardware-js-sdk
Pull request #454: Feat/btc address
Author: login: ByteZhang1024
Created: 2025-04-24T01:29:23Z | Merged: 2025-04-29T02:25:40Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added support for specifying transaction type when signing Aptos transactions, with enhanced version checks for new transaction types.
  - Introduced batch processing for Bitcoin public key retrieval, improving efficiency and scalability.
  - Added utility for generating extended Bitcoin public keys in various formats.

- **Improvements**
  - Expanded data structures for batch public key requests and responses, including additional node and fingerprint information.
  - Updated sample data to include new transaction types and batch address retrieval examples.
  - Added minimum firmware version requirement for Cardano Conway support on Classic devices.

- **Chores**
  - Updated package versions and dependencies across multiple packages to ensure compatibility with the latest release.
  - Updated firmware submodule to the latest commit.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/packages/connect-examples/electron-example/package.json b/packages/connect-examples/electron-example/package.json
index e3b1004c7..56cc0956e 100644
--- a/packages/connect-examples/electron-example/package.json
+++ b/packages/connect-examples/electron-example/package.json
@@ -2,7 +2,7 @@
   "name": "hardware-example",
   "productName": "HardwareExample",
   "executableName": "onekey-hardware-example",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "author": "OneKey",
   "description": "End-to-end encrypted workspaces for teams",
   "main": "dist/index.js",
diff --git a/packages/connect-examples/expo-example/package.json b/packages/connect-examples/expo-example/package.json
index b75e77e6f..897e9ea7d 100644
--- a/packages/connect-examples/expo-example/package.json
+++ b/packages/connect-examples/expo-example/package.json
@@ -1,6 +1,6 @@
 {
   "name": "expo-example",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "scripts": {
     "start": "CONNECT_SRC=https://localhost:8087/ yarn expo start --dev-client",
     "android": "yarn expo run:android",
@@ -19,10 +19,10 @@
     "@noble/ed25519": "^2.1.0",
     "@noble/hashes": "^1.3.3",
     "@noble/secp256k1": "^1.7.1",
-    "@onekeyfe/hd-ble-sdk": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-common-connect-sdk": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-core": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-web-sdk": "^1.0.26-alpha.0",
+    "@onekeyfe/hd-ble-sdk": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-common-connect-sdk": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-core": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-web-sdk": "^1.0.26-alpha.1",
     "@onekeyfe/react-native-ble-utils": "^0.1.3",
     "@polkadot/util-crypto": "13.1.1",
     "@react-native-async-storage/async-storage": "1.21.0",
diff --git a/packages/connect-examples/expo-example/src/data/aptos.ts b/packages/connect-examples/expo-example/src/data/aptos.ts
index 1eaf09b9d..584d532de 100644
--- a/packages/connect-examples/expo-example/src/data/aptos.ts
+++ b/packages/connect-examples/expo-example/src/data/aptos.ts
@@ -96,6 +96,15 @@ const api: PlaygroundProps[] = [
             '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
         },
       },
+      {
+        title: 'Sign transaction with transaction type',
+        value: {
+          path: "m/44'/637'/0'/0'/0'",
+          transactionType: 1,
+          rawTx:
+            '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
+        },
+      },
     ],
   },
 ];
diff --git a/packages/connect-examples/expo-example/src/data/bitcoin.ts b/packages/connect-examples/expo-example/src/data/bitcoin.ts
index a2f534989..12e069be8 100644
--- a/packages/connect-examples/expo-example/src/data/bitcoin.ts
+++ b/packages/connect-examples/expo-example/src/data/bitcoin.ts
@@ -17,31 +17,47 @@ const api: PlaygroundProps[] = [
         title: 'Batch Get Address',
         value: {
           bundle: [
-            {
-              path: "m/44'/0'/0'/0/0",
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/44'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/1",
-              coin: 'btc',
-              showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/2",
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Address segwit_p2sh',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/49'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/3",
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Address segwit_native',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/84'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/4",
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Address taproot',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/86'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
+            })),
           ],
         },
       },
@@ -63,21 +79,47 @@ const api: PlaygroundProps[] = [
         title: 'Batch Get Public Key',
         value: {
           bundle: [
-            {
-              path: "m/44'/0'/0'/0/0",
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/44'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/2",
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Public Key segwit_p2sh',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/49'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
-            {
-              path: "m/44'/0'/0'/0/3",
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Public Key segwit_native',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/84'/0'/0'/0/${i}`,
               coin: 'btc',
               showOnOneKey: false,
-            },
+            })),
+          ],
+        },
+      },
+      {
+        title: 'Batch Get Public Key taproot',
+        value: {
+          bundle: [
+            ...Array.from({ length: 10 }, (_, i) => ({
+              path: `m/86'/0'/0'/0/${i}`,
+              coin: 'btc',
+              showOnOneKey: false,
+            })),
           ],
         },
       },
diff --git a/packages/core/package.json b/packages/core/package.json
index 2f4e4c381..fcead24e1 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-core",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "description": "> TODO: description",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
     "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
   },
   "dependencies": {
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport": "^1.0.26-alpha.0",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport": "^1.0.26-alpha.1",
     "axios": "^0.27.2",
     "bignumber.js": "^9.0.2",
     "bytebuffer": "^5.0.1",
diff --git a/packages/core/src/api/aptos/AptosSignTransaction.ts b/packages/core/src/api/aptos/AptosSignTransaction.ts
index db5159ffb..b84a34097 100644
--- a/packages/core/src/api/aptos/AptosSignTransaction.ts
+++ b/packages/core/src/api/aptos/AptosSignTransaction.ts
@@ -1,4 +1,4 @@
-import { AptosSignTx as HardwareAptosSignTx } from '@onekeyfe/hd-transport';
+import { AptosTransactionType, AptosSignTx as HardwareAptosSignTx } from '@onekeyfe/hd-transport';
 import { UI_REQUEST } from '../../constants/ui-request';
 import { validatePath } from '../helpers/pathUtils';
 import { BaseMethod } from '../BaseMethod';
@@ -14,9 +14,10 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     validateParams(this.payload, [
       { name: 'path', required: true },
       { name: 'rawTx', type: 'hexString', required: true },
+      { name: 'transactionType', type: 'number', required: false },
     ]);
 
-    const { path, rawTx } = this.payload;
+    const { path, rawTx, transactionType } = this.payload;
 
     const addressN = validatePath(path, 3);
 
@@ -24,6 +25,7 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     this.params = {
       address_n: addressN,
       raw_tx: formatAnyHex(rawTx),
+      tx_type: transactionType,
     };
   }
 
@@ -35,7 +37,31 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     };
   }
 
+  getWithDataVersionRange() {
+    return {
+      pro: {
+        min: '4.14.0',
+      },
+      model_classic1s: {
+        min: '3.12.0',
+      },
+      classic: {
+        min: '3.10.0',
+      },
+    };
+  }
+
+  checkWithDataError() {
+    const { transactionType } = this.payload;
+    this.checkFeatureVersionLimit(
+      () => transactionType === 1,
+      () => this.getWithDataVersionRange()
+    );
+  }
+
   async run() {
+    this.checkWithDataError();
+
     const res = await this.device.commands.typedCall('AptosSignTx', 'AptosSignedTx', {
       ...this.params,
     });
diff --git a/packages/core/src/api/btc/BTCGetPublicKey.ts b/packages/core/src/api/btc/BTCGetPublicKey.ts
index 2821bf3f3..b568e3724 100644
--- a/packages/core/src/api/btc/BTCGetPublicKey.ts
+++ b/packages/core/src/api/btc/BTCGetPublicKey.ts
@@ -1,4 +1,4 @@
-import { GetPublicKey } from '@onekeyfe/hd-transport';
+import type { GetPublicKey } from '@onekeyfe/hd-transport';
 import { UI_REQUEST } from '../../constants/ui-request';
 import { getScriptType, isTaprootPath, serializedPath, validatePath } from '../helpers/pathUtils';
 import { BaseMethod } from '../BaseMethod';
@@ -7,6 +7,8 @@ import { BTCGetAddressParams } from '../../types/api/btcGetAddress';
 import { getCoinInfo } from './helpers/btcParamsUtils';
 import { BTCPublicKey } from '../../types/api/btcGetPublicKey';
 import { getBitcoinForkVersionRange } from './helpers/versionLimit';
+import { batchGetPublickeys } from '../helpers/batchGetPublickeys';
+import { createExtendedPublicKey } from './helpers/xpubUtils';
 
 export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
   hasBundle = false;
@@ -64,31 +66,79 @@ export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
   }
 
   async run() {
-    const responses: BTCPublicKey[] = [];
+    let responses: BTCPublicKey[] = [];
 
-    for (let i = 0; i < this.params.length; i++) {
-      const param = this.params[i];
+    try {
+      const existsShowDisplay = this.params.some(param => param.show_display);
+      if (existsShowDisplay || !this.hasBundle) {
+        throw new Error('Goto getPublickey');
+      }
 
-      const res = await this.device.commands.typedCall('GetPublicKey', 'PublicKey', {
-        ...param,
+      const res = await batchGetPublickeys(this.device, this.params, 'secp256k1', 0, {
+        includeNode: true,
+        ignoreCoinType: true,
       });
 
-      const response = {
-        path: serializedPath(param.address_n),
-        ...res.message,
-        xpubSegwit: res.message.xpub,
-      };
-
-      if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
-        // wrap regular xpub into bitcoind native descriptor
-        const fingerprint = Number(response.root_fingerprint || 0)
-          .toString(16)
-          .padStart(8, '0');
-        const descriptorPath = `${fingerprint}${response.path.substring(1)}`;
-        response.xpubSegwit = `tr([${descriptorPath}]${response.xpub}/<0;1>/*)`;
+      if (!res.message?.hd_nodes || this.params.length !== res.message.hd_nodes.length) {
+        throw new Error('Invalid response from Publickeys');
       }
 
-      responses.push(response);
+      for (let i = 0; i < this.params.length; i++) {
+        const param = this.params[i];
+        const node = res.message.hd_nodes[i];
+
+        const path = serializedPath(param.address_n);
+
+        const xpub = createExtendedPublicKey(node, param.script_type);
+
+        const rootFingerprint = res.message.root_fingerprint;
+
+        let xpubSegwit = xpub;
+        if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
+          // wrap regular xpub into bitcoind native descriptor
+          const fingerprint = Number(rootFingerprint || 0)
+            .toString(16)
+            .padStart(8, '0');
+          const descriptorPath = `${fingerprint}${path.substring(1)}`;
+          xpubSegwit = `tr([${descriptorPath}]${xpub}/<0;1>/*)`;
+        }
+
+        responses.push({
+          path,
+          node,
+          xpub,
+          root_fingerprint: rootFingerprint,
+          xpubSegwit,
+        });
+      }
+    } catch (error) {
+      // clear responses
+      responses = [];
+
+      for (let i = 0; i < this.params.length; i++) {
+        const param = this.params[i];
+
+        const res = await this.device.commands.typedCall('GetPublicKey', 'PublicKey', {
+          ...param,
+        });
+
+        const response = {
+          path: serializedPath(param.address_n),
+          ...res.message,
+          xpubSegwit: res.message.xpub,
+        };
+
+        if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
+          // wrap regular xpub into bitcoind native descriptor
+          const fingerprint = Number(response.root_fingerprint || 0)
+            .toString(16)
+            .padStart(8, '0');
+          const descriptorPath = `${fingerprint}${response.path.substring(1)}`;
+          response.xpubSegwit = `tr([${descriptorPath}]${response.xpub}/<0;1>/*)`;
+        }
+
+        responses.push(response);
+      }
     }
 
     validateResult(responses, ['xpub'], {
diff --git a/packages/core/src/api/btc/helpers/xpubUtils.ts b/packages/core/src/api/btc/helpers/xpubUtils.ts
new file mode 100644
index 000000000..57ddf5bc8
--- /dev/null
+++ b/packages/core/src/api/btc/helpers/xpubUtils.ts
@@ -0,0 +1,85 @@
+import { sha256 } from '@noble/hashes/sha256';
+import type { HDNodeType, InputScriptType } from '@onekeyfe/hd-transport';
+
+// 定义版本字节常量
+const VERSION_BYTES = {
+  // xpub - (SPENDADDRESS, SPENDMULTISIG)
+  XPUB: 0x0488b21e,
+  // ypub - (SPENDP2SHWITNESS)
+  YPUB: 0x049d7cb2,
+  // zpub - (SPENDWITNESS)
+  ZPUB: 0x04b24746,
+};
+
+function getVersionBytes(scriptType?: InputScriptType): number {
+  switch (scriptType) {
+    case 'SPENDADDRESS':
+    case 'SPENDMULTISIG':
+      return VERSION_BYTES.XPUB;
+    case 'SPENDP2SHWITNESS':
+      return VERSION_BYTES.YPUB;
+    case 'SPENDWITNESS':
+      return VERSION_BYTES.ZPUB;
+    default:
+      return VERSION_BYTES.XPUB;
+  }
+}
+
+function base58Check(data: Buffer): string {
+  const checksum = sha256(sha256(new Uint8Array(data))).slice(0, 4);
+  const withChecksum = Buffer.concat([new Uint8Array(data), new Uint8Array(checksum)]);
+  const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+
+  let result = '';
+  let num = BigInt(`0x${withChecksum.toString('hex')}`);
+  const base = BigInt(58);
+
+  while (num > 0) {
+    const mod = Number(num % base);
+    num /= base;
+    result = ALPHABET[mod] + result;
+  }
+
+  // 处理前导零字节
+  for (let i = 0; i < withChecksum.length; i++) {
+    if (withChecksum[i] === 0) {
+      result = `1${result}`;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+}
+
+function generateExtendedPublicKey(
+  depth: number,
+  fingerprint: number,
+  childNum: number,
+  chainCode: string,
+  publicKey: string,
+  scriptType?: InputScriptType
+): string {
+  const versionBytes = getVersionBytes(scriptType);
+
+  const buffer = Buffer.alloc(78);
+  buffer.writeUInt32BE(versionBytes, 0);
+  buffer.writeUInt8(depth, 4);
+  buffer.writeUInt32BE(fingerprint, 5);
+  buffer.writeUInt32BE(childNum, 9);
+  buffer.write(chainCode, 13, 'hex');
+  buffer.write(publicKey, 45, 'hex');
+
+  return base58Check(buffer);
+}
+
+export function createExtendedPublicKey(node: HDNodeType, scriptType?: InputScriptType): string {
+  return generateExtendedPublicKey(
+    node.depth,
+    node.fingerprint,
+    node.child_num,
+    node.chain_code,
+    node.public_key,
+    scriptType
+  );
+}
diff --git a/packages/core/src/api/cardano/CardanoSignTransaction.ts b/packages/core/src/api/cardano/CardanoSignTransaction.ts
index f5c42b116..d464606a0 100644
--- a/packages/core/src/api/cardano/CardanoSignTransaction.ts
+++ b/packages/core/src/api/cardano/CardanoSignTransaction.ts
@@ -228,6 +228,9 @@ export default class CardanoSignTransaction extends BaseMethod<any> {
     touch: {
       min: '4.10.0',
     },
+    classic: {
+      min: '3.10.0',
+    },
   });
 
   checkSupportConway = () => {
diff --git a/packages/core/src/api/helpers/batchGetPublickeys.ts b/packages/core/src/api/helpers/batchGetPublickeys.ts
index adedfb128..bcd2d9fb4 100644
--- a/packages/core/src/api/helpers/batchGetPublickeys.ts
+++ b/packages/core/src/api/helpers/batchGetPublickeys.ts
@@ -9,25 +9,30 @@ export function batchGetPublickeys(
   device: Device,
   paths: Path[],
   ecdsaCurveName: string,
-  coinType: number
+  coinType: number,
+  options?: {
+    includeNode?: boolean;
+    ignoreCoinType?: boolean;
+  }
 ) {
   const existsPathNotValid = paths.find(p => p.address_n.length < 3);
   if (existsPathNotValid) {
     throw TypedError(HardwareErrorCode.ForbiddenKeyPath, 'Path length must be greater than 3');
   }
 
-  const supportsBatchPublicKey = supportBatchPublicKey(device.features);
+  const supportsBatchPublicKey = supportBatchPublicKey(device.features, options);
   if (!supportsBatchPublicKey) {
     throw TypedError(HardwareErrorCode.DeviceNotSupportMethod);
   }
 
   const existsPathNotEqualCoinType = paths.find(p => !isEqualBip44CoinType(p.address_n, coinType));
-  if (existsPathNotEqualCoinType) {
+  if (options?.ignoreCoinType === false && existsPathNotEqualCoinType) {
     throw TypedError(HardwareErrorCode.ForbiddenKeyPath);
   }
 
   return device.commands.typedCall('BatchGetPublickeys', 'EcdsaPublicKeys', {
     paths,
     ecdsa_curve_name: ecdsaCurveName,
+    include_node: options?.includeNode ?? false,
   });
 }
diff --git a/packages/core/src/data/messages/messages.json b/packages/core/src/data/messages/messages.json
index f258156ac..9d98f690c 100644
--- a/packages/core/src/data/messages/messages.json
+++ b/packages/core/src/data/messages/messages.json
@@ -250,6 +250,21 @@
           "rule": "required",
           "type": "bytes",
           "id": 2
+        },
+        "tx_type": {
+          "type": "AptosTransactionType",
+          "id": 3,
+          "options": {
+            "default": "STANDARD"
+          }
+        }
+      },
+      "nested": {
+        "AptosTransactionType": {
+          "values": {
+            "STANDARD": 0,
+            "WITH_DATA": 1
+          }
         }
       }
     },
@@ -3569,6 +3584,13 @@
           "rule": "repeated",
           "type": "Path",
           "id": 2
+        },
+        "include_node": {
+          "type": "bool",
+          "id": 3,
+          "options": {
+            "default": false
+          }
         }
       },
       "nested": {
@@ -3592,6 +3614,15 @@
           "rule": "repeated",
           "type": "bytes",
           "id": 1
+        },
+        "hd_nodes": {
+          "rule": "repeated",
+          "type": "HDNodeType",
+          "id": 2
+        },
+        "root_fingerprint": {
+          "type": "uint32",
+          "id": 3
         }
       }
     },
diff --git a/packages/core/src/types/api/aptosSignTransaction.ts b/packages/core/src/types/api/aptosSignTransaction.ts
index cf4684dbf..edecd9733 100644
--- a/packages/core/src/types/api/aptosSignTransaction.ts
+++ b/packages/core/src/types/api/aptosSignTransaction.ts
@@ -1,4 +1,7 @@
-import { AptosSignedTx as HardwareAptosSignedTx } from '@onekeyfe/hd-transport';
+import {
+  AptosSignedTx as HardwareAptosSignedTx,
+  AptosTransactionType,
+} from '@onekeyfe/hd-transport';
 import type { CommonParams, Response } from '../params';
 
 export type AptosSignedTx = {
@@ -8,6 +11,7 @@ export type AptosSignedTx = {
 export type AptosSignTransactionParams = {
   path: string | number[];
   rawTx?: string;
+  transactionType?: AptosTransactionType;
 };
 
 export declare function aptosSignTransaction(
diff --git a/packages/core/src/utils/deviceFeaturesUtils.ts b/packages/core/src/utils/deviceFeaturesUtils.ts
index a406fbb45..bcd76293d 100644
--- a/packages/core/src/utils/deviceFeaturesUtils.ts
+++ b/packages/core/src/utils/deviceFeaturesUtils.ts
@@ -116,11 +116,28 @@ export const getPassphraseState = async (
   return message.address;
 };
 
-export const supportBatchPublicKey = (features?: Features): boolean => {
+export const supportBatchPublicKey = (
+  features?: Features,
+  options?: {
+    includeNode?: boolean;
+  }
+): boolean => {
   if (!features) return false;
   const currentVersion = getDeviceFirmwareVersion(features).join('.');
 
   const deviceType = getDeviceType(features);
+  // btc batch get public key
+  if (!!options?.includeNode && deviceType === EDeviceType.Pro) {
+    return semver.gte(currentVersion, '4.14.0');
+  }
+  if (!!options?.includeNode && DeviceModelToTypes.model_classic1s.includes(deviceType)) {
+    return semver.gte(currentVersion, '3.12.0');
+  }
+  if (!!options?.includeNode && deviceType === EDeviceType.Classic) {
+    return semver.gte(currentVersion, '3.10.0');
+  }
+
+  // support batch get public key
   if (deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro) {
     return semver.gte(currentVersion, '3.1.0');
   }
diff --git a/packages/hd-ble-sdk/package.json b/packages/hd-ble-sdk/package.json
index f0c7b98c0..980662b90 100644
--- a/packages/hd-ble-sdk/package.json
+++ b/packages/hd-ble-sdk/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-ble-sdk",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "ISC",
@@ -20,8 +20,8 @@
     "lint:fix": "eslint . --fix"
   },
   "dependencies": {
-    "@onekeyfe/hd-core": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-react-native": "^1.0.26-alpha.0"
+    "@onekeyfe/hd-core": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-react-native": "^1.0.26-alpha.1"
   }
 }
diff --git a/packages/hd-common-connect-sdk/package.json b/packages/hd-common-connect-sdk/package.json
index 765d684d4..5f23cd603 100644
--- a/packages/hd-common-connect-sdk/package.json
+++ b/packages/hd-common-connect-sdk/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-common-connect-sdk",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "ISC",
@@ -20,10 +20,10 @@
     "lint:fix": "eslint . --fix"
   },
   "dependencies": {
-    "@onekeyfe/hd-core": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-http": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-lowlevel": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-webusb": "^1.0.26-alpha.0"
+    "@onekeyfe/hd-core": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-http": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-lowlevel": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-webusb": "^1.0.26-alpha.1"
   }
 }
diff --git a/packages/hd-transport-http/package.json b/packages/hd-transport-http/package.json
index d7858c2ab..852d281fe 100644
--- a/packages/hd-transport-http/package.json
+++ b/packages/hd-transport-http/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-transport-http",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "description": "hardware http transport",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -24,8 +24,8 @@
     "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
   },
   "dependencies": {
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport": "^1.0.26-alpha.0",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport": "^1.0.26-alpha.1",
     "axios": "^0.27.2"
   }
 }
diff --git a/packages/hd-transport-lowlevel/package.json b/packages/hd-transport-lowlevel/package.json
index b5f035b3c..232adce21 100644
--- a/packages/hd-transport-lowlevel/package.json
+++ b/packages/hd-transport-lowlevel/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-transport-lowlevel",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "MIT",
   "main": "dist/index.js",
@@ -19,7 +19,7 @@
     "lint:fix": "eslint . --fix"
   },
   "dependencies": {
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport": "^1.0.26-alpha.0"
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport": "^1.0.26-alpha.1"
   }
 }
diff --git a/packages/hd-transport-react-native/package.json b/packages/hd-transport-react-native/package.json
index ae890aaa2..8a145fdee 100644
--- a/packages/hd-transport-react-native/package.json
+++ b/packages/hd-transport-react-native/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-transport-react-native",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "MIT",
   "main": "dist/index.js",
@@ -19,8 +19,8 @@
     "lint:fix": "eslint . --fix"
   },
   "dependencies": {
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport": "^1.0.26-alpha.0",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport": "^1.0.26-alpha.1",
     "@onekeyfe/react-native-ble-utils": "^0.1.3",
     "react-native-ble-plx": "3.5.0"
   }
diff --git a/packages/hd-transport-webusb/package.json b/packages/hd-transport-webusb/package.json
index 503f9c04c..dab7c6592 100644
--- a/packages/hd-transport-webusb/package.json
+++ b/packages/hd-transport-webusb/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-transport-webusb",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "MIT",
@@ -20,8 +20,8 @@
     "lint:fix": "eslint . --fix"
   },
   "dependencies": {
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport": "^1.0.26-alpha.0"
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport": "^1.0.26-alpha.1"
   },
   "devDependencies": {
     "@types/w3c-web-usb": "^1.0.6",
diff --git a/packages/hd-transport/package.json b/packages/hd-transport/package.json
index bdf1ca2fc..3677f78e8 100644
--- a/packages/hd-transport/package.json
+++ b/packages/hd-transport/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-transport",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "description": "> TODO: description",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
diff --git a/packages/hd-transport/src/types/messages.ts b/packages/hd-transport/src/types/messages.ts
index 5db6a9446..154772542 100644
--- a/packages/hd-transport/src/types/messages.ts
+++ b/packages/hd-transport/src/types/messages.ts
@@ -101,10 +101,16 @@ export type AptosAddress = {
   address?: string;
 };
 
+export enum AptosTransactionType {
+  STANDARD = 0,
+  WITH_DATA = 1,
+}
+
 // AptosSignTx
 export type AptosSignTx = {
   address_n: number[];
   raw_tx: string;
+  tx_type?: AptosTransactionType;
 };
 
 // AptosSignedTx
@@ -1389,11 +1395,14 @@ export type Path = {
 export type BatchGetPublickeys = {
   ecdsa_curve_name?: string;
   paths: Path[];
+  include_node?: boolean;
 };
 
 // EcdsaPublicKeys
 export type EcdsaPublicKeys = {
   public_keys: string[];
+  hd_nodes: HDNodeType[];
+  root_fingerprint?: number;
 };
 
 // DnxGetAddress
diff --git a/packages/hd-web-sdk/package.json b/packages/hd-web-sdk/package.json
index 286d41a8a..12b20d38c 100644
--- a/packages/hd-web-sdk/package.json
+++ b/packages/hd-web-sdk/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-web-sdk",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "author": "OneKey",
   "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
   "license": "ISC",
@@ -21,10 +21,10 @@
   },
   "dependencies": {
     "@onekeyfe/cross-inpage-provider-core": "^0.0.17",
-    "@onekeyfe/hd-core": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-shared": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-http": "^1.0.26-alpha.0",
-    "@onekeyfe/hd-transport-webusb": "^1.0.26-alpha.0"
+    "@onekeyfe/hd-core": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-shared": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-http": "^1.0.26-alpha.1",
+    "@onekeyfe/hd-transport-webusb": "^1.0.26-alpha.1"
   },
   "devDependencies": {
     "@babel/plugin-proposal-optional-chaining": "^7.17.12",
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 07958fd27..f4f08a19b 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@onekeyfe/hd-shared",
-  "version": "1.0.26-alpha.0",
+  "version": "1.0.26-alpha.1",
   "description": "Hardware SDK's shared tool library",
   "keywords": [
     "Hardware-SDK",
diff --git a/submodules/firmware b/submodules/firmware
index a08cc9e41..6b261a2e5 160000
--- a/submodules/firmware
+++ b/submodules/firmware
@@ -1 +1 @@
-Subproject commit a08cc9e4184c120f515fbf3d7c954850af957d2d
+Subproject commit 6b261a2e5b2bcf1cac29fd236a778bb925d86520


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 8**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 05cde6f4b6ca9ac3ead441f3956a37b419b50396 and 2ebd1ac2cd09d5212eef4b8be991da81c2e8d176.

</details>

<details>
<summary>📒 Files selected for processing (23)</summary>

* `packages/connect-examples/electron-example/package.json` (1 hunks)
* `packages/connect-examples/expo-example/package.json` (2 hunks)
* `packages/connect-examples/expo-example/src/data/aptos.ts` (1 hunks)
* `packages/connect-examples/expo-example/src/data/bitcoin.ts` (2 hunks)
* `packages/core/package.json` (2 hunks)
* `packages/core/src/api/aptos/AptosSignTransaction.ts` (3 hunks)
* `packages/core/src/api/btc/BTCGetPublicKey.ts` (3 hunks)
* `packages/core/src/api/btc/helpers/xpubUtils.ts` (1 hunks)
* `packages/core/src/api/helpers/batchGetPublickeys.ts` (1 hunks)
* `packages/core/src/data/messages/messages.json` (3 hunks)
* `packages/core/src/types/api/aptosSignTransaction.ts` (2 hunks)
* `packages/core/src/utils/deviceFeaturesUtils.ts` (1 hunks)
* `packages/hd-ble-sdk/package.json` (2 hunks)
* `packages/hd-common-connect-sdk/package.json` (2 hunks)
* `packages/hd-transport-http/package.json` (2 hunks)
* `packages/hd-transport-lowlevel/package.json` (2 hunks)
* `packages/hd-transport-react-native/package.json` (2 hunks)
* `packages/hd-transport-webusb/package.json` (2 hunks)
* `packages/hd-transport/package.json` (1 hunks)
* `packages/hd-transport/src/types/messages.ts` (2 hunks)
* `packages/hd-web-sdk/package.json` (2 hunks)
* `packages/shared/package.json` (1 hunks)
* `submodules/firmware` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (2)</summary>

<details>
<summary>packages/core/src/api/btc/helpers/xpubUtils.ts (1)</summary><blockquote>

<details>
<summary>packages/hd-transport/src/types/messages.ts (2)</summary>

* `InputScriptType` (297-297)
* `HDNodeType` (323-330)

</details>

</blockquote></details>
<details>
<summary>packages/core/src/api/helpers/batchGetPublickeys.ts (3)</summary><blockquote>

<details>
<summary>packages/shared/src/HardwareError.ts (2)</summary>

* `TypedError` (543-552)
* `HardwareErrorCode` (46-410)

</details>
<details>
<summary>packages/core/src/utils/deviceFeaturesUtils.ts (1)</summary>

* `supportBatchPublicKey` (119-143)

</details>
<details>
<summary>packages/core/src/api/helpers/pathUtils.ts (1)</summary>

* `isEqualBip44CoinType` (45-46)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: build (18.x)
* GitHub Check: lint (18.x)
* GitHub Check: Analyze (javascript-typescript)

</details>

<details>
<summary>🔇 Additional comments (45)</summary><blockquote>

<details>
<summary>submodules/firmware (1)</summary>

`1-1`: **Sync firmware pointer**  
Updated to commit `6b261a2e5b2bcf1cac29fd236a778bb925d86520` to align with host-side Bitcoin and Aptos feature support.  
Everything looks in order.

</details>
<details>
<summary>packages/hd-transport/package.json (1)</summary>

`3-3`: **Version bump is appropriate.**

The package version upgrade aligns with the coordinated version increments across related packages.

</details>
<details>
<summary>packages/core/src/api/btc/helpers/xpubUtils.ts (4)</summary>

`1-12`: **Good structure and clear constants definition.**

The imports and version byte constants are well-organized with helpful comments explaining each script type's purpose.

---

`14-26`: **Function handles all script types properly.**

The version byte selection logic covers all common Bitcoin script types with a sensible default.

---

`55-74`: **Extended public key generation looks correct.**

The function properly assembles all components into the standardized 78-byte format.

---

`76-85`: **Clean API design.**

The exported function provides a simple interface that handles the complexity internally.

</details>
<details>
<summary>packages/shared/package.json (1)</summary>

`3-3`: **Version update is consistent.**

The package version bump matches other packages in the monorepo.

</details>
<details>
<summary>packages/connect-examples/electron-example/package.json (1)</summary>

`5-5`: **Example project version synchronized correctly.**

The electron example project version is updated to match the core packages.

</details>
<details>
<summary>packages/core/package.json (2)</summary>

`3-3`: **Version bump looks good.**

Clean version increment from `1.0.26-alpha.0` to `1.0.26-alpha.1`.

---

`28-29`: **Dependency versions properly aligned.**

Dependencies correctly updated to match the new package version.

</details>
<details>
<summary>packages/hd-transport-lowlevel/package.json (2)</summary>

`3-3`: **Version bump is correct.**

Version properly incremented to `1.0.26-alpha.1`.

---

`22-23`: **Dependencies correctly updated.**

All dependent packages properly aligned to the new version.

</details>
<details>
<summary>packages/hd-transport-webusb/package.json (2)</summary>

`3-3`: **Version increment looks good.**

Version properly updated to `1.0.26-alpha.1`.

---

`23-24`: **Dependencies properly updated.**

Related package versions correctly aligned.

</details>
<details>
<summary>packages/hd-transport-react-native/package.json (2)</summary>

`3-3`: **Approve version bump to 1.0.26-alpha.1**

The package version aligns with the coordinated release.

---

`22-23`: **Approve dependency updates to ^1.0.26-alpha.1**

Dependencies match the updated package version.

</details>
<details>
<summary>packages/hd-transport-http/package.json (2)</summary>

`3-3`: **Approve version bump to 1.0.26-alpha.1**

This update keeps the package in sync with the release.

---

`27-28`: **Approve dependency updates to ^1.0.26-alpha.1**

Shared and transport dependencies reflect the new version.

</details>
<details>
<summary>packages/hd-common-connect-sdk/package.json (2)</summary>

`3-3`: **Approve version bump to 1.0.26-alpha.1**

Version aligns with the monorepo release.

---

`23-27`: **Approve dependency updates to ^1.0.26-alpha.1**

All related package deps match the bumped version.

</details>
<details>
<summary>packages/connect-examples/expo-example/package.json (2)</summary>

`3-3`: **Approve version bump to 1.0.26-alpha.1**

Expo example version matches the release.

---

`22-25`: **Approve dependency updates to ^1.0.26-alpha.1**

Core and SDK deps align with the new version.

</details>
<details>
<summary>packages/hd-web-sdk/package.json (2)</summary>

`3-3`: **Approve version bump to 1.0.26-alpha.1**

Web SDK version is updated as planned.

---

`24-27`: **Approve dependency updates to ^1.0.26-alpha.1**

Dependencies reflect the coordinated version bump.

</details>
<details>
<summary>packages/core/src/types/api/aptosSignTransaction.ts (2)</summary>

`1-4`: **Nice addition of the Aptos transaction type support.**

The import of `AptosTransactionType` alongside the existing `AptosSignedTx` alias is clean and follows good import practices.

---

`11-15`: **Good implementation of the optional transaction type parameter.**

Adding the optional `transactionType` parameter extends the API without breaking existing code. This follows good API design practices for backward compatibility.

</details>
<details>
<summary>packages/hd-ble-sdk/package.json (2)</summary>

`2-4`: **Version bump looks good.**

Correctly incremented from alpha.0 to alpha.1 to reflect the new features added.

---

`22-26`: **Dependencies correctly updated.**

Dependencies now consistently use the same version ^1.0.26-alpha.1, maintaining proper version alignment across the package ecosystem.

</details>
<details>
<summary>packages/connect-examples/expo-example/src/data/bitcoin.ts (3)</summary>

`19-27`: **Great refactoring of the bundle array generation.**

The use of `Array.from` with an arrow function makes the code more concise and maintainable compared to hardcoded objects. This generates 10 sequential paths elegantly.

---

`28-39`: **Consistent pattern applied to all address types.**

Good job applying the same pattern to segwit_p2sh, segwit_native, and taproot address types. This creates consistency and makes future updates easier.



Also applies to: 40-51, 52-63

---

`81-89`: **Public key batch retrieval follows the same clean pattern.**

The consistent application of the `Array.from` pattern to the public key retrieval examples for all address types improves code quality and maintainability.



Also applies to: 90-101, 102-113, 114-125

</details>
<details>
<summary>packages/core/src/api/helpers/batchGetPublickeys.ts (4)</summary>

`8-17`: **Good extension of the batchGetPublickeys API.**

The function now accepts an options object with `includeNode` and `ignoreCoinType` flags, making it more flexible while maintaining backward compatibility. Adding the coinType parameter also improves type safety.

---

`23-24`: **Properly forwarding options to supportBatchPublicKey.**

This ensures the device capability check is aware of the specific features being requested, particularly the `includeNode` option which may require newer firmware.

---

`28-31`: **Better handling of coinType validation.**

The addition of the `ignoreCoinType` flag allows for more flexible path validation when needed, while maintaining security by default.

---

`33-37`: **Device API call correctly passes the includeNode option.**

Using the nullish coalescing operator (`??`) properly defaults to `false` when the option is not provided, maintaining backward compatibility.

</details>
<details>
<summary>packages/core/src/utils/deviceFeaturesUtils.ts (3)</summary>

`119-124`: **Function signature updated with clear optional parameter**

The `supportBatchPublicKey` function now accepts an optional `options` parameter with an `includeNode` boolean property. This maintains backward compatibility while adding support for new functionality.

---

`129-135`: **New device-specific version checks added for BTC batch key retrieval**

The code adds specific firmware version checks when the `includeNode` option is enabled:
- Pro devices require 4.14.0+
- Classic1s devices require 3.12.0+

This ensures proper feature gating based on hardware capabilities.

---

`137-138`: **Helpful comment clarifies code section purpose**

The comment clearly distinguishes the new BTC batch public key logic from the original batch key support code, improving code readability.

</details>
<details>
<summary>packages/hd-transport/src/types/messages.ts (3)</summary>

`104-107`: **New enum added for Aptos transaction types**

The `AptosTransactionType` enum provides clear type definitions for standard and data-containing transactions. This supports the new transaction type functionality in Aptos.

---

`113-113`: **Extended AptosSignTx with optional transaction type field**

Added an optional `tx_type` field to support different transaction formats while maintaining backward compatibility with existing code.

---

`1398-1398`: **Added support for including node data in batch public key requests**

The optional `include_node` field enables requesting additional node information during batch public key operations, aligning with the changes in `deviceFeaturesUtils.ts`.

</details>
<details>
<summary>packages/core/src/data/messages/messages.json (3)</summary>

`254-267`: **Clean addition of Aptos transaction type support**

The new transaction type field enhances the Aptos transaction signing protocol with necessary data type differentiation. The enum has clear values that make the intent obvious.

---

`3588-3593`: **Good addition of node inclusion option**

This boolean flag lets clients optionally request node information with public keys. The default (false) maintains backward compatibility with existing clients.

---

`3618-3625`: **Proper extension of EcdsaPublicKeys message**

The new fields enhance the response structure with HD node information. This supports the batch public key feature mentioned in the summary. The root fingerprint field follows BIP-32 standards for properly identifying key paths.

</details>
<details>
<summary>packages/core/src/api/btc/BTCGetPublicKey.ts (1)</summary>

`82-85`: **Guard against partial `hd_nodes` arrays.**

You already check length, good.  
Also check that every `node` object carries the fields `depth`, `fingerprint`, `chain_code`, `public_key`. Missing fields will break `createExtendedPublicKey`.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T01:34:11Z
user: login: originalix
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-29T02:23:00Z

Review comments:
diff_hunk: @@ -0,0 +1,85 @@
+import { sha256 } from '@noble/hashes/sha256';
+import type { HDNodeType, InputScriptType } from '@onekeyfe/hd-transport';
+
+// 定义版本字节常量
+const VERSION_BYTES = {
+  // xpub - (SPENDADDRESS, SPENDMULTISIG)
+  XPUB: 0x0488b21e,
+  // ypub - (SPENDP2SHWITNESS)
+  YPUB: 0x049d7cb2,
+  // zpub - (SPENDWITNESS)
+  ZPUB: 0x04b24746,
+};
+
+function getVersionBytes(scriptType?: InputScriptType): number {
+  switch (scriptType) {
+    case 'SPENDADDRESS':
+    case 'SPENDMULTISIG':
+      return VERSION_BYTES.XPUB;
+    case 'SPENDP2SHWITNESS':
+      return VERSION_BYTES.YPUB;
+    case 'SPENDWITNESS':
+      return VERSION_BYTES.ZPUB;
+    default:
+      return VERSION_BYTES.XPUB;
+  }
+}
+
+function base58Check(data: Buffer): string {
+  const checksum = sha256(sha256(new Uint8Array(data))).slice(0, 4);
+  const withChecksum = Buffer.concat([new Uint8Array(data), new Uint8Array(checksum)]);
+  const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+
+  let result = '';
+  let num = BigInt(`0x${withChecksum.toString('hex')}`);
+  const base = BigInt(58);
+
+  while (num > 0) {
+    const mod = Number(num % base);
+    num /= base;
+    result = ALPHABET[mod] + result;
+  }
+
+  // 处理前导零字节
+  for (let i = 0; i < withChecksum.length; i++) {
+    if (withChecksum[i] === 0) {
+      result = `1${result}`;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+}
path: packages/core/src/api/btc/helpers/xpubUtils.ts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Consider optimizing the base58Check encoding.**

The implementation works but could be more efficient when handling leading zeros.


```diff
- // 处理前导零字节
- for (let i = 0; i < withChecksum.length; i++) {
-   if (withChecksum[i] === 0) {
-     result = `1${result}`;
-   } else {
-     break;
-   }
- }
+ // 处理前导零字节
+ const leadingZeros = withChecksum.findIndex(byte => byte !== 0);
+ if (leadingZeros > 0) {
+   result = '1'.repeat(leadingZeros) + result;
+ }
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
function base58Check(data: Buffer): string {
  const checksum = sha256(sha256(new Uint8Array(data))).slice(0, 4);
  const withChecksum = Buffer.concat([new Uint8Array(data), new Uint8Array(checksum)]);
  const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

  let result = '';
  let num = BigInt(`0x${withChecksum.toString('hex')}`);
  const base = BigInt(58);

  while (num > 0) {
    const mod = Number(num % base);
    num /= base;
    result = ALPHABET[mod] + result;
  }

  // 处理前导零字节
  const leadingZeros = withChecksum.findIndex(byte => byte !== 0);
  if (leadingZeros > 0) {
    result = '1'.repeat(leadingZeros) + result;
  }

  return result;
}
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -96,6 +96,15 @@ const api: PlaygroundProps[] = [
             '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
         },
       },
+      {
+        title: 'Sign transaction with transaction type',
+        value: {
+          path: "m/44'/637'/0'/0'/0'",
+          transactionType: 1,
+          rawTx:
+            '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
+        },
+      },
path: packages/connect-examples/expo-example/src/data/aptos.ts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add comment explaining the transaction type value.**

New example correctly shows how to use the transaction type field. Consider adding a brief comment explaining what transaction type `1` means (WITH_DATA).

```diff
 {
   title: 'Sign transaction with transaction type',
   value: {
     path: "m/44'/637'/0'/0'/0'",
+    // Transaction type 1 represents WITH_DATA transaction type
     transactionType: 1,
     rawTx:
       '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
   },
 },
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
      {
        title: 'Sign transaction with transaction type',
        value: {
          path: "m/44'/637'/0'/0'/0'",
          // Transaction type 1 represents WITH_DATA transaction type
          transactionType: 1,
          rawTx:
            '4301355cc18d85809872bcbd63cb6ea5ac3c2814a1bacf2e50d8ec62367211917b79ecd1f1a98fa0d793d7cb92ebd9a479dc6aba0ae8570253aa87c0da32db5ed2bd401f3bbee52c2bc55761fd8486fae2e28f46499282f4267b8b90fc8c1cc97bb659b6cc927f2ec1701ef2928ddb84759ba5c557f549db',
        },
      },
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1389,11 +1395,14 @@ export type Path = {
 export type BatchGetPublickeys = {
   ecdsa_curve_name?: string;
   paths: Path[];
+  include_node?: boolean;
 };
 
 // EcdsaPublicKeys
 export type EcdsaPublicKeys = {
   public_keys: string[];
+  hd_nodes: HDNodeType[];
+  root_fingerprint?: number;
path: packages/hd-transport/src/types/messages.ts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Enhanced EcdsaPublicKeys type with additional node information**

Added fields to support the extended batch public key functionality:
- `hd_nodes`: Array of hierarchical deterministic nodes
- `root_fingerprint`: Optional identifying fingerprint for the root node

These changes support the Bitcoin address generation flow with more complete node data.

Consider making `hd_nodes` optional to maintain better backward compatibility with existing code that may not expect this field.

```diff
-  hd_nodes: HDNodeType[];
+  hd_nodes?: HDNodeType[];
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  hd_nodes?: HDNodeType[];
  root_fingerprint?: number;
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -35,7 +37,28 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     };
   }
 
+  getWithDataVersionRange() {
+    return {
+      pro: {
+        min: '4.14.0',
+      },
+      model_classic1s: {
+        min: '3.12.0',
+      },
+    };
+  }
+
+  checkWithDataError() {
+    const { transactionType } = this.payload;
+    this.checkFeatureVersionLimit(
+      () => transactionType === 1,
+      () => this.getWithDataVersionRange()
+    );
+  }
path: packages/core/src/api/aptos/AptosSignTransaction.ts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Minor: early-exit reads clearer than nested callbacks.**

`checkWithDataError` is neat, but an early `if (transactionType !== 1) return;` could spare the extra lambda dance.  
No action needed; just a readability thought.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -14,16 +14,18 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     validateParams(this.payload, [
       { name: 'path', required: true },
       { name: 'rawTx', type: 'hexString', required: true },
+      { name: 'transactionType', type: 'number', required: false },
     ]);
 
-    const { path, rawTx } = this.payload;
+    const { path, rawTx, transactionType } = this.payload;
 
     const addressN = validatePath(path, 3);
 
     // init params
     this.params = {
       address_n: addressN,
       raw_tx: formatAnyHex(rawTx),
+      tx_type: transactionType,
     };
   }
path: packages/core/src/api/aptos/AptosSignTransaction.ts
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Don’t send `undefined` into protobuf.**

`tx_type` is always attached, even when `transactionType` is absent.  
Protobuf encoders may serialize that as `0`, which changes the meaning.

```diff
-    this.params = {
-      address_n: addressN,
-      raw_tx: formatAnyHex(rawTx),
-      tx_type: transactionType,
-    };
+    this.params = {
+      address_n: addressN,
+      raw_tx: formatAnyHex(rawTx),
+    };
+
+    if (transactionType !== undefined) {
+      this.params.tx_type = transactionType;
+    }
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
    this.params = {
      address_n: addressN,
      raw_tx: formatAnyHex(rawTx),
    };

    if (transactionType !== undefined) {
      this.params.tx_type = transactionType;
    }
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -14,16 +14,18 @@ export default class AptosSignTransaction extends BaseMethod<HardwareAptosSignTx
     validateParams(this.payload, [
       { name: 'path', required: true },
       { name: 'rawTx', type: 'hexString', required: true },
+      { name: 'transactionType', type: 'number', required: false },
     ]);
path: packages/core/src/api/aptos/AptosSignTransaction.ts
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Validate enum value, not just “number”.**

`transactionType` should only accept the values defined in `AptosTransactionType` (0 or 1).  
Right now any number slips through. That will confuse the firmware.

```diff
-    validateParams(this.payload, [
+    validateParams(this.payload, [
       { name: 'path', required: true },
       { name: 'rawTx', type: 'hexString', required: true },
-      { name: 'transactionType', type: 'number', required: false },
+      {
+        name: 'transactionType',
+        type: 'number',
+        required: false,
+        validate: v => v === undefined || Object.values(AptosTransactionType).includes(v),
+      },
     ]);
```

---

🏁 Script executed:

```shell
#!/bin/bash
# Locate validateParams implementation and its parameter type
rg "function validateParams" -n -C3
rg "interface ValidateParam" -n -C3
# Locate the enum for transactionType
rg "enum AptosTransactionType" -n -C3
```

Length of output: 545

---

🏁 Script executed:

```shell
#!/bin/bash
# Find validateParams declarations and usages
rg "export function validateParams" -n -C3
rg "export declare function validateParams" -n -C3
rg "type ValidateParam" -n -C3
rg "interface ValidateParam" -n -C3
rg "validateParams" -n -C3
```

Length of output: 68782

---

🏁 Script executed:

```shell
#!/bin/bash
# Display imports and validateParams call in AptosSignTransaction.ts
echo "=== AptosSignTransaction.ts (top) ==="
sed -n '1,50p' packages/core/src/api/aptos/AptosSignTransaction.ts

# Show validateParams implementation and its supported options
echo "=== paramsValidator.ts (validateParams) ==="
sed -n '1,200p' packages/core/src/api/helpers/paramsValidator.ts
```

Length of output: 6311

---



</details>

**Validate `transactionType` against `AptosTransactionType`**

You need to enforce that `transactionType` is one of the enum values (0 or 1). A custom `validate` callback isn’t supported by `validateParams`, so add an explicit check after your existing parameter validation.

• File: packages/core/src/api/aptos/AptosSignTransaction.ts  
• Method: init()

Suggested change:

```diff
     // check payload
     validateParams(this.payload, [
       { name: 'path', required: true },
       { name: 'rawTx', type: 'hexString', required: true },
-      { name: 'transactionType', type: 'number', required: false },
+      { name: 'transactionType', type: 'number', required: false },
     ]);

     const { path, rawTx, transactionType } = this.payload;

+    // Ensure transactionType is a valid enum value
+    if (
+      transactionType !== undefined &&
+      !Object.values(AptosTransactionType).includes(transactionType)
+    ) {
+      throw ERRORS.TypedError(
+        HardwareErrorCode.CallMethodInvalidParameter,
+        `Invalid parameter: transactionType`
+      );
+    }
```

This guarantees the firmware never receives an unexpected number.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -64,31 +66,79 @@ export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
   }
 
   async run() {
-    const responses: BTCPublicKey[] = [];
+    let responses: BTCPublicKey[] = [];
 
-    for (let i = 0; i < this.params.length; i++) {
-      const param = this.params[i];
+    try {
+      const existsShowDisplay = this.params.some(param => param.show_display);
+      if (existsShowDisplay || !this.hasBundle) {
+        throw new Error('Goto getPublickey');
+      }
 
-      const res = await this.device.commands.typedCall('GetPublicKey', 'PublicKey', {
-        ...param,
+      const res = await batchGetPublickeys(this.device, this.params, 'secp256k1', 0, {
+        includeNode: true,
+        ignoreCoinType: true,
       });
 
-      const response = {
-        path: serializedPath(param.address_n),
-        ...res.message,
-        xpubSegwit: res.message.xpub,
-      };
-
-      if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
-        // wrap regular xpub into bitcoind native descriptor
-        const fingerprint = Number(response.root_fingerprint || 0)
-          .toString(16)
-          .padStart(8, '0');
-        const descriptorPath = `${fingerprint}${response.path.substring(1)}`;
-        response.xpubSegwit = `tr([${descriptorPath}]${response.xpub}/<0;1>/*)`;
+      if (!res.message?.hd_nodes || this.params.length !== res.message.hd_nodes.length) {
+        throw new Error('Invalid response from Publickeys');
       }
 
-      responses.push(response);
+      for (let i = 0; i < this.params.length; i++) {
+        const param = this.params[i];
+        const node = res.message.hd_nodes[i];
+
+        const path = serializedPath(param.address_n);
+
+        const xpub = createExtendedPublicKey(node, param.script_type);
+
+        const rootFingerprint = res.message.root_fingerprint;
+
+        let xpubSegwit = xpub;
+        if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
+          // wrap regular xpub into bitcoind native descriptor
+          const fingerprint = Number(rootFingerprint || 0)
+            .toString(16)
+            .padStart(8, '0');
+          const descriptorPath = `${fingerprint}${path.substring(1)}`;
+          xpubSegwit = `tr([${descriptorPath}]${xpub}/<0;1>/*)`;
+        }
+
+        responses.push({
+          path,
+          node,
+          xpub,
+          root_fingerprint: rootFingerprint,
+          xpubSegwit,
+        });
+      }
+    } catch (error) {
+      // clear responses
+      responses = [];
+
+      for (let i = 0; i < this.params.length; i++) {
+        const param = this.params[i];
+
+        const res = await this.device.commands.typedCall('GetPublicKey', 'PublicKey', {
+          ...param,
+        });
+
+        const response = {
+          path: serializedPath(param.address_n),
+          ...res.message,
+          xpubSegwit: res.message.xpub,
+        };
+
+        if (this.isBtcNetwork(param) && isTaprootPath(param.address_n)) {
+          // wrap regular xpub into bitcoind native descriptor
+          const fingerprint = Number(response.root_fingerprint || 0)
+            .toString(16)
+            .padStart(8, '0');
+          const descriptorPath = `${fingerprint}${response.path.substring(1)}`;
+          response.xpubSegwit = `tr([${descriptorPath}]${response.xpub}/<0;1>/*)`;
+        }
+
+        responses.push(response);
+      }
     }
path: packages/core/src/api/btc/BTCGetPublicKey.ts
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**`catch` block swallows device errors.**

Any real failure in `typedCall('GetPublicKey')` will loop again and finally succeed silently, hiding flaky devices from callers.  
Consider re-throwing after `n` consecutive failures, or accumulate and return partial results with an error list.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -64,31 +66,79 @@ export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
   }
 
   async run() {
-    const responses: BTCPublicKey[] = [];
+    let responses: BTCPublicKey[] = [];
 
-    for (let i = 0; i < this.params.length; i++) {
-      const param = this.params[i];
+    try {
+      const existsShowDisplay = this.params.some(param => param.show_display);
+      if (existsShowDisplay || !this.hasBundle) {
+        throw new Error('Goto getPublickey');
+      }
 
path: packages/core/src/api/btc/BTCGetPublicKey.ts
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Avoid using exceptions for normal control flow.**

Throwing `"Goto getPublickey"` only to land in the `catch` is hard to read and masks real errors coming from `batchGetPublickeys`.  
Prefer an explicit branch:

```diff
-      if (existsShowDisplay || !this.hasBundle) {
-        throw new Error('Goto getPublickey');
-      }
+      const useBatch = !existsShowDisplay && this.hasBundle;
+      if (!useBatch) {
+        // fall back to single-call path below
+        throw new Error('__skip_batch__');
+      }
```

Then in `catch`, re-throw when `error.message` is not `__skip_batch__`.  
That keeps genuine transport errors visible.



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
    try {
      const existsShowDisplay = this.params.some(param => param.show_display);
      const useBatch = !existsShowDisplay && this.hasBundle;
      if (!useBatch) {
        // fall back to single-call path below
        throw new Error('__skip_batch__');
      }
      // …rest of batchGetPublickeys logic…
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-24T01:34:10Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-24T01:29:31Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This update raises package versions across several modules from `1.0.26-alpha.0` to `1.0.26-alpha.1`, with matching dependency bumps. It adds optional transaction type support for Aptos transactions, including new type definitions, enum values, and device-side version checks. For Bitcoin, it introduces batch public key retrieval, a utility for extended public key creation, and protocol message updates to support these features. The firmware submodule pointer also moves to a new commit. No breaking changes to public APIs are introduced.

## Changes

| File(s)                                                                                      | Change Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `.../electron-example/package.json`<br>`.../expo-example/package.json`<br>`.../core/package.json`<br>`.../hd-ble-sdk/package.json`<br>`.../hd-common-connect-sdk/package.json`<br>`.../hd-transport-http/package.json`<br>`.../hd-transport-lowlevel/package.json`<br>`.../hd-transport-react-native/package.json`<br>`.../hd-transport-webusb/package.json`<br>`.../hd-transport/package.json`<br>`.../hd-web-sdk/package.json`<br>`.../shared/package.json` | Bumped package versions from `1.0.26-alpha.0` to `1.0.26-alpha.1`. Updated dependencies to match new version where relevant. No other changes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `submodules/firmware`                                                                       | Updated submodule pointer to commit `6b261a2e5b2bcf1cac29fd236a778bb925d86520`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `.../expo-example/src/data/aptos.ts`                                                        | Added a new preset example to `aptosSignTransaction` with a `transactionType` field set to `1`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `.../expo-example/src/data/bitcoin.ts`                                                      | Replaced hardcoded address/public key bundles with programmatically generated arrays for four address types, covering 10 derivation paths each.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `.../core/src/api/aptos/AptosSignTransaction.ts`                                            | Added support for optional `transactionType` in payload. Introduced device version checks based on transaction type. Added helper methods for version gating.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `.../core/src/api/btc/BTCGetPublicKey.ts`                                                   | Refactored `run` method to support batch public key retrieval with fallback to single-call logic. Integrated extended public key creation.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `.../core/src/api/btc/helpers/xpubUtils.ts`                                                 | New utility module for constructing extended public keys (xpub, ypub, zpub) with Base58Check encoding.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `.../core/src/api/helpers/batchGetPublickeys.ts`                                            | Extended function to accept `options` for including node data and ignoring coin type, updated device request accordingly.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `.../core/src/data/messages/messages.json`                                                  | Added enum and field for Aptos transaction type, new fields for batch public key requests and responses, including node data and root fingerprint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `.../core/src/types/api/aptosSignTransaction.ts`                                            | Added optional `transactionType` field to `AptosSignTransactionParams` type.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `.../core/src/utils/deviceFeaturesUtils.ts`                                                 | Updated `supportBatchPublicKey` to accept options and check for batch node support based on device model and firmware version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `.../hd-transport/src/types/messages.ts`                                                    | Added `AptosTransactionType` enum. Extended types for Aptos, batch public key requests, and ECDSA public key responses to include new fields and node data.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant App
    participant Core
    participant Device

    App->>Core: Request AptosSignTransaction (with optional transactionType)
    Core->>Core: Validate transactionType
    Core->>Core: If transactionType=WITH_DATA, check device firmware version
    Core->>Device: Send sign transaction command (with tx_type)
    Device-->>Core: Return signed transaction or error
    Core-->>App: Return result
```

```mermaid
sequenceDiagram
    participant App
    participant Core
    participant Device

    App->>Core: Request BTCGetPublicKey (bundle)
    Core->>Device: batchGetPublickeys (with options)
    Device-->>Core: Return array of HD nodes
    Core->>Core: For each node, create extended public key
    Core-->>App: Return array of public keys/xpubs
    Note over Core: If batch fails, fallback to individual requests
```

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro (Legacy)**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 9085f0f182e3bc540b55f5142a5a0f0da48669ad and 66bd16fda5d24e6794f08ec2db4290035196e672.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `packages/core/src/api/aptos/AptosSignTransaction.ts` (3 hunks)
* `packages/core/src/api/cardano/CardanoSignTransaction.ts` (1 hunks)
* `packages/core/src/utils/deviceFeaturesUtils.ts` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>packages/core/src/utils/deviceFeaturesUtils.ts (5)</summary><blockquote>

<details>
<summary>packages/hd-transport/src/types/messages.ts (1)</summary>

* `Features` (2246-2331)

</details>
<details>
<summary>packages/core/src/types/device.ts (2)</summary>

* `Features` (79-79)
* `DeviceModelToTypes` (99-109)

</details>
<details>
<summary>packages/core/src/utils/deviceVersionUtils.ts (1)</summary>

* `getDeviceFirmwareVersion` (7-19)

</details>
<details>
<summary>packages/core/src/utils/index.ts (2)</summary>

* `getDeviceFirmwareVersion` (17-17)
* `getDeviceType` (8-8)

</details>
<details>
<summary>packages/core/src/utils/deviceInfoUtils.ts (1)</summary>

* `getDeviceType` (10-59)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: lint (18.x)
* GitHub Check: build (18.x)
* GitHub Check: Analyze (javascript-typescript)

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>packages/core/src/utils/deviceFeaturesUtils.ts (3)</summary>

`119-124`: **Function signature updated with clear, optional parameter.**

The function now accepts an options object with an optional `includeNode` boolean property. This approach preserves compatibility with existing callers while adding new functionality.

---

`130-138`: **Device-specific firmware requirements added for node inclusion.**

Clear conditional checks that enforce minimum firmware versions when `includeNode` is true:
- Pro devices need 4.14.0+
- Classic1s devices need 3.12.0+
- Classic devices need 3.10.0+

This ensures devices only attempt operations they can support.

---

`140-140`: **Clear comment improves code readability.**

The comment clarifies the purpose of the original code section, distinguishing it from the new conditions added above.

</details>
<details>
<summary>packages/core/src/api/aptos/AptosSignTransaction.ts (3)</summary>

`1-1`: **Import updated to include AptosTransactionType enum.**

The import now includes the transaction type enum from the transport package, which supports the new transaction type feature.

---

`40-52`: **Well-structured version requirements for different device models.**

The `getWithDataVersionRange` method defines clear minimum firmware versions for each device type, following the established pattern in the codebase.

---

`63-64`: **Version check added before device command execution.**

The code now ensures device firmware compatibility before attempting operations that require specific firmware features.

</details>
<details>
<summary>packages/core/src/api/cardano/CardanoSignTransaction.ts (1)</summary>

`231-233`: **Added Conway feature support for Classic devices.**

The code now includes Classic devices with firmware 3.10.0+ in the list of devices that support Conway features. This maintains consistent version requirements with other parts of the codebase.

</details>

</blockquote></details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=OneKeyHQ/hardware-js-sdk&utm_content=454):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` or `Summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: socket-security[bot]
created_at: 2025-04-24T01:30:13Z
body: **Review the following changes in direct dependencies.** Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

<table>
<thead>
<tr>
<th>Diff</th>
<th width="200px">Package</th>
<th align="left" width="100px">Supply Chain<br/>Security</th>
<th align="left" width="100px">Vulnerability</th>
<th align="left" width="100px">Quality</th>
<th align="left" width="100px">Maintenance</th>
<th align="left" width="100px">License</th>
</tr>
</thead>
<tbody>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263">node-releases@​2.0.19 ⏵ 2.0.18</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/score-41.svg" title="Quality" width="40" height="40" alt="41"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/score-79.svg" title="Maintenance" width="40" height="40" alt="79"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15722973263"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353">is-unicode-supported@​0.1.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/score-67.svg" title="Supply Chain Security" width="40" height="40" alt="67"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/score-68.svg" title="Quality" width="40" height="40" alt="68"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/score-51.svg" title="Maintenance" width="40" height="40" alt="51"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13353"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459">jimp-compact@​0.16.1</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/score-97.svg" title="Supply Chain Security" width="40" height="40" alt="97"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/score-48.svg" title="Quality" width="40" height="40" alt="48"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/score-79.svg" title="Maintenance" width="40" height="40" alt="79"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17459"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843">metro-cache-key@​0.80.12</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/score-49.svg" title="Quality" width="40" height="40" alt="49"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/score-90.svg" title="Maintenance" width="40" height="40" alt="90"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097843"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352">is-interactive@​1.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/score-67.svg" title="Supply Chain Security" width="40" height="40" alt="67"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/score-78.svg" title="Quality" width="40" height="40" alt="78"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/score-51.svg" title="Maintenance" width="40" height="40" alt="51"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13352"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043">typedarray@​0.0.6</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/score-67.svg" title="Supply Chain Security" width="40" height="40" alt="67"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/score-87.svg" title="Quality" width="40" height="40" alt="87"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/score-51.svg" title="Maintenance" width="40" height="40" alt="51"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=18043"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767">object-keys@​1.1.1 ⏵ 0.2.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/score-67.svg" title="Supply Chain Security" width="40" height="40" alt="67"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Quality" width="40" height="40" alt="76"></a> <sup>-15</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/score-51.svg" title="Maintenance" width="40" height="40" alt="51"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156767"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119">path-parse@​1.0.7</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/score-67.svg" title="Supply Chain Security" width="40" height="40" alt="67"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/score-78.svg" title="Quality" width="40" height="40" alt="78"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/score-51.svg" title="Maintenance" width="40" height="40" alt="51"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13119"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769">shebang-regex@​1.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/score-54.svg" title="Quality" width="40" height="40" alt="54"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13769"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675">nullthrows@​1.1.1</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/score-56.svg" title="Quality" width="40" height="40" alt="56"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/score-78.svg" title="Maintenance" width="40" height="40" alt="78"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=17675"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982">tmpl@​1.0.5</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/score-57.svg" title="Quality" width="40" height="40" alt="57"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13982"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956">unique-string@​1.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/score-58.svg" title="Quality" width="40" height="40" alt="58"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13956"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847">metro-minify-terser@​0.80.12</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/score-58.svg" title="Quality" width="40" height="40" alt="58"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/score-90.svg" title="Maintenance" width="40" height="40" alt="90"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097847"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839">strict-uri-encode@​2.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/score-59.svg" title="Quality" width="40" height="40" alt="59"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=36839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565">jest-get-type@​29.6.3</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/score-60.svg" title="Quality" width="40" height="40" alt="60"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/score-85.svg" title="Maintenance" width="40" height="40" alt="85"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=28565"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839">metro-babel-transformer@​0.80.12</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/score-60.svg" title="Quality" width="40" height="40" alt="60"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/score-90.svg" title="Maintenance" width="40" height="40" alt="90"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097839"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786">octal@​1.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/score-61.svg" title="Quality" width="40" height="40" alt="61"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=156786"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597">ob1@​0.80.12</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/score-62.svg" title="Quality" width="40" height="40" alt="62"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/score-90.svg" title="Maintenance" width="40" height="40" alt="90"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=15886097597"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813">set-blocking@​2.0.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/score-62.svg" title="Quality" width="40" height="40" alt="62"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=13813"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953">setimmediate@​1.0.5</a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/score-62.svg" title="Quality" width="40" height="40" alt="62"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies&dependency_item_key=12953"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr>
<td colspan="7" align="center" height="50px">
<a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies">See 252 more rows in the dashboard</a>
</td>
</tbody>
</table>

[View full report](https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=dependencies)

<!-- overview-comment -->
author_association: NONE
user: login: socket-security[bot]
created_at: 2025-04-24T01:30:14Z
body: > [!WARNING]
> **Review the following alerts detected in dependencies.**
>
> According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

<table>
<thead>
<tr>
<th>Action</th>
<th>Severity</th>
<th width="800px" align="left">Alert (click for details)</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">Warn</td>
<td align="center" valign="top"><a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=alerts&alert_item_key=Q6B-Do-iLlziJWqCUTqhxHFM1nSj7QkoovZYVmYfK9fE"><img src="https://github-app-statics.socket.dev/severity-3.svg" title="Critical" width="20" height="20" alt="Critical"></a></td>
<td><details><summary><code>crypto-js@3.3.0</code> has a Critical CVE.</summary>
<p></p>
<p><strong>CVE:</strong> <a href="https://github.com/advisories/GHSA-xwcq-pm8m-c4vf">GHSA-xwcq-pm8m-c4vf crypto-js PBKDF2 1,000 times weaker than specified in 1993 and 1.3M times weaker than current standard (CRITICAL)</a></p> 
<p><strong>Affected versions:</strong> &lt; 4.2.0</p> 
<p><strong>Patched version:</strong> 4.2.0</p> 
<p><strong>Source:</strong> <a href="https://github.com/OneKeyHQ/hardware-js-sdk/pull/454/files#diff-fee0d5f789047a6382c7e5ccef252a069e6adc71d823698ce4f5cb3a29244a81"><code>packages/connect-examples/expo-example/yarn.lock</code></a></p>
<p>ℹ Read more on: <a href="https://socket.dev/npm/package/crypto-js/overview/3.3.0">This package</a> | <a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=alerts&alert_item_key=Q6B-Do-iLlziJWqCUTqhxHFM1nSj7QkoovZYVmYfK9fE">This alert</a> | <a href="https://socket.dev/alerts/criticalCVE">What is a critical CVE?</a></p>
<blockquote>
<p><em>Next steps:</em> Take a moment to review the security alert
    above. Review the linked package source code to understand the potential
    risk. Ensure the package is not malicious before proceeding. If you're
    unsure how to proceed, reach out to your security team or ask the Socket
    team for help at <code>support@socket.dev</code>.
  </p>
<p><em>Suggestion:</em> Remove or replace dependencies that include known critical CVEs. Consumers can use dependency overrides or npm audit fix --force to remove vulnerable dependencies.</p>
<p>
    <em>Mark the package as acceptable risk</em>. To ignore this alert only
    in this pull request, reply with the comment
    <code>@SocketSecurity ignore npm/crypto-js@3.3.0</code>. You can
    also ignore all packages with <code>@SocketSecurity ignore-all</code>.
    To ignore an alert for all future pull requests, use Socket's Dashboard to
    change the <a href="https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=alerts&alert_item_key=Q6B-Do-iLlziJWqCUTqhxHFM1nSj7QkoovZYVmYfK9fE">triage state of this alert</a>.
  </p>
</blockquote>
</details></td>
</tr>
</tbody>
</table>

[View full report](https://socket.dev/dashboard/org/OneKeyHQ/diff/17c3128f-c555-4cc8-961e-0091494ed505/458de9dc-10aa-48bf-8cba-a58ef3ce338d?tab=alerts&action=error%2Cwarn)
author_association: NONE