@injectivelabs/wallet-trezor 0.0.2
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.
- package/README.md +111 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/strategy/hw/AccountManager.d.ts +17 -0
- package/dist/cjs/strategy/hw/AccountManager.d.ts.map +1 -0
- package/dist/cjs/strategy/hw/AccountManager.js +85 -0
- package/dist/cjs/strategy/hw/AccountManager.js.map +1 -0
- package/dist/cjs/strategy/hw/index.d.ts +11 -0
- package/dist/cjs/strategy/hw/index.d.ts.map +1 -0
- package/dist/cjs/strategy/hw/index.js +75 -0
- package/dist/cjs/strategy/hw/index.js.map +1 -0
- package/dist/cjs/strategy/strategy.d.ts +38 -0
- package/dist/cjs/strategy/strategy.d.ts.map +1 -0
- package/dist/cjs/strategy/strategy.js +315 -0
- package/dist/cjs/strategy/strategy.js.map +1 -0
- package/dist/cjs/types.d.ts +7 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.ts +17 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +48 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/strategy/hw/AccountManager.d.ts +17 -0
- package/dist/esm/strategy/hw/AccountManager.d.ts.map +1 -0
- package/dist/esm/strategy/hw/AccountManager.js +68 -0
- package/dist/esm/strategy/hw/AccountManager.js.map +1 -0
- package/dist/esm/strategy/hw/index.d.ts +11 -0
- package/dist/esm/strategy/hw/index.d.ts.map +1 -0
- package/dist/esm/strategy/hw/index.js +54 -0
- package/dist/esm/strategy/hw/index.js.map +1 -0
- package/dist/esm/strategy/strategy.d.ts +38 -0
- package/dist/esm/strategy/strategy.d.ts.map +1 -0
- package/dist/esm/strategy/strategy.js +272 -0
- package/dist/esm/strategy/strategy.js.map +1 -0
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +17 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +48 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.TrezorWallet = void 0;
|
|
27
|
+
/* eslint-disable camelcase */
|
|
28
|
+
/* eslint-disable class-methods-use-this */
|
|
29
|
+
const ts_types_1 = require("@injectivelabs/ts-types");
|
|
30
|
+
const alchemy_sdk_1 = require("alchemy-sdk");
|
|
31
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
32
|
+
const tx_1 = require("@ethereumjs/tx");
|
|
33
|
+
const common_1 = require("@ethereumjs/common");
|
|
34
|
+
const connect_web_1 = __importDefault(require("@trezor/connect-web"));
|
|
35
|
+
const exceptions_1 = require("@injectivelabs/exceptions");
|
|
36
|
+
const sdk_ts_1 = require("@injectivelabs/sdk-ts");
|
|
37
|
+
const wallet_base_1 = require("@injectivelabs/wallet-base");
|
|
38
|
+
const hw_1 = __importDefault(require("./hw"));
|
|
39
|
+
const utils_1 = require("../utils");
|
|
40
|
+
const getNetworkFromChainId = (chainId) => {
|
|
41
|
+
if (chainId === ts_types_1.EthereumChainId.Goerli) {
|
|
42
|
+
return common_1.Chain.Goerli;
|
|
43
|
+
}
|
|
44
|
+
if (chainId === ts_types_1.EthereumChainId.Sepolia) {
|
|
45
|
+
return common_1.Chain.Sepolia;
|
|
46
|
+
}
|
|
47
|
+
if (chainId === ts_types_1.EthereumChainId.Kovan) {
|
|
48
|
+
return common_1.Chain.Goerli;
|
|
49
|
+
}
|
|
50
|
+
return common_1.Chain.Mainnet;
|
|
51
|
+
};
|
|
52
|
+
class TrezorWallet extends wallet_base_1.BaseConcreteStrategy {
|
|
53
|
+
constructor(args) {
|
|
54
|
+
super(args);
|
|
55
|
+
this.trezor = new hw_1.default();
|
|
56
|
+
this.ethereumOptions = args.ethereumOptions;
|
|
57
|
+
}
|
|
58
|
+
getWalletDeviceType() {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
return Promise.resolve(wallet_base_1.WalletDeviceType.Hardware);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
enable() {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
return Promise.resolve(true);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
disconnect() {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
this.trezor = new hw_1.default();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
getAddresses() {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
try {
|
|
76
|
+
yield this.trezor.connect();
|
|
77
|
+
const accountManager = yield this.trezor.getAccountManager();
|
|
78
|
+
const wallets = yield accountManager.getWallets();
|
|
79
|
+
return wallets.map((k) => k.address);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
throw new exceptions_1.TrezorException(new Error(e.message), {
|
|
83
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
84
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
85
|
+
contextModule: wallet_base_1.WalletAction.GetAccounts,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
getSessionOrConfirm(address) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
return Promise.resolve(`0x${Buffer.from(`Confirmation for ${address} at time: ${Date.now()}`).toString('hex')}`);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
sendEthereumTransaction(txData, options) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const signedTransaction = yield this.signEthereumTransaction(txData, options);
|
|
98
|
+
try {
|
|
99
|
+
const alchemy = yield this.getAlchemy();
|
|
100
|
+
const txReceipt = yield alchemy.core.sendTransaction((0, ethereumjs_util_1.addHexPrefix)(signedTransaction.serialize().toString('hex')));
|
|
101
|
+
return txReceipt.hash;
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
throw new exceptions_1.TrezorException(new Error(e.message), {
|
|
105
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
106
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
107
|
+
contextModule: wallet_base_1.WalletAction.SendEthereumTransaction,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
sendTransaction(transaction, options) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
const { endpoints, txTimeout } = options;
|
|
115
|
+
if (!endpoints) {
|
|
116
|
+
throw new exceptions_1.WalletException(new Error('You have to pass endpoints.grpc within the options for using Ethereum native wallets'));
|
|
117
|
+
}
|
|
118
|
+
const txApi = new sdk_ts_1.TxGrpcApi(endpoints.grpc);
|
|
119
|
+
const response = yield txApi.broadcast(transaction, { txTimeout });
|
|
120
|
+
if (response.code !== 0) {
|
|
121
|
+
throw new exceptions_1.TransactionException(new Error(response.rawLog), {
|
|
122
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
123
|
+
contextCode: response.code,
|
|
124
|
+
contextModule: response.codespace,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return response;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
signEip712TypedData(eip712json, address) {
|
|
131
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
132
|
+
const object = JSON.parse(eip712json);
|
|
133
|
+
const compatibleObject = Object.assign(Object.assign({}, object), { domain: Object.assign(Object.assign({}, object.domain), { chainId: object.domain.chainId, salt: '0' }) });
|
|
134
|
+
const dataWithHashes = (0, utils_1.transformTypedData)(compatibleObject);
|
|
135
|
+
const _a = dataWithHashes.types, _b = _a === void 0 ? {} : _a, { EIP712Domain = [] } = _b, otherTypes = __rest(_b, ["EIP712Domain"]), { message = {}, domain = {}, primaryType, domain_separator_hash, message_hash } = dataWithHashes;
|
|
136
|
+
try {
|
|
137
|
+
yield this.trezor.connect();
|
|
138
|
+
const { derivationPath } = yield this.getWalletForAddress(address);
|
|
139
|
+
const response = yield connect_web_1.default.ethereumSignTypedData({
|
|
140
|
+
path: derivationPath,
|
|
141
|
+
data: {
|
|
142
|
+
types: Object.assign({ EIP712Domain }, otherTypes),
|
|
143
|
+
message,
|
|
144
|
+
domain,
|
|
145
|
+
primaryType,
|
|
146
|
+
},
|
|
147
|
+
message_hash,
|
|
148
|
+
domain_separator_hash,
|
|
149
|
+
metamask_v4_compat: true,
|
|
150
|
+
});
|
|
151
|
+
if (!response.success) {
|
|
152
|
+
// noinspection ExceptionCaughtLocallyJS
|
|
153
|
+
throw new Error((response.payload && response.payload.error) || 'Unknown error');
|
|
154
|
+
}
|
|
155
|
+
return response.payload.signature;
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
throw new exceptions_1.TrezorException(new Error(e.message), {
|
|
159
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
160
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
161
|
+
contextModule: wallet_base_1.WalletAction.SignTransaction,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
signAminoCosmosTransaction(_transaction) {
|
|
167
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
168
|
+
throw new exceptions_1.WalletException(new Error('This wallet does not support signing Cosmos transactions'), {
|
|
169
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
170
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
171
|
+
contextModule: wallet_base_1.WalletAction.SendTransaction,
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// eslint-disable-next-line class-methods-use-this
|
|
176
|
+
signCosmosTransaction(_transaction) {
|
|
177
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
throw new exceptions_1.WalletException(new Error('This wallet does not support signing Cosmos transactions'), {
|
|
179
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
180
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
181
|
+
contextModule: wallet_base_1.WalletAction.SendTransaction,
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
signArbitrary(signer, data) {
|
|
186
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
try {
|
|
188
|
+
yield this.trezor.connect();
|
|
189
|
+
const { derivationPath } = yield this.getWalletForAddress(signer);
|
|
190
|
+
const response = yield connect_web_1.default.ethereumSignMessage({
|
|
191
|
+
path: derivationPath,
|
|
192
|
+
message: (0, sdk_ts_1.toUtf8)(data),
|
|
193
|
+
});
|
|
194
|
+
if (!response.success) {
|
|
195
|
+
throw new Error((response.payload && response.payload.error) || 'Unknown error');
|
|
196
|
+
}
|
|
197
|
+
return response.payload.signature;
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
throw new exceptions_1.TrezorException(new Error(e.message), {
|
|
201
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
202
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
203
|
+
contextModule: wallet_base_1.WalletAction.SignTransaction,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
getEthereumChainId() {
|
|
209
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
210
|
+
const alchemy = yield this.getAlchemy();
|
|
211
|
+
const alchemyProvider = yield alchemy.config.getProvider();
|
|
212
|
+
return alchemyProvider.network.chainId.toString();
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
getEthereumTransactionReceipt(txHash) {
|
|
216
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
return Promise.resolve(txHash);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// eslint-disable-next-line class-methods-use-this
|
|
221
|
+
getPubKey() {
|
|
222
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
223
|
+
throw new exceptions_1.WalletException(new Error('You can only fetch PubKey from Cosmos native wallets'));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
signEthereumTransaction(txData, options) {
|
|
227
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
228
|
+
const chainId = parseInt(options.ethereumChainId.toString(), 10);
|
|
229
|
+
const alchemy = yield this.getAlchemy();
|
|
230
|
+
const nonce = yield alchemy.core.getTransactionCount(options.address);
|
|
231
|
+
const common = new common_1.Common({
|
|
232
|
+
chain: getNetworkFromChainId(chainId),
|
|
233
|
+
hardfork: common_1.Hardfork.London,
|
|
234
|
+
});
|
|
235
|
+
const eip1559TxData = {
|
|
236
|
+
from: txData.from,
|
|
237
|
+
data: txData.data,
|
|
238
|
+
to: txData.to,
|
|
239
|
+
nonce: (0, ethereumjs_util_1.addHexPrefix)(nonce.toString(16)),
|
|
240
|
+
gas: (0, ethereumjs_util_1.addHexPrefix)(txData.gas),
|
|
241
|
+
gasLimit: (0, ethereumjs_util_1.addHexPrefix)(txData.gas),
|
|
242
|
+
maxFeePerGas: (0, ethereumjs_util_1.addHexPrefix)(txData.gasPrice || txData.maxFeePerGas),
|
|
243
|
+
maxPriorityFeePerGas: (0, ethereumjs_util_1.addHexPrefix)(txData.maxPriorityFeePerGas || wallet_base_1.TIP_IN_GWEI.toString(16)),
|
|
244
|
+
};
|
|
245
|
+
const tx = tx_1.FeeMarketEIP1559Transaction.fromTxData(eip1559TxData, {
|
|
246
|
+
common,
|
|
247
|
+
});
|
|
248
|
+
const transaction = Object.assign(Object.assign({}, tx.toJSON()), { chainId });
|
|
249
|
+
try {
|
|
250
|
+
yield this.trezor.connect();
|
|
251
|
+
const { derivationPath } = yield this.getWalletForAddress(options.address);
|
|
252
|
+
const response = yield connect_web_1.default.ethereumSignTransaction({
|
|
253
|
+
path: derivationPath,
|
|
254
|
+
transaction,
|
|
255
|
+
});
|
|
256
|
+
if (!response.success) {
|
|
257
|
+
throw new exceptions_1.TrezorException(new Error((response.payload && response.payload.error) ||
|
|
258
|
+
'Something happened while signing with Trezor'), {
|
|
259
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
260
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
261
|
+
contextModule: wallet_base_1.WalletAction.SignEthereumTransaction,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const signedTxData = Object.assign(Object.assign({}, eip1559TxData), { v: `${response.payload.v}`, r: `${response.payload.r}`, s: `${response.payload.s}` });
|
|
265
|
+
return tx_1.FeeMarketEIP1559Transaction.fromTxData(signedTxData, {
|
|
266
|
+
common,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
if (e instanceof exceptions_1.TrezorException) {
|
|
271
|
+
throw e;
|
|
272
|
+
}
|
|
273
|
+
throw new exceptions_1.TrezorException(new Error(e.message), {
|
|
274
|
+
code: exceptions_1.UnspecifiedErrorCode,
|
|
275
|
+
type: exceptions_1.ErrorType.WalletError,
|
|
276
|
+
contextModule: wallet_base_1.WalletAction.SignEthereumTransaction,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
getWalletForAddress(address) {
|
|
282
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
283
|
+
const accountManager = yield this.trezor.getAccountManager();
|
|
284
|
+
if (!accountManager.hasWalletForAddress(address)) {
|
|
285
|
+
for (let i = 0; i < wallet_base_1.DEFAULT_ADDRESS_SEARCH_LIMIT / wallet_base_1.DEFAULT_NUM_ADDRESSES_TO_FETCH; i += 1) {
|
|
286
|
+
yield accountManager.getWallets();
|
|
287
|
+
if (accountManager.hasWalletForAddress(address)) {
|
|
288
|
+
return (yield accountManager.getWalletForAddress(address));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return (yield accountManager.getWalletForAddress(address));
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
getAlchemy() {
|
|
296
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
if (this.alchemy) {
|
|
298
|
+
return this.alchemy;
|
|
299
|
+
}
|
|
300
|
+
const { rpcUrl, ethereumChainId } = this.ethereumOptions;
|
|
301
|
+
if (!rpcUrl) {
|
|
302
|
+
throw new exceptions_1.GeneralException(new Error('Please pass rpcUrl within the ethereumOptions'));
|
|
303
|
+
}
|
|
304
|
+
this.alchemy = new alchemy_sdk_1.Alchemy({
|
|
305
|
+
apiKey: (0, wallet_base_1.getKeyFromRpcUrl)(rpcUrl),
|
|
306
|
+
network: ethereumChainId === ts_types_1.EthereumChainId.Mainnet
|
|
307
|
+
? alchemy_sdk_1.Network.ETH_MAINNET
|
|
308
|
+
: alchemy_sdk_1.Network.ETH_SEPOLIA,
|
|
309
|
+
});
|
|
310
|
+
return this.alchemy;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.TrezorWallet = TrezorWallet;
|
|
315
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/strategy/strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8BAA8B;AAC9B,2CAA2C;AAC3C,sDAAyE;AACzE,6CAAgE;AAChE,qDAA8C;AAC9C,uCAA4D;AAC5D,+CAA4D;AAC5D,sEAA+C;AAC/C,0DAOkC;AAClC,kDAO8B;AAC9B,4DAamC;AACnC,8CAA2B;AAC3B,oCAA6C;AAe7C,MAAM,qBAAqB,GAAG,CAAC,OAAwB,EAAS,EAAE;IAChE,IAAI,OAAO,KAAK,0BAAe,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,cAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IAED,IAAI,OAAO,KAAK,0BAAe,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO,cAAK,CAAC,OAAO,CAAA;IACtB,CAAC;IAED,IAAI,OAAO,KAAK,0BAAe,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,cAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IAED,OAAO,cAAK,CAAC,OAAO,CAAA;AACtB,CAAC,CAAA;AAED,MAAa,YACX,SAAQ,kCAAoB;IAS5B,YAAY,IAAwC;QAClD,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,MAAM,GAAG,IAAI,YAAQ,EAAE,CAAA;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAA;IAC7C,CAAC;IAEK,mBAAmB;;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,8BAAgB,CAAC,QAAQ,CAAC,CAAA;QACnD,CAAC;KAAA;IAEK,MAAM;;YACV,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;KAAA;IAEY,UAAU;;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAQ,EAAE,CAAA;QAC9B,CAAC;KAAA;IAEY,YAAY;;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAA;gBAC5D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,CAAA;gBAEjD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;YACtC,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,4BAAe,CAAC,IAAI,KAAK,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE;oBACvD,IAAI,EAAE,iCAAoB;oBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;oBAC3B,aAAa,EAAE,0BAAY,CAAC,WAAW;iBACxC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;IAEK,mBAAmB,CAAC,OAAuB;;YAC/C,OAAO,OAAO,CAAC,OAAO,CACpB,KAAK,MAAM,CAAC,IAAI,CACd,oBAAoB,OAAO,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CACrD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CACpB,CAAA;QACH,CAAC;KAAA;IAEK,uBAAuB,CAC3B,MAAW,EACX,OAA8D;;YAE9D,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAC1D,MAAM,EACN,OAAO,CACR,CAAA;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;gBACvC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAClD,IAAA,8BAAY,EAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC5D,CAAA;gBAED,OAAO,SAAS,CAAC,IAAI,CAAA;YACvB,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,4BAAe,CAAC,IAAI,KAAK,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE;oBACvD,IAAI,EAAE,iCAAoB;oBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;oBAC3B,aAAa,EAAE,0BAAY,CAAC,uBAAuB;iBACpD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;IAEK,eAAe,CACnB,WAAkB,EAClB,OAA+B;;YAE/B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;YAExC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CACP,sFAAsF,CACvF,CACF,CAAA;YACH,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;YAElE,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,iCAAoB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACzD,IAAI,EAAE,iCAAoB;oBAC1B,WAAW,EAAE,QAAQ,CAAC,IAAI;oBAC1B,aAAa,EAAE,QAAQ,CAAC,SAAS;iBAClC,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,QAAQ,CAAA;QACjB,CAAC;KAAA;IAEK,mBAAmB,CACvB,UAAkB,EAClB,OAAuB;;YAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACrC,MAAM,gBAAgB,mCACjB,MAAM,KACT,MAAM,kCACD,MAAM,CAAC,MAAM,KAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAC9B,IAAI,EAAE,GAAG,MAEZ,CAAA;YACD,MAAM,cAAc,GAAG,IAAA,0BAAkB,EAAC,gBAAgB,CAAC,CAAA;YAC3D,MACE,KAME,cAAc,MANgC,EAAhD,qBAA8C,EAAE,KAAA,EAAhD,EAAS,YAAY,GAAG,EAAE,OAAsB,EAAjB,UAAU,cAAlC,gBAAoC,CAAF,EADrC,EAEJ,OAAO,GAAG,EAAE,EACZ,MAAM,GAAG,EAAE,EACX,WAAW,EACX,qBAAqB,EACrB,YAAY,KACV,cAAc,CAAA;YAElB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAClE,MAAM,QAAQ,GAAG,MAAM,qBAAa,CAAC,qBAAqB,CAAC;oBACzD,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE;wBACJ,KAAK,kBAAI,YAAY,IAAK,UAAU,CAAE;wBACtC,OAAO;wBACP,MAAM;wBACN,WAAW;qBACZ;oBACD,YAAY;oBACZ,qBAAqB;oBACrB,kBAAkB,EAAE,IAAI;iBACzB,CAAC,CAAA;gBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,wCAAwC;oBACxC,MAAM,IAAI,KAAK,CACb,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,CAChE,CAAA;gBACH,CAAC;gBAED,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAA;YACnC,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,4BAAe,CAAC,IAAI,KAAK,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE;oBACvD,IAAI,EAAE,iCAAoB;oBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;oBAC3B,aAAa,EAAE,0BAAY,CAAC,eAAe;iBAC5C,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;IAEK,0BAA0B,CAAC,YAGhC;;YACC,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CAAC,0DAA0D,CAAC,EACrE;gBACE,IAAI,EAAE,iCAAoB;gBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;gBAC3B,aAAa,EAAE,0BAAY,CAAC,eAAe;aAC5C,CACF,CAAA;QACH,CAAC;KAAA;IAED,kDAAkD;IAC5C,qBAAqB,CAAC,YAK3B;;YACC,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CAAC,0DAA0D,CAAC,EACrE;gBACE,IAAI,EAAE,iCAAoB;gBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;gBAC3B,aAAa,EAAE,0BAAY,CAAC,eAAe;aAC5C,CACF,CAAA;QACH,CAAC;KAAA;IAEK,aAAa,CACjB,MAAsB,EACtB,IAAyB;;YAEzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;gBAEjE,MAAM,QAAQ,GAAG,MAAM,qBAAa,CAAC,mBAAmB,CAAC;oBACvD,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,IAAA,eAAM,EAAC,IAAI,CAAC;iBACtB,CAAC,CAAA;gBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,CAChE,CAAA;gBACH,CAAC;gBAED,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAA;YACnC,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,4BAAe,CAAC,IAAI,KAAK,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE;oBACvD,IAAI,EAAE,iCAAoB;oBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;oBAC3B,aAAa,EAAE,0BAAY,CAAC,eAAe;iBAC5C,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;IAEK,kBAAkB;;YACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;YACvC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YAE1D,OAAO,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACnD,CAAC;KAAA;IAEK,6BAA6B,CAAC,MAAc;;YAChD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;KAAA;IAED,kDAAkD;IAC5C,SAAS;;YACb,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAClE,CAAA;QACH,CAAC;KAAA;IAEa,uBAAuB,CACnC,MAAW,EACX,OAA8D;;YAE9D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;YAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;YACvC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAErE,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC;gBACxB,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC;gBACrC,QAAQ,EAAE,iBAAQ,CAAC,MAAM;aAC1B,CAAC,CAAA;YAEF,MAAM,aAAa,GAAG;gBACpB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,KAAK,EAAE,IAAA,8BAAY,EAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACvC,GAAG,EAAE,IAAA,8BAAY,EAAC,MAAM,CAAC,GAAG,CAAC;gBAC7B,QAAQ,EAAE,IAAA,8BAAY,EAAC,MAAM,CAAC,GAAG,CAAC;gBAClC,YAAY,EAAE,IAAA,8BAAY,EAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC;gBAClE,oBAAoB,EAAE,IAAA,8BAAY,EAChC,MAAM,CAAC,oBAAoB,IAAI,yBAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CACxD;aACF,CAAA;YACD,MAAM,EAAE,GAAG,gCAA2B,CAAC,UAAU,CAAC,aAAa,EAAE;gBAC/D,MAAM;aACP,CAAC,CAAA;YAEF,MAAM,WAAW,GAAG,gCACf,EAAE,CAAC,MAAM,EAAE,KACd,OAAO,GACsB,CAAA;YAE/B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBAC1E,MAAM,QAAQ,GAAG,MAAM,qBAAa,CAAC,uBAAuB,CAAC;oBAC3D,IAAI,EAAE,cAAc;oBACpB,WAAW;iBACZ,CAAC,CAAA;gBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CACP,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC1C,8CAA8C,CACjD,EACD;wBACE,IAAI,EAAE,iCAAoB;wBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;wBAC3B,aAAa,EAAE,0BAAY,CAAC,uBAAuB;qBACpD,CACF,CAAA;gBACH,CAAC;gBAED,MAAM,YAAY,mCACb,aAAa,KAChB,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAC1B,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAC1B,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAC3B,CAAA;gBAED,OAAO,gCAA2B,CAAC,UAAU,CAAC,YAAY,EAAE;oBAC1D,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,4BAAe,EAAE,CAAC;oBACjC,MAAM,CAAC,CAAA;gBACT,CAAC;gBAED,MAAM,IAAI,4BAAe,CAAC,IAAI,KAAK,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE;oBACvD,IAAI,EAAE,iCAAoB;oBAC1B,IAAI,EAAE,sBAAS,CAAC,WAAW;oBAC3B,aAAa,EAAE,0BAAY,CAAC,uBAAuB;iBACpD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;IAEa,mBAAmB,CAC/B,OAAe;;YAEf,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAA;YAE5D,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,KACE,IAAI,CAAC,GAAG,CAAC,EACT,CAAC,GAAG,0CAA4B,GAAG,4CAA8B,EACjE,CAAC,IAAI,CAAC,EACN,CAAC;oBACD,MAAM,cAAc,CAAC,UAAU,EAAE,CAAA;oBAEjC,IAAI,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChD,OAAO,CAAC,MAAM,cAAc,CAAC,mBAAmB,CAC9C,OAAO,CACR,CAAqB,CAAA;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,MAAM,cAAc,CAAC,mBAAmB,CAC9C,OAAO,CACR,CAAqB,CAAA;QACxB,CAAC;KAAA;IAEa,UAAU;;YACtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,OAAO,CAAA;YACrB,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;YAExD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,6BAAgB,CACxB,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAC3D,CAAA;YACH,CAAC;YAED,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAO,CAAC;gBACzB,MAAM,EAAE,IAAA,8BAAgB,EAAC,MAAM,CAAC;gBAChC,OAAO,EACL,eAAe,KAAK,0BAAe,CAAC,OAAO;oBACzC,CAAC,CAAC,qBAAc,CAAC,WAAW;oBAC5B,CAAC,CAAC,qBAAc,CAAC,WAAW;aACjC,CAAC,CAAA;YAEF,OAAO,IAAI,CAAC,OAAO,CAAA;QACrB,CAAC;KAAA;CACF;AA/WD,oCA+WC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,OAAO,CAAA;AAG/B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TypedMessage, MessageTypes } from '@metamask/eth-sig-util';
|
|
2
|
+
/**
|
|
3
|
+
* Calculates the domain_separator_hash and message_hash from an EIP-712 Typed Data object.
|
|
4
|
+
*
|
|
5
|
+
* The Trezor Model 1 does not currently support constructing the hash on the device,
|
|
6
|
+
* so this function pre-computes them.
|
|
7
|
+
*
|
|
8
|
+
* @template {TypedMessage} T
|
|
9
|
+
* @param {T} data - The EIP-712 Typed Data object.
|
|
10
|
+
* @param {boolean} metamask_v4_compat - Set to `true` for compatibility with Metamask's signTypedData_v4 function.
|
|
11
|
+
* @returns {{domain_separator_hash: string, message_hash?: string} & T} The hashes.
|
|
12
|
+
*/
|
|
13
|
+
export declare const transformTypedData: <T extends TypedMessage<MessageTypes>>(data: T, metamask_v4_compat?: boolean) => {
|
|
14
|
+
domain_separator_hash: string;
|
|
15
|
+
message_hash?: string;
|
|
16
|
+
} & T;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,YAAY,EAGb,MAAM,wBAAwB,CAAA;AAyB/B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,+CACvB,CAAC,uBACa,OAAO,KAC1B;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,CAmC7D,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformTypedData = void 0;
|
|
4
|
+
const exceptions_1 = require("@injectivelabs/exceptions");
|
|
5
|
+
const eth_sig_util_1 = require("@metamask/eth-sig-util");
|
|
6
|
+
// Sanitization is used for T1 as eth-sig-util does not support BigInt
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
function sanitizeData(data) {
|
|
9
|
+
switch (Object.prototype.toString.call(data)) {
|
|
10
|
+
case '[object Object]': {
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
const entries = Object.keys(data).map((k) => [k, sanitizeData(data[k])]);
|
|
13
|
+
return Object.fromEntries(entries);
|
|
14
|
+
}
|
|
15
|
+
case '[object Array]':
|
|
16
|
+
return data.map((v) => sanitizeData(v));
|
|
17
|
+
case '[object BigInt]':
|
|
18
|
+
return data.toString();
|
|
19
|
+
default:
|
|
20
|
+
return data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculates the domain_separator_hash and message_hash from an EIP-712 Typed Data object.
|
|
25
|
+
*
|
|
26
|
+
* The Trezor Model 1 does not currently support constructing the hash on the device,
|
|
27
|
+
* so this function pre-computes them.
|
|
28
|
+
*
|
|
29
|
+
* @template {TypedMessage} T
|
|
30
|
+
* @param {T} data - The EIP-712 Typed Data object.
|
|
31
|
+
* @param {boolean} metamask_v4_compat - Set to `true` for compatibility with Metamask's signTypedData_v4 function.
|
|
32
|
+
* @returns {{domain_separator_hash: string, message_hash?: string} & T} The hashes.
|
|
33
|
+
*/
|
|
34
|
+
const transformTypedData = (data, metamask_v4_compat = true) => {
|
|
35
|
+
if (!metamask_v4_compat) {
|
|
36
|
+
throw new exceptions_1.TrezorException(new Error('Trezor: Only version 4 of typed data signing is supported'));
|
|
37
|
+
}
|
|
38
|
+
const version = eth_sig_util_1.SignTypedDataVersion.V4;
|
|
39
|
+
const { types, primaryType, domain, message } = eth_sig_util_1.TypedDataUtils.sanitizeData(data);
|
|
40
|
+
const domainSeparatorHash = eth_sig_util_1.TypedDataUtils.hashStruct('EIP712Domain', sanitizeData(domain), types, version).toString('hex');
|
|
41
|
+
let messageHash = null;
|
|
42
|
+
if (primaryType !== 'EIP712Domain') {
|
|
43
|
+
messageHash = eth_sig_util_1.TypedDataUtils.hashStruct(primaryType, sanitizeData(message), types, version).toString('hex');
|
|
44
|
+
}
|
|
45
|
+
return Object.assign({ domain_separator_hash: domainSeparatorHash, message_hash: messageHash }, data);
|
|
46
|
+
};
|
|
47
|
+
exports.transformTypedData = transformTypedData;
|
|
48
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,0DAA2D;AAC3D,yDAK+B;AAE/B,sEAAsE;AACtE,aAAa;AACb,SAAS,YAAY,CAAC,IAAI;IACxB,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,aAAa;YACb,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;QAED,KAAK,gBAAgB;YACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;QAE9C,KAAK,iBAAiB;YACpB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QAExB;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAID;;;;;;;;;;GAUG;AACI,MAAM,kBAAkB,GAAG,CAChC,IAAO,EACP,qBAA8B,IAAI,EAC4B,EAAE;IAChE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,IAAI,4BAAe,CACvB,IAAI,KAAK,CAAC,2DAA2D,CAAC,CACvE,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,mCAAoB,CAAC,EAAE,CAAA;IAEvC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAC3C,6BAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAEnC,MAAM,mBAAmB,GAAG,6BAAc,CAAC,UAAU,CACnD,cAAc,EACd,YAAY,CAAC,MAAM,CAAC,EACpB,KAAK,EACL,OAAO,CACR,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjB,IAAI,WAAW,GAAG,IAAI,CAAA;IAEtB,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;QACnC,WAAW,GAAG,6BAAc,CAAC,UAAU,CACrC,WAAqB,EACrB,YAAY,CAAC,OAAO,CAAC,EACrB,KAAK,EACL,OAAO,CACR,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,uBACE,qBAAqB,EAAE,mBAAmB,EAC1C,YAAY,EAAE,WAAqB,IAChC,IAAI,EACR;AACH,CAAC,CAAA;AAtCY,QAAA,kBAAkB,sBAsC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1E,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1E,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AccountAddress } from '@injectivelabs/ts-types';
|
|
2
|
+
import HDNode from 'hdkey';
|
|
3
|
+
import { TrezorWalletInfo } from '../../types';
|
|
4
|
+
export default class AccountManager {
|
|
5
|
+
private wallets;
|
|
6
|
+
private hdKey;
|
|
7
|
+
constructor(hdKey: HDNode);
|
|
8
|
+
getWallets(): Promise<TrezorWalletInfo[]>;
|
|
9
|
+
private getWalletsBasedOnIndex;
|
|
10
|
+
private hasWallets;
|
|
11
|
+
private hasWalletsInOffset;
|
|
12
|
+
private getOffset;
|
|
13
|
+
hasWalletForAddress(address: AccountAddress): boolean;
|
|
14
|
+
getWalletForAddress(address: AccountAddress): Promise<TrezorWalletInfo | undefined>;
|
|
15
|
+
reset(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=AccountManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountManager.d.ts","sourceRoot":"","sources":["../../../../src/strategy/hw/AccountManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,MAAM,MAAM,OAAO,CAAA;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAkB9C,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO,CAAC,KAAK,CAAQ;gBAET,KAAK,EAAE,MAAM;IAKnB,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAiBjC,sBAAsB;IAoBpC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,SAAS;IAWjB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAQ/C,mBAAmB,CACvB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAMxC,KAAK;CAGN"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { addHexPrefix, publicToAddress } from 'ethereumjs-util';
|
|
2
|
+
import { DEFAULT_NUM_ADDRESSES_TO_FETCH, DEFAULT_BASE_DERIVATION_PATH, } from '@injectivelabs/wallet-base';
|
|
3
|
+
const addressOfHDKey = (hdKey) => {
|
|
4
|
+
const shouldSanitizePublicKey = true;
|
|
5
|
+
const derivedPublicKey = hdKey.publicKey;
|
|
6
|
+
const ethereumAddressWithoutPrefix = publicToAddress(derivedPublicKey, shouldSanitizePublicKey).toString('hex');
|
|
7
|
+
const address = addHexPrefix(ethereumAddressWithoutPrefix);
|
|
8
|
+
return address;
|
|
9
|
+
};
|
|
10
|
+
export default class AccountManager {
|
|
11
|
+
wallets = [];
|
|
12
|
+
hdKey;
|
|
13
|
+
constructor(hdKey) {
|
|
14
|
+
this.wallets = [];
|
|
15
|
+
this.hdKey = hdKey;
|
|
16
|
+
}
|
|
17
|
+
async getWallets() {
|
|
18
|
+
const { start, end } = this.getOffset();
|
|
19
|
+
/**
|
|
20
|
+
* 1. Wallets are not yet fetched at all,
|
|
21
|
+
* 2. Wallets are not yet fetched for that offset
|
|
22
|
+
*/
|
|
23
|
+
if (!this.hasWallets() || !this.hasWalletsInOffset(start)) {
|
|
24
|
+
await this.getWalletsBasedOnIndex({
|
|
25
|
+
start,
|
|
26
|
+
end,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return this.wallets.slice(start, end);
|
|
30
|
+
}
|
|
31
|
+
async getWalletsBasedOnIndex({ start, end, }) {
|
|
32
|
+
for (let index = start; index < end; index += 1) {
|
|
33
|
+
const path = `m/${index}`;
|
|
34
|
+
const hdKey = this.hdKey.derive(path);
|
|
35
|
+
const address = addressOfHDKey(hdKey);
|
|
36
|
+
this.wallets.push({
|
|
37
|
+
hdKey,
|
|
38
|
+
address: address.toLowerCase(),
|
|
39
|
+
derivationPath: `${DEFAULT_BASE_DERIVATION_PATH}/0'/0/${index}`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
hasWallets() {
|
|
44
|
+
return this.wallets.length > 0;
|
|
45
|
+
}
|
|
46
|
+
hasWalletsInOffset(offset) {
|
|
47
|
+
return this.wallets.length > offset;
|
|
48
|
+
}
|
|
49
|
+
getOffset() {
|
|
50
|
+
const totalWallets = this.wallets.length;
|
|
51
|
+
const nextBatchStart = totalWallets;
|
|
52
|
+
const nextBatchEnd = totalWallets + DEFAULT_NUM_ADDRESSES_TO_FETCH;
|
|
53
|
+
return {
|
|
54
|
+
start: nextBatchStart,
|
|
55
|
+
end: nextBatchEnd,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
hasWalletForAddress(address) {
|
|
59
|
+
return (this.wallets.find((wallet) => wallet.address.toLowerCase() === address.toLowerCase()) !== undefined);
|
|
60
|
+
}
|
|
61
|
+
async getWalletForAddress(address) {
|
|
62
|
+
return this.wallets.find((wallet) => wallet.address.toLowerCase() === address.toLowerCase());
|
|
63
|
+
}
|
|
64
|
+
reset() {
|
|
65
|
+
this.wallets = [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=AccountManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountManager.js","sourceRoot":"","sources":["../../../../src/strategy/hw/AccountManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import AccountManager from './AccountManager';
|
|
2
|
+
export default class TrezorTransport {
|
|
3
|
+
private accountManager;
|
|
4
|
+
private hdKey;
|
|
5
|
+
constructor();
|
|
6
|
+
connect(): Promise<void>;
|
|
7
|
+
getAccountManager(): Promise<AccountManager>;
|
|
8
|
+
private isUnlocked;
|
|
9
|
+
private init;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strategy/hw/index.ts"],"names":[],"mappings":"AAGA,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAU7C,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,OAAO,CAAC,cAAc,CAA8B;IAEpD,OAAO,CAAC,KAAK,CAAuB;;IAM9B,OAAO;IAIP,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAQlD,OAAO,CAAC,UAAU;YAIJ,IAAI;CAmCnB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import TrezorConnect from '@trezor/connect-web';
|
|
2
|
+
import HDNode from 'hdkey';
|
|
3
|
+
import { DEFAULT_BASE_DERIVATION_PATH } from '@injectivelabs/wallet-base';
|
|
4
|
+
import AccountManager from './AccountManager';
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
const trezorConnect = TrezorConnect.default || TrezorConnect;
|
|
7
|
+
const TREZOR_CONNECT_MANIFEST = {
|
|
8
|
+
email: 'contact@injectivelabs.org',
|
|
9
|
+
appUrl: 'https://injectivelabs.org',
|
|
10
|
+
};
|
|
11
|
+
export default class TrezorTransport {
|
|
12
|
+
accountManager = null;
|
|
13
|
+
hdKey = new HDNode();
|
|
14
|
+
constructor() {
|
|
15
|
+
trezorConnect.init({ lazyLoad: true, manifest: TREZOR_CONNECT_MANIFEST });
|
|
16
|
+
}
|
|
17
|
+
async connect() {
|
|
18
|
+
await this.init();
|
|
19
|
+
}
|
|
20
|
+
async getAccountManager() {
|
|
21
|
+
if (!this.accountManager) {
|
|
22
|
+
this.accountManager = new AccountManager(this.hdKey);
|
|
23
|
+
}
|
|
24
|
+
return this.accountManager;
|
|
25
|
+
}
|
|
26
|
+
isUnlocked() {
|
|
27
|
+
return Boolean(this.hdKey && this.hdKey.publicKey);
|
|
28
|
+
}
|
|
29
|
+
async init() {
|
|
30
|
+
if (this.isUnlocked()) {
|
|
31
|
+
return Promise.resolve();
|
|
32
|
+
}
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
TrezorConnect.getPublicKey({
|
|
35
|
+
path: `${DEFAULT_BASE_DERIVATION_PATH}/0'/0`,
|
|
36
|
+
coin: 'ETH',
|
|
37
|
+
})
|
|
38
|
+
.then((response) => {
|
|
39
|
+
if (!response.success) {
|
|
40
|
+
return reject(new Error((response.payload && response.payload.error) ||
|
|
41
|
+
'Please make sure your Trezor is connected and unlocked'));
|
|
42
|
+
}
|
|
43
|
+
this.hdKey.publicKey = Buffer.from(response.payload.publicKey, 'hex');
|
|
44
|
+
this.hdKey.chainCode = Buffer.from(response.payload.chainCode, 'hex');
|
|
45
|
+
return resolve(TrezorConnect);
|
|
46
|
+
})
|
|
47
|
+
.catch((e) => {
|
|
48
|
+
reject(new Error((e && e.toString()) ||
|
|
49
|
+
'Please make sure your Trezor is connected and unlocked'));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/strategy/hw/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAC/C,OAAO,MAAM,MAAM,OAAO,CAAA;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAE7C,aAAa;AACb,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,IAAI,aAAa,CAAA;AAE5D,MAAM,uBAAuB,GAAG;IAC9B,KAAK,EAAE,2BAA2B;IAClC,MAAM,EAAE,2BAA2B;CACpC,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,eAAe;IAC1B,cAAc,GAA0B,IAAI,CAAA;IAE5C,KAAK,GAAW,IAAI,MAAM,EAAE,CAAA;IAEpC;QACE,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtD,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAEO,UAAU;QAChB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,aAAa,CAAC,YAAY,CAAC;gBACzB,IAAI,EAAE,GAAG,4BAA4B,OAAO;gBAC5C,IAAI,EAAE,KAAK;aACZ,CAAC;iBACC,IAAI,CAAC,CAAC,QAAa,EAAE,EAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,OAAO,MAAM,CACX,IAAI,KAAK,CACP,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC1C,wDAAwD,CAC3D,CACF,CAAA;gBACH,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;gBACrE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;gBAErE,OAAO,OAAO,CAAC,aAAa,CAAC,CAAA;YAC/B,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;gBAChB,MAAM,CACJ,IAAI,KAAK,CACP,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACjB,wDAAwD,CAC3D,CACF,CAAA;YACH,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
|