@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,85 +1,214 @@
1
+ import type { StdSignDoc } from "@cosmjs/amino";
2
+ import type { SignerCosmos } from "@ledgerhq/device-signer-kit-cosmos";
3
+ import type LegacyCosmosApp from "@ledgerhq/hw-app-cosmos";
1
4
  import type Transport from "@ledgerhq/hw-transport";
5
+ import { hex } from "@scure/base";
2
6
  import {
3
7
  type DerivationPathArray,
4
8
  derivationPathToString,
5
9
  NetworkDerivationPath,
6
10
  SwapKitError,
7
11
  } from "@swapkit/helpers";
8
- import { CosmosLedgerInterface } from "../interfaces/CosmosLedgerInterface";
12
+ import type { OfflineAminoSigner } from "@swapkit/toolboxes/cosmos";
9
13
 
10
- export class CosmosLedger extends CosmosLedgerInterface {
11
- private pubKey: string | null = null;
14
+ import type { LedgerDMKSession } from "../helpers/dmk";
15
+ import { createLedgerSessionSigner } from "../helpers/dmk";
16
+ import {
17
+ executeLedgerDeviceAction,
18
+ type LedgerDeviceActionStateHandler,
19
+ toLedgerDeviceError,
20
+ ZONDAX_USER_REFUSED_STATUS_WORDS,
21
+ } from "../helpers/executeDeviceAction";
22
+ import { toLowSSignature } from "../helpers/lowS";
23
+
24
+ interface CosmosLedgerParams {
25
+ derivationPath?: DerivationPathArray | string;
26
+ dmkSession?: LedgerDMKSession;
27
+ onDeviceActionState?: LedgerDeviceActionStateHandler;
28
+ transport?: Transport;
29
+ }
30
+
31
+ interface CosmosAddressAndPublicKey {
32
+ address: string;
33
+ publicKey: string;
34
+ }
12
35
 
13
- derivationPath: string;
36
+ function normalizeCosmosPath(path: DerivationPathArray | string) {
37
+ const normalized = (typeof path === "string" ? path : derivationPathToString(path))
38
+ .replace(/^m\//, "")
39
+ .replace(/^\/+/, "");
14
40
 
15
- constructor(derivationPath: DerivationPathArray = NetworkDerivationPath.GAIA, transport?: Transport) {
16
- super(transport);
17
- this.chain = "cosmos";
18
- this.derivationPath = derivationPathToString(derivationPath);
41
+ if (!/^44'\/118'\/\d+'\/(0|1)\/\d+$/.test(normalized)) {
42
+ throw new SwapKitError("wallet_ledger_invalid_params", {
43
+ path: normalized,
44
+ reason: "Expected a five-level Cosmos derivation path with coin type 118",
45
+ });
19
46
  }
20
47
 
21
- connect = async () => {
22
- await this.checkOrCreateTransportAndLedger(true);
23
- const { publicKey, address } = await this.getAddressAndPubKey();
48
+ return normalized;
49
+ }
24
50
 
25
- this.pubKey = Buffer.from(publicKey, "hex").toString("base64");
51
+ // cosmjs is CJS and `require`s ESM-only `@scure/base`; loading it lazily keeps Bun from rejecting that
52
+ // require when the module graph also contains the ESM-only `@swapkit/*` packages.
53
+ async function normalizeCosmosSignature(signature: Uint8Array) {
54
+ const { Secp256k1Signature } = await import("@cosmjs/crypto");
55
+ try {
56
+ return toLowSSignature(
57
+ signature.length === 64
58
+ ? Secp256k1Signature.fromFixedLength(signature).toFixedLength()
59
+ : Secp256k1Signature.fromDer(signature).toFixedLength(),
60
+ );
61
+ } catch (error) {
62
+ throw new SwapKitError("wallet_ledger_invalid_response", error);
63
+ }
64
+ }
26
65
 
27
- return address;
28
- };
66
+ export class CosmosLedger {
67
+ readonly chain = "cosmos";
68
+ readonly derivationPath: string;
69
+ private readonly onDeviceActionState?: LedgerDeviceActionStateHandler;
70
+ private readonly transport?: Transport;
71
+ private legacyAppPromise?: Promise<LegacyCosmosApp>;
72
+ private pubKey: string | null = null;
73
+ private readonly getSessionSigner: () => Promise<SignerCosmos>;
74
+
75
+ constructor({
76
+ derivationPath = NetworkDerivationPath.GAIA,
77
+ dmkSession,
78
+ onDeviceActionState,
79
+ transport,
80
+ }: CosmosLedgerParams = {}) {
81
+ this.derivationPath = normalizeCosmosPath(derivationPath);
82
+ this.getSessionSigner = createLedgerSessionSigner({
83
+ build: async (session) => {
84
+ const { SignerCosmosBuilder } = await import("@ledgerhq/device-signer-kit-cosmos");
85
+ return new SignerCosmosBuilder(session).build();
86
+ },
87
+ dmkSession,
88
+ });
89
+ this.onDeviceActionState = onDeviceActionState;
90
+ this.transport = transport;
91
+ }
29
92
 
30
- getAddressAndPubKey = async () => {
31
- await this.checkOrCreateTransportAndLedger(true);
93
+ private getSigner() {
94
+ if (this.transport) {
95
+ throw new SwapKitError("wallet_ledger_invalid_params", {
96
+ reason: "A Device Signer Kit operation is unavailable when a legacy transport is supplied",
97
+ });
98
+ }
32
99
 
33
- const response = await this.ledgerApp.getAddress(this.derivationPath, this.chain);
100
+ return this.getSessionSigner();
101
+ }
34
102
 
35
- return response;
36
- };
103
+ private getLegacyApp() {
104
+ if (!this.transport) {
105
+ throw new SwapKitError("wallet_ledger_invalid_params", { reason: "Legacy Cosmos transport is unavailable" });
106
+ }
37
107
 
38
- signTransaction = async (rawTx: string, sequence = "0") => {
39
- await this.checkOrCreateTransportAndLedger(true);
108
+ this.legacyAppPromise ??= import("@ledgerhq/hw-app-cosmos").then(
109
+ ({ default: CosmosApp }) => new CosmosApp(this.transport as Transport),
110
+ );
111
+ return this.legacyAppPromise;
112
+ }
40
113
 
41
- const { return_code, error_message, signature } = await this.ledgerApp.sign(this.derivationPath, rawTx);
114
+ // An injected LedgerJS transport rejects with hw-transport and hw-app-cosmos errors; map them as the signer kit
115
+ // path below does.
116
+ private async runLegacyOperation<Output>(operation: (app: LegacyCosmosApp) => Promise<Output>) {
117
+ const app = await this.getLegacyApp();
118
+ try {
119
+ return await operation(app);
120
+ } catch (error) {
121
+ throw toLedgerDeviceError(error, { userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS });
122
+ }
123
+ }
42
124
 
43
- if (!this.pubKey) throw new SwapKitError("wallet_ledger_pubkey_not_found");
125
+ private async signBytes(message: Uint8Array) {
126
+ if (this.transport) {
127
+ const response = await this.runLegacyOperation((app) =>
128
+ app.sign(this.derivationPath, new TextDecoder().decode(message)),
129
+ );
130
+ if (response.return_code !== 0x9000 || !response.signature) {
131
+ throw new SwapKitError("wallet_ledger_invalid_response", { returnCode: response.return_code });
132
+ }
133
+ return normalizeCosmosSignature(response.signature);
134
+ }
44
135
 
45
- this.validateResponse(return_code, error_message);
136
+ const signer = await this.getSigner();
137
+ const signature = await executeLedgerDeviceAction({
138
+ action: () => signer.signTransaction(this.derivationPath, this.chain, message),
139
+ onDeviceActionState: this.onDeviceActionState,
140
+ userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,
141
+ });
142
+ return normalizeCosmosSignature(signature);
143
+ }
46
144
 
47
- return [{ pub_key: { type: "tendermint/PubKeySecp256k1", value: this.pubKey }, sequence, signature }];
48
- };
145
+ async connect() {
146
+ if (this.transport) await this.getLegacyApp();
147
+ else await this.getSigner();
49
148
 
50
- signAmino = async (signerAddress: string, signDoc: any): Promise<any> => {
51
- await this.checkOrCreateTransportAndLedger(true);
149
+ const { address, publicKey } = await this.getAddressAndPubKey();
150
+ this.pubKey = Buffer.from(publicKey, "hex").toString("base64");
151
+ return address;
152
+ }
52
153
 
53
- const accounts = await this.getAccounts();
54
- const accountIndex = accounts.findIndex((account) => account.address === signerAddress);
154
+ async disconnect() {}
55
155
 
56
- if (accountIndex === -1) {
57
- throw new SwapKitError("wallet_ledger_address_not_found", { address: signerAddress });
156
+ async getAddressAndPubKey(): Promise<CosmosAddressAndPublicKey> {
157
+ if (this.transport) {
158
+ return this.runLegacyOperation((app) => app.getAddress(this.derivationPath, this.chain));
58
159
  }
59
160
 
60
- const importedAmino = await import("@cosmjs/amino");
61
- const encodeSecp256k1Signature =
62
- importedAmino.encodeSecp256k1Signature ?? importedAmino.default?.encodeSecp256k1Signature;
63
- const serializeSignDoc = importedAmino.serializeSignDoc ?? importedAmino.default?.serializeSignDoc;
64
- const importedCrypto = await import("@cosmjs/crypto");
65
- const Secp256k1Signature = importedCrypto.Secp256k1Signature ?? importedCrypto.default?.Secp256k1Signature;
161
+ const signer = await this.getSigner();
162
+ const { address, publicKey } = await executeLedgerDeviceAction({
163
+ action: () => signer.getAddress(this.derivationPath, this.chain),
164
+ onDeviceActionState: this.onDeviceActionState,
165
+ userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,
166
+ });
167
+ return { address, publicKey: hex.encode(publicKey) };
168
+ }
66
169
 
67
- const message = serializeSignDoc(signDoc);
68
- const signature = await this.ledgerApp.sign(this.derivationPath, message);
170
+ async showAddressAndPubKey(): Promise<CosmosAddressAndPublicKey> {
171
+ if (this.transport) {
172
+ return this.runLegacyOperation((app) => app.getAddress(this.derivationPath, this.chain, true));
173
+ }
69
174
 
70
- this.validateResponse(signature.return_code, signature.error_message);
175
+ const signer = await this.getSigner();
176
+ const { address, publicKey } = await executeLedgerDeviceAction({
177
+ action: () => signer.getAddress(this.derivationPath, this.chain, { checkOnDevice: true }),
178
+ onDeviceActionState: this.onDeviceActionState,
179
+ userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,
180
+ });
181
+ return { address, publicKey: hex.encode(publicKey) };
182
+ }
71
183
 
72
- const secpSignature = Secp256k1Signature.fromDer(signature.signature).toFixedLength();
184
+ async signTransaction(rawTx: string | Uint8Array, sequence = "0") {
185
+ const signature = await this.signBytes(typeof rawTx === "string" ? new TextEncoder().encode(rawTx) : rawTx);
186
+ if (!this.pubKey) {
187
+ const { publicKey } = await this.getAddressAndPubKey();
188
+ this.pubKey = Buffer.from(publicKey, "hex").toString("base64");
189
+ }
73
190
 
74
- return { signature: encodeSecp256k1Signature(accounts[0].pubkey, secpSignature), signed: signDoc };
75
- };
191
+ return [{ pub_key: { type: "tendermint/PubKeySecp256k1", value: this.pubKey }, sequence, signature }];
192
+ }
76
193
 
77
- getAccounts = async () => {
78
- await this.checkOrCreateTransportAndLedger(true);
194
+ // Typed against the toolbox signer contract so CosmosLedger satisfies `createSigningStargateClient`.
195
+ async signAmino(
196
+ signerAddress: string,
197
+ signDoc: Parameters<OfflineAminoSigner["signAmino"]>[1],
198
+ ): ReturnType<OfflineAminoSigner["signAmino"]> {
199
+ const accounts = await this.getAccounts();
200
+ const account = accounts.find(({ address }) => address === signerAddress);
201
+ if (!account) {
202
+ throw new SwapKitError("wallet_ledger_address_not_found", { address: signerAddress });
203
+ }
204
+
205
+ const { encodeSecp256k1Signature, serializeSignDoc } = await import("@cosmjs/amino");
206
+ const signature = await this.signBytes(serializeSignDoc(signDoc as StdSignDoc));
207
+ return { signature: encodeSecp256k1Signature(account.pubkey, signature), signed: signDoc };
208
+ }
79
209
 
80
- const addressAndPubKey = await this.getAddressAndPubKey();
81
- return [
82
- { address: addressAndPubKey.address, algo: "secp256k1", pubkey: Buffer.from(addressAndPubKey.publicKey, "hex") },
83
- ] as any[];
84
- };
210
+ async getAccounts() {
211
+ const { address, publicKey } = await this.getAddressAndPubKey();
212
+ return [{ address, algo: "secp256k1" as const, pubkey: hex.decode(publicKey) }];
213
+ }
85
214
  }