@injectivelabs/wallet-ledger 1.16.25-alpha.0 → 1.16.25

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 (58) hide show
  1. package/dist/cjs/index.d.ts +4 -0
  2. package/dist/cjs/index.js +24 -0
  3. package/dist/cjs/package.json +2 -2
  4. package/dist/cjs/strategy/Ledger/Base.d.ts +45 -0
  5. package/dist/cjs/strategy/Ledger/Base.js +283 -0
  6. package/dist/cjs/strategy/Ledger/Eip1193Provider.d.ts +4500 -0
  7. package/dist/cjs/strategy/Ledger/Eip1193Provider.js +192 -0
  8. package/dist/cjs/strategy/Ledger/LedgerLegacy.d.ts +5 -0
  9. package/dist/cjs/strategy/Ledger/LedgerLegacy.js +17 -0
  10. package/dist/cjs/strategy/Ledger/LedgerLive.d.ts +5 -0
  11. package/dist/cjs/strategy/Ledger/LedgerLive.js +17 -0
  12. package/dist/cjs/strategy/Ledger/hw/AccountManager.d.ts +22 -0
  13. package/dist/cjs/strategy/Ledger/hw/AccountManager.js +88 -0
  14. package/dist/cjs/strategy/Ledger/hw/index.d.ts +11 -0
  15. package/dist/cjs/strategy/Ledger/hw/index.js +66 -0
  16. package/dist/cjs/strategy/Ledger/utils.d.ts +16 -0
  17. package/dist/cjs/strategy/Ledger/utils.js +19 -0
  18. package/dist/cjs/strategy/LedgerCosmos/hw/AccountManager.d.ts +20 -0
  19. package/dist/cjs/strategy/LedgerCosmos/hw/AccountManager.js +69 -0
  20. package/dist/cjs/strategy/LedgerCosmos/hw/index.d.ts +11 -0
  21. package/dist/cjs/strategy/LedgerCosmos/hw/index.js +49 -0
  22. package/dist/cjs/strategy/LedgerCosmos/index.d.ts +37 -0
  23. package/dist/cjs/strategy/LedgerCosmos/index.js +159 -0
  24. package/dist/cjs/strategy/lib.d.ts +14 -0
  25. package/dist/cjs/strategy/lib.js +86 -0
  26. package/dist/cjs/types.d.ts +22 -0
  27. package/dist/cjs/types.js +12 -0
  28. package/dist/esm/index.d.ts +4 -115
  29. package/dist/esm/index.js +4 -2073
  30. package/dist/esm/package.json +2 -2
  31. package/dist/esm/strategy/Ledger/Base.d.ts +45 -0
  32. package/dist/esm/strategy/Ledger/Base.js +277 -0
  33. package/dist/esm/strategy/Ledger/Eip1193Provider.d.ts +4500 -0
  34. package/dist/esm/strategy/Ledger/Eip1193Provider.js +155 -0
  35. package/dist/esm/strategy/Ledger/LedgerLegacy.d.ts +5 -0
  36. package/dist/esm/strategy/Ledger/LedgerLegacy.js +10 -0
  37. package/dist/esm/strategy/Ledger/LedgerLive.d.ts +5 -0
  38. package/dist/esm/strategy/Ledger/LedgerLive.js +10 -0
  39. package/dist/esm/strategy/Ledger/hw/AccountManager.d.ts +22 -0
  40. package/dist/esm/strategy/Ledger/hw/AccountManager.js +85 -0
  41. package/dist/esm/strategy/Ledger/hw/index.d.ts +11 -0
  42. package/dist/esm/strategy/Ledger/hw/index.js +60 -0
  43. package/dist/esm/strategy/Ledger/utils.d.ts +16 -0
  44. package/dist/esm/strategy/Ledger/utils.js +14 -0
  45. package/dist/esm/strategy/LedgerCosmos/hw/AccountManager.d.ts +20 -0
  46. package/dist/esm/strategy/LedgerCosmos/hw/AccountManager.js +66 -0
  47. package/dist/esm/strategy/LedgerCosmos/hw/index.d.ts +11 -0
  48. package/dist/esm/strategy/LedgerCosmos/hw/index.js +43 -0
  49. package/dist/esm/strategy/LedgerCosmos/index.d.ts +37 -0
  50. package/dist/esm/strategy/LedgerCosmos/index.js +152 -0
  51. package/dist/esm/strategy/lib.d.ts +14 -0
  52. package/dist/esm/strategy/lib.js +46 -0
  53. package/dist/esm/types.d.ts +22 -0
  54. package/dist/esm/types.js +9 -0
  55. package/package.json +17 -17
  56. package/dist/cjs/index.cjs +0 -2364
  57. package/dist/cjs/index.d.cts +0 -115
  58. package/dist/esm/chunk-BIPRnmEv.js +0 -23
@@ -0,0 +1,4 @@
1
+ export { LedgerLive as LedgerLiveStrategy } from './strategy/Ledger/LedgerLive.js';
2
+ export { LedgerCosmos as LedgerCosmosStrategy } from './strategy/LedgerCosmos/index.js';
3
+ export { LedgerLegacy as LedgerLegacyStrategy } from './strategy/Ledger/LedgerLegacy.js';
4
+ export * from './types.js';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.LedgerLegacyStrategy = exports.LedgerCosmosStrategy = exports.LedgerLiveStrategy = void 0;
18
+ var LedgerLive_js_1 = require("./strategy/Ledger/LedgerLive.js");
19
+ Object.defineProperty(exports, "LedgerLiveStrategy", { enumerable: true, get: function () { return LedgerLive_js_1.LedgerLive; } });
20
+ var index_js_1 = require("./strategy/LedgerCosmos/index.js");
21
+ Object.defineProperty(exports, "LedgerCosmosStrategy", { enumerable: true, get: function () { return index_js_1.LedgerCosmos; } });
22
+ var LedgerLegacy_js_1 = require("./strategy/Ledger/LedgerLegacy.js");
23
+ Object.defineProperty(exports, "LedgerLegacyStrategy", { enumerable: true, get: function () { return LedgerLegacy_js_1.LedgerLegacy; } });
24
+ __exportStar(require("./types.js"), exports);
@@ -1,3 +1,3 @@
1
1
  {
2
- "type": "commonjs"
3
- }
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,45 @@
1
+ import { EvmChainId } from '@injectivelabs/ts-types';
2
+ import { WalletDeviceType, BaseConcreteStrategy } from '@injectivelabs/wallet-base';
3
+ import type { AccountAddress } from '@injectivelabs/ts-types';
4
+ import type { LedgerDerivationPathType } from '../../types.js';
5
+ import type { TxRaw, TxResponse, AminoSignResponse, DirectSignResponse } from '@injectivelabs/sdk-ts';
6
+ import type { StdSignDoc, Eip1193Provider, SendTransactionOptions, ConcreteWalletStrategy, ConcreteEvmWalletStrategyArgs } from '@injectivelabs/wallet-base';
7
+ export default class LedgerBase extends BaseConcreteStrategy implements ConcreteWalletStrategy {
8
+ private baseDerivationPath;
9
+ private derivationPathType;
10
+ private ledger;
11
+ private evmOptions;
12
+ private alchemy;
13
+ constructor(args: ConcreteEvmWalletStrategyArgs & {
14
+ derivationPathType: LedgerDerivationPathType;
15
+ });
16
+ getWalletDeviceType(): Promise<WalletDeviceType>;
17
+ enable(): Promise<boolean>;
18
+ disconnect(): Promise<void>;
19
+ getAddresses(): Promise<string[]>;
20
+ getSessionOrConfirm(address: AccountAddress): Promise<string>;
21
+ sendEvmTransaction(txData: any, args: {
22
+ address: string;
23
+ evmChainId: EvmChainId;
24
+ }): Promise<string>;
25
+ sendTransaction(transaction: TxRaw, options: SendTransactionOptions): Promise<TxResponse>;
26
+ signEip712TypedData(eip712json: string, address: AccountAddress): Promise<string>;
27
+ signAminoCosmosTransaction(_transaction: {
28
+ address: string;
29
+ signDoc: StdSignDoc;
30
+ }): Promise<AminoSignResponse>;
31
+ signCosmosTransaction(_transaction: {
32
+ txRaw: TxRaw;
33
+ accountNumber: number;
34
+ chainId: string;
35
+ address: string;
36
+ }): Promise<DirectSignResponse>;
37
+ signArbitrary(signer: AccountAddress, data: string | Uint8Array): Promise<string>;
38
+ getEthereumChainId(): Promise<string>;
39
+ getEvmTransactionReceipt(txHash: string, evmChainId?: EvmChainId): Promise<string>;
40
+ getPubKey(): Promise<string>;
41
+ private signEvmTransaction;
42
+ private getWalletForAddress;
43
+ getEip1193Provider(): Promise<Eip1193Provider>;
44
+ private getAlchemy;
45
+ }
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const viem_1 = require("viem");
7
+ const utils_1 = require("@injectivelabs/utils");
8
+ const ts_types_1 = require("@injectivelabs/ts-types");
9
+ const sdk_ts_1 = require("@injectivelabs/sdk-ts");
10
+ const alchemy_sdk_1 = require("alchemy-sdk");
11
+ const exceptions_1 = require("@injectivelabs/exceptions");
12
+ const wallet_base_1 = require("@injectivelabs/wallet-base");
13
+ const index_js_1 = __importDefault(require("./hw/index.js"));
14
+ const lib_js_1 = require("./../lib.js");
15
+ const utils_js_1 = require("./utils.js");
16
+ const Eip1193Provider_js_1 = require("./Eip1193Provider.js");
17
+ class LedgerBase extends wallet_base_1.BaseConcreteStrategy {
18
+ baseDerivationPath;
19
+ derivationPathType;
20
+ ledger;
21
+ evmOptions;
22
+ alchemy;
23
+ constructor(args) {
24
+ super(args);
25
+ this.baseDerivationPath = wallet_base_1.DEFAULT_BASE_DERIVATION_PATH;
26
+ this.derivationPathType = args.derivationPathType;
27
+ this.ledger = new index_js_1.default();
28
+ this.evmOptions = args.evmOptions;
29
+ }
30
+ async getWalletDeviceType() {
31
+ return Promise.resolve(wallet_base_1.WalletDeviceType.Hardware);
32
+ }
33
+ async enable() {
34
+ return Promise.resolve(true);
35
+ }
36
+ async disconnect() {
37
+ this.ledger = await this.ledger.refresh();
38
+ }
39
+ async getAddresses() {
40
+ const { baseDerivationPath, derivationPathType } = this;
41
+ try {
42
+ const accountManager = await this.ledger.getAccountManager();
43
+ const wallets = await accountManager.getWallets(baseDerivationPath, derivationPathType);
44
+ return wallets.map((k) => k.address);
45
+ }
46
+ catch (e) {
47
+ throw new exceptions_1.LedgerException(new Error(e.message), {
48
+ code: exceptions_1.UnspecifiedErrorCode,
49
+ type: exceptions_1.ErrorType.WalletError,
50
+ contextModule: wallet_base_1.WalletAction.GetAccounts,
51
+ });
52
+ }
53
+ }
54
+ async getSessionOrConfirm(address) {
55
+ return Promise.resolve(`0x${Buffer.from(`Confirmation for ${address} at time: ${Date.now()}`).toString('hex')}`);
56
+ }
57
+ async sendEvmTransaction(txData, args) {
58
+ const signedTransaction = await this.signEvmTransaction(txData, args);
59
+ try {
60
+ const alchemy = await this.getAlchemy(args.evmChainId);
61
+ const provider = await alchemy.config.getProvider();
62
+ const txHash = await provider.send('eth_sendRawTransaction', [
63
+ signedTransaction,
64
+ ]);
65
+ return txHash;
66
+ }
67
+ catch (e) {
68
+ throw new exceptions_1.LedgerException(new Error(e.message), {
69
+ code: exceptions_1.UnspecifiedErrorCode,
70
+ type: exceptions_1.ErrorType.WalletError,
71
+ contextModule: wallet_base_1.WalletAction.SendEvmTransaction,
72
+ });
73
+ }
74
+ }
75
+ async sendTransaction(transaction, options) {
76
+ const { endpoints, txTimeout } = options;
77
+ if (!endpoints) {
78
+ throw new exceptions_1.WalletException(new Error('You have to pass endpoints.grpc within the options for using Ethereum native wallets'));
79
+ }
80
+ const txApi = new sdk_ts_1.TxGrpcApi(endpoints.grpc);
81
+ const response = await txApi.broadcast(transaction, { txTimeout });
82
+ if (response.code !== 0) {
83
+ throw new exceptions_1.TransactionException(new Error(response.rawLog), {
84
+ code: exceptions_1.UnspecifiedErrorCode,
85
+ contextCode: response.code,
86
+ contextModule: response.codespace,
87
+ });
88
+ }
89
+ return response;
90
+ }
91
+ async signEip712TypedData(eip712json, address) {
92
+ const { derivationPath } = await this.getWalletForAddress(address);
93
+ const object = JSON.parse(eip712json);
94
+ try {
95
+ const ledger = await this.ledger.getInstance();
96
+ const result = await ledger.signEIP712Message(derivationPath, object);
97
+ const combined = `${result.r}${result.s}${result.v.toString(16)}`;
98
+ return combined.startsWith('0x') ? combined : `0x${combined}`;
99
+ }
100
+ catch (e) {
101
+ const errorMessage = e.message;
102
+ const isKnownNanoSError = errorMessage.includes('instruction not supported') ||
103
+ errorMessage.includes('invalid status') ||
104
+ errorMessage.includes('not supported') ||
105
+ errorMessage.includes('INS_NOT_SUPPORTED');
106
+ if (!isKnownNanoSError) {
107
+ throw new exceptions_1.LedgerException(new Error(errorMessage), {
108
+ code: exceptions_1.UnspecifiedErrorCode,
109
+ type: exceptions_1.ErrorType.WalletError,
110
+ contextModule: wallet_base_1.WalletAction.SignTransaction,
111
+ });
112
+ }
113
+ try {
114
+ const ledger = await this.ledger.getInstance();
115
+ const result = await ledger.signEIP712HashedMessage(derivationPath, (0, utils_js_1.domainHash)(object), (0, utils_js_1.messageHash)(object));
116
+ const combined = `${result.r}${result.s}${result.v.toString(16)}`;
117
+ return combined.startsWith('0x') ? combined : `0x${combined}`;
118
+ }
119
+ catch (e) {
120
+ throw new exceptions_1.LedgerException(new Error(e.message), {
121
+ code: exceptions_1.UnspecifiedErrorCode,
122
+ type: exceptions_1.ErrorType.WalletError,
123
+ contextModule: wallet_base_1.WalletAction.SignTransaction,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ async signAminoCosmosTransaction(_transaction) {
129
+ throw new exceptions_1.WalletException(new Error('This wallet does not support signing Cosmos transactions'), {
130
+ code: exceptions_1.UnspecifiedErrorCode,
131
+ type: exceptions_1.ErrorType.WalletError,
132
+ contextModule: wallet_base_1.WalletAction.SendTransaction,
133
+ });
134
+ }
135
+ async signCosmosTransaction(_transaction) {
136
+ throw new exceptions_1.WalletException(new Error('This wallet does not support signing Cosmos transactions'), {
137
+ code: exceptions_1.UnspecifiedErrorCode,
138
+ type: exceptions_1.ErrorType.WalletError,
139
+ contextModule: wallet_base_1.WalletAction.SendTransaction,
140
+ });
141
+ }
142
+ async signArbitrary(signer, data) {
143
+ try {
144
+ const { derivationPath } = await this.getWalletForAddress(signer);
145
+ const ledger = await this.ledger.getInstance();
146
+ const result = await ledger.signPersonalMessage(derivationPath, Buffer.from((0, sdk_ts_1.toUtf8)(data), 'utf8').toString('hex'));
147
+ const combined = `${result.r}${result.s}${result.v.toString(16)}`;
148
+ return combined.startsWith('0x') ? combined : `0x${combined}`;
149
+ }
150
+ catch (e) {
151
+ throw new exceptions_1.LedgerException(new Error(e.message), {
152
+ code: exceptions_1.UnspecifiedErrorCode,
153
+ type: exceptions_1.ErrorType.WalletError,
154
+ contextModule: wallet_base_1.WalletAction.SignTransaction,
155
+ });
156
+ }
157
+ }
158
+ async getEthereumChainId() {
159
+ const alchemy = await this.getAlchemy();
160
+ const alchemyProvider = await alchemy.config.getProvider();
161
+ return alchemyProvider.network.chainId.toString();
162
+ }
163
+ async getEvmTransactionReceipt(txHash, evmChainId) {
164
+ const alchemy = await this.getAlchemy(evmChainId);
165
+ const provider = await alchemy.config.getProvider();
166
+ const interval = 3000;
167
+ const maxAttempts = 10;
168
+ let attempts = 0;
169
+ while (attempts < maxAttempts) {
170
+ attempts++;
171
+ await (0, utils_1.sleep)(interval);
172
+ try {
173
+ const receipt = await provider.send('eth_getTransactionReceipt', [
174
+ txHash,
175
+ ]);
176
+ if (receipt) {
177
+ return txHash;
178
+ }
179
+ }
180
+ catch { }
181
+ }
182
+ throw new Error(`Failed to retrieve transaction receipt for txHash: ${txHash}`);
183
+ }
184
+ async getPubKey() {
185
+ throw new exceptions_1.WalletException(new Error('You can only fetch PubKey from Cosmos native wallets'));
186
+ }
187
+ async signEvmTransaction(txData, args) {
188
+ const ledgerService = await (0, lib_js_1.loadLedgerServiceType)();
189
+ const alchemy = await this.getAlchemy(args.evmChainId);
190
+ const chainId = parseInt(args.evmChainId.toString(), 10);
191
+ const nonce = await alchemy.core.getTransactionCount(args.address);
192
+ const parseHexValue = (value) => {
193
+ if (typeof value === 'string') {
194
+ const hexValue = value.startsWith('0x') ? value : `0x${value}`;
195
+ return BigInt(hexValue);
196
+ }
197
+ return BigInt(value);
198
+ };
199
+ const eip1559TxData = {
200
+ type: 'eip1559',
201
+ chainId,
202
+ nonce,
203
+ to: txData.to,
204
+ value: parseHexValue(txData.value || '0x0'),
205
+ data: txData.data,
206
+ gas: parseHexValue(txData.gas),
207
+ maxFeePerGas: parseHexValue(txData.maxFeePerGas),
208
+ maxPriorityFeePerGas: parseHexValue(txData.maxPriorityFeePerGas),
209
+ };
210
+ // Serialize the transaction
211
+ const serializedTx = (0, viem_1.serializeTransaction)(eip1559TxData);
212
+ const serializedTxHex = serializedTx.slice(2); // Remove 0x prefix
213
+ try {
214
+ const ledger = await this.ledger.getInstance();
215
+ const { derivationPath } = await this.getWalletForAddress(args.address);
216
+ // Resolve transaction for Ledger display
217
+ const resolution = await ledgerService.resolveTransaction(serializedTxHex, {}, {});
218
+ // Sign the transaction with Ledger
219
+ const txSig = await ledger.signTransaction(derivationPath, serializedTxHex, resolution);
220
+ const signedTxData = {
221
+ ...eip1559TxData,
222
+ v: BigInt(`0x${txSig.v}`),
223
+ r: `0x${txSig.r}`,
224
+ s: `0x${txSig.s}`,
225
+ };
226
+ return (0, viem_1.serializeTransaction)(signedTxData);
227
+ }
228
+ catch (e) {
229
+ throw new exceptions_1.LedgerException(new Error(e.message), {
230
+ code: exceptions_1.UnspecifiedErrorCode,
231
+ type: exceptions_1.ErrorType.WalletError,
232
+ contextModule: wallet_base_1.WalletAction.SignEvmTransaction,
233
+ });
234
+ }
235
+ }
236
+ async getWalletForAddress(address) {
237
+ try {
238
+ const { baseDerivationPath, derivationPathType } = this;
239
+ const accountManager = await this.ledger.getAccountManager();
240
+ if (!accountManager.hasWalletForAddress(address)) {
241
+ for (let i = 0; i < wallet_base_1.DEFAULT_ADDRESS_SEARCH_LIMIT / wallet_base_1.DEFAULT_NUM_ADDRESSES_TO_FETCH; i += 1) {
242
+ await accountManager.getWallets(baseDerivationPath, derivationPathType);
243
+ if (accountManager.hasWalletForAddress(address)) {
244
+ return (await accountManager.getWalletForAddress(address));
245
+ }
246
+ }
247
+ }
248
+ return (await accountManager.getWalletForAddress(address));
249
+ }
250
+ catch (e) {
251
+ throw new exceptions_1.LedgerException(new Error(e.message), {
252
+ code: exceptions_1.UnspecifiedErrorCode,
253
+ type: exceptions_1.ErrorType.WalletError,
254
+ contextModule: wallet_base_1.WalletAction.GetAccounts,
255
+ });
256
+ }
257
+ }
258
+ async getEip1193Provider() {
259
+ return new Eip1193Provider_js_1.LedgerEip1193Provider(this.ledger, {
260
+ chainId: this.evmOptions.evmChainId.toString(),
261
+ derivationPath: this.baseDerivationPath,
262
+ });
263
+ }
264
+ async getAlchemy(evmChainId) {
265
+ if (this.alchemy) {
266
+ return this.alchemy;
267
+ }
268
+ const options = this.evmOptions;
269
+ const chainId = evmChainId || options.evmChainId;
270
+ const url = options.rpcUrl || options.rpcUrls?.[chainId];
271
+ if (!url) {
272
+ throw new exceptions_1.GeneralException(new Error('Please pass rpcUrl within the evmOptions'));
273
+ }
274
+ this.alchemy = new alchemy_sdk_1.Alchemy({
275
+ apiKey: (0, wallet_base_1.getKeyFromRpcUrl)(url),
276
+ network: chainId === ts_types_1.EvmChainId.Mainnet
277
+ ? alchemy_sdk_1.Network.ETH_MAINNET
278
+ : alchemy_sdk_1.Network.ETH_SEPOLIA,
279
+ });
280
+ return this.alchemy;
281
+ }
282
+ }
283
+ exports.default = LedgerBase;