@swapkit/wallet-hardware 5.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/THIRD_PARTY_LICENSES.md +2344 -0
  2. package/dist/chunk-09e51wma.js +4 -0
  3. package/dist/chunk-09e51wma.js.map +167 -0
  4. package/dist/chunk-0arpsm5f.js +4 -0
  5. package/dist/chunk-0arpsm5f.js.map +10 -0
  6. package/dist/chunk-1amf58aq.js +4 -0
  7. package/dist/{chunk-vwv6z2mk.js.map → chunk-1amf58aq.js.map} +2 -2
  8. package/dist/chunk-3t17wpjg.js +17 -0
  9. package/dist/chunk-3t17wpjg.js.map +29 -0
  10. package/dist/chunk-5c7b7z2d.js +4 -0
  11. package/dist/{chunk-9gy0xve4.js.map → chunk-5c7b7z2d.js.map} +2 -2
  12. package/dist/chunk-5p3ttw6y.js +4 -0
  13. package/dist/{chunk-n05bv2n5.js.map → chunk-5p3ttw6y.js.map} +1 -1
  14. package/dist/chunk-dptbnkzm.js +64 -0
  15. package/dist/chunk-dptbnkzm.js.map +260 -0
  16. package/dist/chunk-ds2m83jp.js +5 -0
  17. package/dist/chunk-ds2m83jp.js.map +11 -0
  18. package/dist/chunk-eenx3cv6.js +4 -0
  19. package/dist/chunk-eenx3cv6.js.map +33 -0
  20. package/dist/chunk-gr3eswf1.js +4 -0
  21. package/dist/chunk-gr3eswf1.js.map +73 -0
  22. package/dist/{chunk-7fsaymh4.js → chunk-hg71hp4m.js} +3 -3
  23. package/dist/{chunk-7fsaymh4.js.map → chunk-hg71hp4m.js.map} +1 -1
  24. package/dist/chunk-jewm2ag3.js +5 -0
  25. package/dist/chunk-jewm2ag3.js.map +10 -0
  26. package/dist/chunk-jzrytcrf.js +4 -0
  27. package/dist/chunk-jzrytcrf.js.map +12 -0
  28. package/dist/chunk-k3thje6a.js +4 -0
  29. package/dist/chunk-k3thje6a.js.map +9 -0
  30. package/dist/chunk-nhva847d.js +5 -0
  31. package/dist/chunk-nhva847d.js.map +9 -0
  32. package/dist/chunk-tm47brht.js +4 -0
  33. package/dist/chunk-tm47brht.js.map +140 -0
  34. package/dist/chunk-xmvg4cds.js +4 -0
  35. package/dist/chunk-xmvg4cds.js.map +127 -0
  36. package/dist/chunk-xx7cwpzq.js +4 -0
  37. package/dist/chunk-xx7cwpzq.js.map +9 -0
  38. package/dist/chunk-yrxe491r.js +20 -0
  39. package/dist/chunk-yrxe491r.js.map +17 -0
  40. package/dist/index.cjs +2 -2
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/keepkey/index.cjs +2 -2
  43. package/dist/keepkey/index.cjs.map +2 -2
  44. package/dist/keepkey/index.js +2 -2
  45. package/dist/keepkey/index.js.map +2 -2
  46. package/dist/ledger/index.cjs +90 -2
  47. package/dist/ledger/index.cjs.map +830 -23
  48. package/dist/ledger/index.js +2 -2
  49. package/dist/ledger/index.js.map +21 -19
  50. package/dist/trezor/index.cjs +2 -2
  51. package/dist/trezor/index.cjs.map +5 -4
  52. package/dist/trezor/index.js +2 -2
  53. package/dist/trezor/index.js.map +3 -3
  54. package/dist/types/helpers/psbt.d.ts +9 -0
  55. package/dist/types/helpers/psbt.d.ts.map +1 -0
  56. package/dist/types/ledger/clients/bitcoin.d.ts +36 -0
  57. package/dist/types/ledger/clients/bitcoin.d.ts.map +1 -0
  58. package/dist/types/ledger/clients/cosmos.d.ts +38 -10
  59. package/dist/types/ledger/clients/cosmos.d.ts.map +1 -1
  60. package/dist/types/ledger/clients/evm.d.ts +37 -46
  61. package/dist/types/ledger/clients/evm.d.ts.map +1 -1
  62. package/dist/types/ledger/clients/near.d.ts +5 -2
  63. package/dist/types/ledger/clients/near.d.ts.map +1 -1
  64. package/dist/types/ledger/clients/sui.d.ts +8 -12
  65. package/dist/types/ledger/clients/sui.d.ts.map +1 -1
  66. package/dist/types/ledger/clients/thorchain/index.d.ts +34 -8
  67. package/dist/types/ledger/clients/thorchain/index.d.ts.map +1 -1
  68. package/dist/types/ledger/clients/thorchain/protocol.d.ts +58 -0
  69. package/dist/types/ledger/clients/thorchain/protocol.d.ts.map +1 -0
  70. package/dist/types/ledger/clients/tron.d.ts +11 -8
  71. package/dist/types/ledger/clients/tron.d.ts.map +1 -1
  72. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts +3 -2
  73. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts.map +1 -1
  74. package/dist/types/ledger/clients/utxo-legacy-outputs.d.ts +18 -0
  75. package/dist/types/ledger/clients/utxo-legacy-outputs.d.ts.map +1 -0
  76. package/dist/types/ledger/clients/utxo.d.ts +10 -13
  77. package/dist/types/ledger/clients/utxo.d.ts.map +1 -1
  78. package/dist/types/ledger/clients/xrp.d.ts +4 -1
  79. package/dist/types/ledger/clients/xrp.d.ts.map +1 -1
  80. package/dist/types/ledger/clients/zcash.d.ts +53 -0
  81. package/dist/types/ledger/clients/zcash.d.ts.map +1 -0
  82. package/dist/types/ledger/helpers/dmk.d.ts +24 -0
  83. package/dist/types/ledger/helpers/dmk.d.ts.map +1 -0
  84. package/dist/types/ledger/helpers/executeDeviceAction.d.ts +34 -0
  85. package/dist/types/ledger/helpers/executeDeviceAction.d.ts.map +1 -0
  86. package/dist/types/ledger/helpers/getLedgerAddress.d.ts +1 -1
  87. package/dist/types/ledger/helpers/getLedgerAddress.d.ts.map +1 -1
  88. package/dist/types/ledger/helpers/getLedgerClient.d.ts +10 -3
  89. package/dist/types/ledger/helpers/getLedgerClient.d.ts.map +1 -1
  90. package/dist/types/ledger/helpers/index.d.ts +2 -1
  91. package/dist/types/ledger/helpers/index.d.ts.map +1 -1
  92. package/dist/types/ledger/helpers/ledgerJsDmkBridge.d.ts +26 -0
  93. package/dist/types/ledger/helpers/ledgerJsDmkBridge.d.ts.map +1 -0
  94. package/dist/types/ledger/helpers/ledgerJsDmkTransport.d.ts +13 -0
  95. package/dist/types/ledger/helpers/ledgerJsDmkTransport.d.ts.map +1 -0
  96. package/dist/types/ledger/helpers/lowS.d.ts +6 -0
  97. package/dist/types/ledger/helpers/lowS.d.ts.map +1 -0
  98. package/dist/types/ledger/helpers/rawTx.d.ts +2 -0
  99. package/dist/types/ledger/helpers/rawTx.d.ts.map +1 -0
  100. package/dist/types/ledger/index.d.ts +19 -7
  101. package/dist/types/ledger/index.d.ts.map +1 -1
  102. package/dist/types/ledger/types.d.ts +6 -10
  103. package/dist/types/ledger/types.d.ts.map +1 -1
  104. package/dist/types/trezor/index.d.ts +2 -2
  105. package/dist/types/trezor/index.d.ts.map +1 -1
  106. package/package.json +36 -36
  107. package/src/helpers/psbt.ts +26 -0
  108. package/src/ledger/clients/bitcoin.ts +575 -0
  109. package/src/ledger/clients/cosmos.ts +180 -51
  110. package/src/ledger/clients/evm.ts +238 -195
  111. package/src/ledger/clients/near.ts +43 -13
  112. package/src/ledger/clients/sui.ts +55 -68
  113. package/src/ledger/clients/thorchain/index.ts +210 -86
  114. package/src/ledger/clients/thorchain/protocol.ts +166 -0
  115. package/src/ledger/clients/tron.ts +49 -37
  116. package/src/ledger/clients/utxo-legacy-adapter.ts +35 -32
  117. package/src/ledger/clients/utxo-legacy-outputs.ts +122 -0
  118. package/src/ledger/clients/utxo.ts +108 -206
  119. package/src/ledger/clients/xrp.ts +39 -23
  120. package/src/ledger/clients/zcash.ts +440 -0
  121. package/src/ledger/helpers/dmk.ts +231 -0
  122. package/src/ledger/helpers/executeDeviceAction.ts +201 -0
  123. package/src/ledger/helpers/getLedgerClient.ts +101 -72
  124. package/src/ledger/helpers/index.ts +6 -1
  125. package/src/ledger/helpers/ledgerJsDmkBridge.ts +109 -0
  126. package/src/ledger/helpers/ledgerJsDmkTransport.ts +88 -0
  127. package/src/ledger/helpers/lowS.ts +30 -0
  128. package/src/ledger/helpers/rawTx.ts +12 -0
  129. package/src/ledger/index.ts +564 -369
  130. package/src/ledger/types.ts +15 -10
  131. package/src/trezor/index.ts +117 -25
  132. package/dist/chunk-3yr76n9s.js +0 -5
  133. package/dist/chunk-3yr76n9s.js.map +0 -10
  134. package/dist/chunk-9gy0xve4.js +0 -4
  135. package/dist/chunk-bwf31zxr.js +0 -4
  136. package/dist/chunk-bwf31zxr.js.map +0 -10
  137. package/dist/chunk-egtwbe6q.js +0 -4
  138. package/dist/chunk-egtwbe6q.js.map +0 -10
  139. package/dist/chunk-n05bv2n5.js +0 -5
  140. package/dist/chunk-vwv6z2mk.js +0 -4
  141. package/dist/types/ledger/clients/thorchain/common.d.ts +0 -28
  142. package/dist/types/ledger/clients/thorchain/common.d.ts.map +0 -1
  143. package/dist/types/ledger/clients/thorchain/helpers.d.ts +0 -7
  144. package/dist/types/ledger/clients/thorchain/helpers.d.ts.map +0 -1
  145. package/dist/types/ledger/clients/thorchain/lib.d.ts +0 -22
  146. package/dist/types/ledger/clients/thorchain/lib.d.ts.map +0 -1
  147. package/dist/types/ledger/clients/thorchain/utils.d.ts +0 -2
  148. package/dist/types/ledger/clients/thorchain/utils.d.ts.map +0 -1
  149. package/dist/types/ledger/clients/utxo-psbt.d.ts +0 -18
  150. package/dist/types/ledger/clients/utxo-psbt.d.ts.map +0 -1
  151. package/dist/types/ledger/cosmosTypes.d.ts +0 -40
  152. package/dist/types/ledger/cosmosTypes.d.ts.map +0 -1
  153. package/dist/types/ledger/helpers/getLedgerTransport.d.ts +0 -3
  154. package/dist/types/ledger/helpers/getLedgerTransport.d.ts.map +0 -1
  155. package/dist/types/ledger/helpers/ledgerNetworkInfo.d.ts +0 -14
  156. package/dist/types/ledger/helpers/ledgerNetworkInfo.d.ts.map +0 -1
  157. package/dist/types/ledger/interfaces/CosmosLedgerInterface.d.ts +0 -14
  158. package/dist/types/ledger/interfaces/CosmosLedgerInterface.d.ts.map +0 -1
  159. package/src/ledger/clients/thorchain/common.ts +0 -93
  160. package/src/ledger/clients/thorchain/helpers.ts +0 -120
  161. package/src/ledger/clients/thorchain/lib.ts +0 -258
  162. package/src/ledger/clients/thorchain/utils.ts +0 -69
  163. package/src/ledger/clients/utxo-psbt.ts +0 -172
  164. package/src/ledger/cosmosTypes.ts +0 -98
  165. package/src/ledger/helpers/getLedgerTransport.ts +0 -102
  166. package/src/ledger/helpers/ledgerNetworkInfo.ts +0 -127
  167. package/src/ledger/interfaces/CosmosLedgerInterface.ts +0 -67
@@ -1 +0,0 @@
1
- {"version":3,"file":"getLedgerTransport.d.ts","sourceRoot":"","sources":["../../../../src/ledger/helpers/getLedgerTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AAwBpD,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,SAAS,CA6E5D,CAAC"}
@@ -1,14 +0,0 @@
1
- import type Transport from "@ledgerhq/hw-transport";
2
- export type LedgerNetworkDescriptor = {
3
- data: string;
4
- icon?: string;
5
- signature: string;
6
- };
7
- export declare function fetchLedgerNetworkCertificate(deviceModelId: string, fetchFn?: typeof fetch): Promise<string | null>;
8
- export declare function provideLedgerCertificate(transport: Transport, payloadHex: string): Promise<void>;
9
- export declare function fetchLedgerNetworkDescriptor(chainId: number, deviceModelId: string, fetchFn?: typeof fetch): Promise<LedgerNetworkDescriptor | null>;
10
- export declare function encodeNetworkInfoPayload({ data, signature }: LedgerNetworkDescriptor): Buffer<ArrayBuffer>;
11
- export declare function provideLedgerNetworkInformation(transport: Transport, descriptor: LedgerNetworkDescriptor): Promise<{
12
- iconAccepted: boolean;
13
- }>;
14
- //# sourceMappingURL=ledgerNetworkInfo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ledgerNetworkInfo.d.ts","sourceRoot":"","sources":["../../../../src/ledger/helpers/ledgerNetworkInfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AAyBpD,MAAM,MAAM,uBAAuB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAQzF,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAED,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAQtF;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAgBzC;AAUD,wBAAgB,wBAAwB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,uBAAuB,uBAQpF;AAUD,wBAAsB,+BAA+B,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,uBAAuB;;GAa9G"}
@@ -1,14 +0,0 @@
1
- import type Transport from "@ledgerhq/hw-transport";
2
- import { type DerivationPathArray, LedgerErrorCode } from "@swapkit/helpers";
3
- export declare abstract class CosmosLedgerInterface {
4
- ledgerTimeout: number;
5
- derivationPath: DerivationPathArray | string;
6
- transport: any;
7
- ledgerApp: any;
8
- chain: "thor" | "cosmos";
9
- private readonly injectedTransport?;
10
- constructor(transport?: Transport);
11
- checkOrCreateTransportAndLedger: (forceReconnect?: boolean) => Promise<any>;
12
- validateResponse: (errorCode: LedgerErrorCode, message?: string) => void;
13
- }
14
- //# sourceMappingURL=CosmosLedgerInterface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CosmosLedgerInterface.d.ts","sourceRoot":"","sources":["../../../../src/ledger/interfaces/CosmosLedgerInterface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,KAAK,mBAAmB,EAAE,eAAe,EAAuC,MAAM,kBAAkB,CAAC;AAKlH,8BAAsB,qBAAqB;IACzC,aAAa,SAAS;IACtB,cAAc,EAAE,mBAAmB,GAAG,MAAM,CAA8B;IAC1E,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAY;gBAEnC,SAAS,CAAC,EAAE,SAAS;IAKjC,+BAA+B,GAAU,wBAAsB,kBA4B7D;IAEF,gBAAgB,GAAI,WAAW,eAAe,EAAE,UAAU,MAAM,UAe9D;CACH"}
@@ -1,93 +0,0 @@
1
- export const CLA = 0x55;
2
- export const CHUNK_SIZE = 250;
3
- export const APP_KEY = "CSM";
4
-
5
- export const INS = {
6
- GET_ADDR_SECP256K1: 0x04,
7
- GET_VERSION: 0x00,
8
- INS_PUBLIC_KEY_SECP256K1: 0x01, // Obsolete
9
- SIGN_SECP256K1: 0x02,
10
- };
11
-
12
- export const PAYLOAD_TYPE = { ADD: 0x01, INIT: 0x00, LAST: 0x02 };
13
-
14
- export const P1_VALUES = { ONLY_RETRIEVE: 0x00, SHOW_ADDRESS_IN_DEVICE: 0x01 };
15
-
16
- export const P2_VALUES = { JSON: 0x0 };
17
-
18
- export const ERROR_CODE = { NoError: 0x9000 };
19
-
20
- const ERROR_DESCRIPTION: any = {
21
- 1: "U2F: Unknown",
22
- 2: "U2F: Bad request",
23
- 3: "U2F: Configuration unsupported",
24
- 4: "U2F: Device Ineligible",
25
- 5: "U2F: Timeout",
26
- 14: "Timeout",
27
- 25600: "Execution Error",
28
- 26368: "Wrong Length",
29
- 26626: "Error deriving keys",
30
- 27010: "Empty Buffer",
31
- 27011: "Output buffer too small",
32
- 27012: "Data is invalid",
33
- 27013: "Conditions not satisfied",
34
- 27014: "Transaction rejected",
35
- 27264: "Bad key handle",
36
- 27392: "Invalid P1/P2",
37
- 27904: "Instruction not supported",
38
- 28160: "App does not seem to be open",
39
- 28416: "Unknown error",
40
- 28417: "Sign/verify error",
41
- 36864: "No errors",
42
- 36865: "Device is busy",
43
- };
44
-
45
- export function errorCodeToString(statusCode: number) {
46
- if (statusCode in ERROR_DESCRIPTION) return ERROR_DESCRIPTION[statusCode];
47
- return `Unknown Status Code: ${statusCode}`;
48
- }
49
-
50
- function isDict(v: any) {
51
- return typeof v === "object" && v !== null && !Array.isArray(v) && !(v instanceof Date);
52
- }
53
-
54
- export function processErrorResponse(response: any) {
55
- if (response) {
56
- if (isDict(response)) {
57
- if (Object.hasOwn(response, "statusCode")) {
58
- return { error_message: errorCodeToString(response.statusCode), return_code: response.statusCode };
59
- }
60
-
61
- if (Object.hasOwn(response, "return_code") && Object.hasOwn(response, "error_message")) {
62
- return response;
63
- }
64
- }
65
- return { error_message: response.toString(), return_code: 0xffff };
66
- }
67
-
68
- return { error_message: response.toString(), return_code: 0xffff };
69
- }
70
-
71
- export function getVersion(transport: any) {
72
- return transport.send(CLA, INS.GET_VERSION, 0, 0).then((response: any) => {
73
- const errorCodeData = response.slice(-2);
74
- const returnCode = errorCodeData[0] * 256 + errorCodeData[1];
75
-
76
- let targetId = 0;
77
- if (response.length >= 9) {
78
- targetId = (response[5] << 24) + (response[6] << 16) + (response[7] << 8) + (response[8] << 0);
79
- }
80
-
81
- return {
82
- device_locked: response[4] === 1,
83
- error_message: errorCodeToString(returnCode),
84
- major: response[1],
85
- minor: response[2],
86
- patch: response[3],
87
- return_code: returnCode,
88
- target_id: targetId.toString(16),
89
- // ///
90
- test_mode: response[0] !== 0,
91
- };
92
- }, processErrorResponse);
93
- }
@@ -1,120 +0,0 @@
1
- import { SwapKitError } from "@swapkit/helpers";
2
- import { CLA, ERROR_CODE, errorCodeToString, INS, P2_VALUES, PAYLOAD_TYPE, processErrorResponse } from "./common";
3
-
4
- export function serializePathv1(path: number[]) {
5
- if (path == null || path.length < 3) {
6
- throw new SwapKitError("wallet_ledger_invalid_params", { reason: "Path too short" });
7
- }
8
- if (path.length > 10) {
9
- throw new SwapKitError("wallet_ledger_invalid_params", { reason: "Path too long" });
10
- }
11
- const buf = Buffer.alloc(1 + 4 * path.length);
12
- buf.writeUInt8(path.length, 0);
13
- for (let i = 0; i < path.length; i += 1) {
14
- let v = path[i] || 0;
15
- if (i < 3) {
16
- // eslint-disable-next-line no-bitwise
17
- v |= 0x80000000; // Harden
18
- }
19
- buf.writeInt32LE(v, 1 + i * 4);
20
- }
21
- return buf;
22
- }
23
-
24
- export function signSendChunkv1(app: any, chunkIdx: number, _chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {
25
- return app.transport
26
- .send(CLA, INS.SIGN_SECP256K1, chunkIdx, txType, chunk, [ERROR_CODE.NoError, 0x6984, 0x6a80])
27
- .then((response: any) => {
28
- const errorCodeData = response.slice(-2);
29
- const returnCode = errorCodeData[0] * 256 + errorCodeData[1];
30
- let errorMessage = errorCodeToString(returnCode);
31
-
32
- if (returnCode === 0x6a80 || returnCode === 0x6984) {
33
- errorMessage = `${errorMessage} : ${response.slice(0, response.length - 2).toString("ascii")}`;
34
- }
35
-
36
- let signature: any = null;
37
- if (response.length > 2) {
38
- signature = response.slice(0, response.length - 2);
39
- }
40
-
41
- return { error_message: errorMessage, return_code: returnCode, signature };
42
- }, processErrorResponse);
43
- }
44
-
45
- function compressPublicKey(publicKey: Buffer) {
46
- if (publicKey.length !== 65) {
47
- throw new SwapKitError("wallet_ledger_invalid_params", {
48
- reason: "decompressed public key length should be 65 bytes",
49
- });
50
- }
51
- const y = publicKey.slice(33, 65);
52
-
53
- // @ts-expect-error
54
- const z = Buffer.from([2 + (y[y.length - 1] & 1)]);
55
- return Buffer.concat([z, publicKey.slice(1, 33)]);
56
- }
57
-
58
- export function publicKeyv1(app: any, data: Buffer) {
59
- return app.transport
60
- .send(CLA, INS.INS_PUBLIC_KEY_SECP256K1, 0, 0, data, [ERROR_CODE.NoError])
61
- .then((response: any) => {
62
- const errorCodeData = response.slice(-2);
63
- const returnCode = errorCodeData[0] * 256 + errorCodeData[1];
64
- const pk = Buffer.from(response.slice(0, 65));
65
-
66
- return {
67
- compressed_pk: compressPublicKey(pk),
68
- error_message: errorCodeToString(returnCode),
69
- pk,
70
- return_code: returnCode,
71
- };
72
- }, processErrorResponse);
73
- }
74
-
75
- export function serializePathv2(path: number[]) {
76
- if (!path || path.length !== 5) {
77
- throw new SwapKitError("wallet_ledger_invalid_params", { reason: "Path must be exactly 5 elements" });
78
- }
79
-
80
- const buf = Buffer.alloc(20);
81
- // @ts-expect-error
82
- buf.writeUInt32LE(0x80000000 + path[0], 0);
83
- // @ts-expect-error
84
- buf.writeUInt32LE(0x80000000 + path[1], 4);
85
- // @ts-expect-error
86
- buf.writeUInt32LE(0x80000000 + path[2], 8);
87
- // @ts-expect-error
88
- buf.writeUInt32LE(path[3], 12);
89
- // @ts-expect-error
90
- buf.writeUInt32LE(path[4], 16);
91
-
92
- return buf;
93
- }
94
-
95
- export function signSendChunkv2(app: any, chunkIdx: number, chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {
96
- let payloadType = PAYLOAD_TYPE.ADD;
97
- if (chunkIdx === 1) {
98
- payloadType = PAYLOAD_TYPE.INIT;
99
- }
100
- if (chunkIdx === chunkNum) {
101
- payloadType = PAYLOAD_TYPE.LAST;
102
- }
103
-
104
- return signSendChunkv1(app, payloadType, 0, chunk, txType);
105
- }
106
-
107
- export function publicKeyv2(app: any, data: Buffer) {
108
- return app.transport.send(CLA, INS.GET_ADDR_SECP256K1, 0, 0, data, [ERROR_CODE.NoError]).then((response: any) => {
109
- const errorCodeData = response.slice(-2);
110
- const returnCode = errorCodeData[0] * 256 + errorCodeData[1];
111
- const compressedPk = Buffer.from(response.slice(0, 33));
112
-
113
- return {
114
- compressed_pk: compressedPk,
115
- error_message: errorCodeToString(returnCode),
116
- pk: "OBSOLETE PROPERTY",
117
- return_code: returnCode,
118
- };
119
- }, processErrorResponse);
120
- }
@@ -1,258 +0,0 @@
1
- import type Transport from "@ledgerhq/hw-transport";
2
- import { SwapKitError } from "@swapkit/helpers";
3
-
4
- import {
5
- CHUNK_SIZE,
6
- CLA,
7
- ERROR_CODE,
8
- errorCodeToString,
9
- getVersion,
10
- INS,
11
- P1_VALUES,
12
- P2_VALUES,
13
- processErrorResponse,
14
- } from "./common";
15
- import {
16
- publicKeyv1,
17
- publicKeyv2,
18
- serializePathv1,
19
- serializePathv2,
20
- signSendChunkv1,
21
- signSendChunkv2,
22
- } from "./helpers";
23
-
24
- export class THORChainApp {
25
- transport: Transport;
26
- versionResponse: any;
27
-
28
- constructor(transport: any) {
29
- if (!transport) {
30
- throw new SwapKitError("wallet_ledger_transport_not_defined");
31
- }
32
-
33
- this.transport = transport;
34
- }
35
-
36
- static serializeHRP(hrp: string) {
37
- if (hrp == null || hrp.length < 3 || hrp.length > 83) {
38
- throw new SwapKitError("wallet_ledger_invalid_params", { reason: "Invalid HRP" });
39
- }
40
- const buf = Buffer.alloc(1 + hrp.length);
41
- buf.writeUInt8(hrp.length, 0);
42
- buf.write(hrp, 1);
43
- return buf;
44
- }
45
-
46
- async serializePath(path: number[]) {
47
- this.versionResponse = await getVersion(this.transport);
48
-
49
- if (this.versionResponse.return_code !== ERROR_CODE.NoError) {
50
- throw this.versionResponse;
51
- }
52
-
53
- switch (this.versionResponse.major) {
54
- case 1:
55
- return serializePathv1(path);
56
- case 2:
57
- return serializePathv2(path);
58
- default:
59
- return Buffer.alloc(0);
60
- }
61
- }
62
-
63
- async signGetChunks(path: number[], buffer: Buffer) {
64
- const serializedPath = await this.serializePath(path);
65
-
66
- const chunks = [];
67
- chunks.push(serializedPath);
68
-
69
- for (let i = 0; i < buffer.length; i += CHUNK_SIZE) {
70
- let end = i + CHUNK_SIZE;
71
- if (i > buffer.length) {
72
- end = buffer.length;
73
- }
74
- chunks.push(buffer.slice(i, end));
75
- }
76
-
77
- return chunks;
78
- }
79
-
80
- async getVersion() {
81
- try {
82
- this.versionResponse = await getVersion(this.transport);
83
- return this.versionResponse;
84
- } catch (e) {
85
- return processErrorResponse(e);
86
- }
87
- }
88
-
89
- appInfo() {
90
- return this.transport.send(0xb0, 0x01, 0, 0).then((response: any) => {
91
- const returnCode = response.readUInt16BE(response.length - 2);
92
-
93
- let appName = "";
94
- let appVersion = "";
95
- let flagLen = 0;
96
- let flagsValue = 0;
97
-
98
- if (response[0] !== 1) {
99
- // Ledger responds with format ID 1. There is no spec for any format != 1
100
- return { error_message: "response format ID not recognized", return_code: 0x9001 };
101
- }
102
-
103
- const appNameLen = response[1];
104
- appName = response.slice(2, 2 + appNameLen).toString("ascii");
105
- let idx = 2 + appNameLen;
106
- const appVersionLen = response[idx];
107
- idx += 1;
108
- appVersion = response.slice(idx, idx + appVersionLen).toString("ascii");
109
- idx += appVersionLen;
110
- const appFlagsLen = response[idx];
111
- idx += 1;
112
- flagLen = appFlagsLen;
113
- flagsValue = response[idx];
114
-
115
- return {
116
- appName,
117
- appVersion,
118
- error_message: errorCodeToString(returnCode),
119
- flag_onboarded: (flagsValue & 4) !== 0,
120
- flag_pin_validated: (flagsValue & 128) !== 0,
121
- flag_recovery: (flagsValue & 1) !== 0,
122
- flag_signed_mcu_code: (flagsValue & 2) !== 0,
123
- flagLen,
124
- flagsValue,
125
- return_code: returnCode,
126
- };
127
- }, processErrorResponse);
128
- }
129
-
130
- deviceInfo() {
131
- return this.transport
132
- .send(0xe0, 0x01, 0, 0, Buffer.from([]), [ERROR_CODE.NoError, 0x6e00])
133
- .then((response: any) => {
134
- const errorCodeData = response.slice(-2);
135
- const returnCode = errorCodeData[0] * 256 + errorCodeData[1];
136
-
137
- if (returnCode === 0x6e00) {
138
- return { error_message: "This command is only available in the Dashboard", return_code: returnCode };
139
- }
140
-
141
- const targetId = response.slice(0, 4).toString("hex");
142
-
143
- let pos = 4;
144
- const secureElementVersionLen = response[pos];
145
- pos += 1;
146
- const seVersion = response.slice(pos, pos + secureElementVersionLen).toString();
147
- pos += secureElementVersionLen;
148
-
149
- const flagsLen = response[pos];
150
- pos += 1;
151
- const flag = response.slice(pos, pos + flagsLen).toString("hex");
152
- pos += flagsLen;
153
-
154
- const mcuVersionLen = response[pos];
155
- pos += 1;
156
- // Patch issue in mcu version
157
- let tmp = response.slice(pos, pos + mcuVersionLen);
158
- if (tmp[mcuVersionLen - 1] === 0) {
159
- tmp = response.slice(pos, pos + mcuVersionLen - 1);
160
- }
161
- const mcuVersion = tmp.toString();
162
-
163
- return {
164
- error_message: errorCodeToString(returnCode),
165
- flag,
166
- mcuVersion,
167
- return_code: returnCode,
168
- seVersion,
169
- // //
170
- targetId,
171
- };
172
- }, processErrorResponse);
173
- }
174
-
175
- async publicKey(path: number[]) {
176
- try {
177
- const serializedPath = await this.serializePath(path);
178
-
179
- switch (this.versionResponse.major) {
180
- case 1:
181
- return publicKeyv1(this, serializedPath);
182
- case 2: {
183
- const data = Buffer.concat([THORChainApp.serializeHRP("thor"), serializedPath]);
184
- return publicKeyv2(this, data);
185
- }
186
- default:
187
- return { error_message: "App Version is not supported", return_code: 0x6400 };
188
- }
189
- } catch (e) {
190
- return processErrorResponse(e);
191
- }
192
- }
193
-
194
- async getAddressAndPubKey(path: number[], hrp: string, showInDevice = false) {
195
- try {
196
- const serializedPath = await this.serializePath(path);
197
- const data = Buffer.concat([THORChainApp.serializeHRP(hrp), serializedPath]);
198
- const response = await this.transport.send(
199
- CLA,
200
- INS.GET_ADDR_SECP256K1,
201
- showInDevice ? P1_VALUES.SHOW_ADDRESS_IN_DEVICE : P1_VALUES.ONLY_RETRIEVE,
202
- 0,
203
- data,
204
- [ERROR_CODE.NoError],
205
- );
206
-
207
- const compressedPk = Buffer.from(response.slice(0, 33));
208
- const bech32Address = Buffer.from(response.slice(33, -2)).toString();
209
- const returnCode = response.readUInt16BE(response.length - 2);
210
-
211
- return {
212
- bech32_address: bech32Address,
213
- compressed_pk: compressedPk,
214
- error_message: errorCodeToString(returnCode),
215
- return_code: returnCode,
216
- };
217
- } catch (err) {
218
- return processErrorResponse(err);
219
- }
220
- }
221
-
222
- showAddressAndPubKey(path: number[], hrp: string) {
223
- return this.getAddressAndPubKey(path, hrp, true);
224
- }
225
-
226
- signSendChunk(chunkIdx: number, chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {
227
- switch (this.versionResponse.major) {
228
- case 1:
229
- return signSendChunkv1(this, chunkIdx, chunkNum, chunk, txType);
230
- case 2:
231
- return signSendChunkv2(this, chunkIdx, chunkNum, chunk, txType);
232
- default:
233
- return { error_message: "App Version is not supported", return_code: 0x6400 };
234
- }
235
- }
236
-
237
- async sign(path: number[], message: string, txType = P2_VALUES.JSON) {
238
- const buffer = Buffer.from(message);
239
- let chunks: Buffer[] = [];
240
- let response: any;
241
- try {
242
- chunks = await this.signGetChunks(path, buffer);
243
- response = await this.signSendChunk(1, chunks.length, chunks[0] as Buffer, txType);
244
- } catch (error) {
245
- processErrorResponse(error);
246
- }
247
- let result = { error_message: response.error_message, return_code: response.return_code, signature: null };
248
-
249
- for (let i = 1; i < chunks.length; i += 1) {
250
- result = await this.signSendChunk(1 + i, chunks.length, chunks[i] as Buffer, txType);
251
- if (result.return_code !== ERROR_CODE.NoError) {
252
- break;
253
- }
254
- }
255
-
256
- return { error_message: result.error_message, return_code: result.return_code, signature: result.signature };
257
- }
258
- }
@@ -1,69 +0,0 @@
1
- import { base64 } from "@scure/base";
2
- import { SwapKitError } from "@swapkit/helpers";
3
-
4
- export const getSignature = (signatureArray: any) => {
5
- // Check Type Length Value encoding
6
- if (signatureArray.length < 64) {
7
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "Too short" });
8
- }
9
- if (signatureArray[0] !== 0x30) {
10
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "TLV encoding: expected first byte 0x30" });
11
- }
12
- if (signatureArray[1] + 2 !== signatureArray.length) {
13
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "signature length does not match TLV" });
14
- }
15
- if (signatureArray[2] !== 0x02) {
16
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "TLV encoding: expected length type 0x02" });
17
- }
18
-
19
- // r signature
20
- const rLength = signatureArray[3];
21
- let rSignature = signatureArray.slice(4, rLength + 4);
22
-
23
- // Drop leading zero on some 'r' signatures that are 33 bytes.
24
- if (rSignature.length === 33 && rSignature[0] === 0) {
25
- rSignature = rSignature.slice(1, 33);
26
- } else if (rSignature.length === 33) {
27
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "r too long" });
28
- }
29
-
30
- // add leading zero's to pad to 32 bytes
31
- while (rSignature.length < 32) {
32
- rSignature.unshift(0);
33
- }
34
-
35
- // s signature
36
- if (signatureArray[rLength + 4] !== 0x02) {
37
- throw new SwapKitError("wallet_ledger_invalid_signature", {
38
- reason: "TLV encoding: expected length type 0x02 for s",
39
- });
40
- }
41
-
42
- const sLength = signatureArray[rLength + 5];
43
-
44
- if (4 + rLength + 2 + sLength !== signatureArray.length) {
45
- throw new SwapKitError("wallet_ledger_invalid_signature", {
46
- reason: "TLV byte lengths do not match message length",
47
- });
48
- }
49
-
50
- let sSignature = signatureArray.slice(rLength + 6, signatureArray.length);
51
-
52
- // Drop leading zero on 's' signatures that are 33 bytes. This shouldn't occur since ledger signs using "Small s" math. But just to be sure...
53
- if (sSignature.length === 33 && sSignature[0] === 0) {
54
- sSignature = sSignature.slice(1, 33);
55
- } else if (sSignature.length === 33) {
56
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "s too long" });
57
- }
58
-
59
- // add leading zero's to pad to 32 bytes
60
- while (sSignature.length < 32) {
61
- sSignature.unshift(0);
62
- }
63
-
64
- if (rSignature.length !== 32 || sSignature.length !== 32) {
65
- throw new SwapKitError("wallet_ledger_invalid_signature", { reason: "must be 32 bytes each" });
66
- }
67
-
68
- return base64.encode(Buffer.concat([rSignature, sSignature]));
69
- };