Loading...
Loading...
Compare original and translation side by side
ledger-dmk-implementation/SKILL.mdledger-dmk-implementation/SKILL.md@ledgerhq/context-moduleoriginTokenSignerEthBuilderhttps://developers.ledger.com/docs/clear-signing/for-wallets// Clear Signing enabled (requires partner token):
new SignerEthBuilder({ dmk, sessionId, originToken: "your-partner-token" }).build();
// Blind signing — works but users see raw hex on device:
new SignerEthBuilder({ dmk, sessionId }).build();originToken@ledgerhq/context-moduleoriginTokenSignerEthBuilderhttps://developers.ledger.com/docs/clear-signing/for-wallets// Clear Signing enabled (requires partner token):
new SignerEthBuilder({ dmk, sessionId, originToken: "your-partner-token" }).build();
// Blind signing — works but users see raw hex on device:
new SignerEthBuilder({ dmk, sessionId }).build();originTokenoriginToken@ledgerhq/context-modulecheckOnDevice: truegetAddress()originToken@ledgerhq/context-modulegetAddress()checkOnDevice: true| Operation | Requires secure channel |
|---|---|
| Yes |
| Yes |
| Yes |
| Yes |
| All signer operations (sign, get address) | No |
| No |
| 操作 | 是否需要Secure Channel |
|---|---|
| 是 |
| 是 |
| 是 |
| 是 |
| 所有签名器操作(签名、获取地址) | 否 |
| 否 |
wss://manager.live.ledger.comAllowSecureConnectionwss://manager.live.ledger.comAllowSecureConnectiondmk.sendCommand()dmk.executeDeviceAction()dmk.sendCommand()dmk.executeDeviceAction()| Use case | Use |
|---|---|
| Signing a transaction, getting an address | Signer kit device action (via signer builder) |
| Genuine check, app install/uninstall | |
| Opening an app with user confirmation UI | |
| Checking firmware version, getting current app name | |
| Custom/unsupported chain, raw APDU | |
| 适用场景 | 使用方式 |
|---|---|
| 交易签名、获取地址 | 签名器工具包的Device Action(通过签名器构建器) |
| 正品校验、应用安装/卸载 | 配合对应的 |
| 带用户确认UI的应用打开操作 | 通过 |
| 检查固件版本、获取当前应用名称 | |
| 自定义/未支持的链、原始APDU操作 | 配合 |
ConfirmOpenAppUserInteractionRequired.SignTransactionDeviceActionStatus.CompletedConfirmOpenAppUserInteractionRequired.SignTransactionDeviceActionStatus.Completeddmk.connect()dmk.disconnect()sessionIddmk.connect()dmk.disconnect()sessionIdsessionIdsessionIddmk.disconnect({ sessionId })DisconnectedsessionIdDisconnectedstartDiscovering()dmk.disconnect({ sessionId })DisconnectedsessionIdDisconnectedstartDiscovering()dmk.connect({ device, sessionRefresherOptions: { isRefresherDisabled: true } });dmk.connect({ device, sessionRefresherOptions: { isRefresherDisabled: true } });| Transport | Protocol | Environment |
|---|---|---|
| WebHID | USB HID, 64-byte frames | Browser (Chromium only) |
| WebBLE | Bluetooth GATT | Browser |
| Node-HID | USB HID via native addon | Node.js, Electron |
| React Native HID | USB HID | React Native |
| React Native BLE | Bluetooth | React Native |
| Speculos | TCP socket to emulator | Development/CI only |
| Transport | 协议 | 适用环境 |
|---|---|---|
| WebHID | USB HID,64字节帧 | 浏览器(仅Chromium内核) |
| WebBLE | 蓝牙GATT | 浏览器 |
| Node-HID | 通过原生插件实现的USB HID | Node.js、Electron |
| React Native HID | USB HID | React Native |
| React Native BLE | 蓝牙 | React Native |
| Speculos | 连接模拟器的TCP套接字 | 仅用于开发/CI |
startDiscovering()connect()startDiscovering()connect()DeviceManagementKitBuilderDeviceManagementKitBuilderm/DerivationPathUtils.splitPath/mparseInt("m")NaN"44'/60'/0'/0/0""m/44'/60'/0'/0/0"'44'0x80000000account0indexm/DerivationPathUtils.splitPath/mparseInt("m")NaN"44'/60'/0'/0/0""m/44'/60'/0'/0/0"'44'0x80000000account0index| Chain | Ledger Live path | Notes |
|---|---|---|
| Ethereum | | BIP44, account 0, index 0 |
| Bitcoin Native SegWit | | BIP84, passed to wallet policy |
| Solana | | Community standard |
| Cosmos | | BIP44 |
github.com/satoshilabs/slips/blob/master/slip-0044.md| 链 | Ledger Live路径 | 说明 |
|---|---|---|
| Ethereum | | BIP44,账户0,索引0 |
| Bitcoin Native SegWit | | BIP84,传递给钱包策略 |
| Solana | | 社区标准 |
| Cosmos | | BIP44 |
github.com/satoshilabs/slips/blob/master/slip-0044.mdstate.currentApp.name"BOLOS"const isOnDashboard =
state.currentApp.name === "BOLOS" || state.currentApp.name === "Dashboard";state.currentApp.name"BOLOS"const isOnDashboard =
state.currentApp.name === "BOLOS" || state.currentApp.name === "Dashboard";output.isGenuine: booleanoutput.isGenuine: booleanOpenAppDeviceActionInstallAppDeviceActionUninstallAppDeviceActionOpenAppDeviceActionInstallAppDeviceActionUninstallAppDeviceAction