@sidhujag/sysweb3-keyring 2.1.7 → 2.1.9
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/CHANGELOG.md +12 -0
- package/cjs/hardware-transaction-authority.js +15 -11
- package/cjs/hardware-transaction-authority.js.map +1 -1
- package/cjs/hardware-wallet-manager.js +74 -119
- package/cjs/hardware-wallet-manager.js.map +1 -1
- package/cjs/hardware-wallet-types.js +16 -0
- package/cjs/hardware-wallet-types.js.map +1 -0
- package/cjs/host-keyring.js +32 -0
- package/cjs/host-keyring.js.map +1 -0
- package/cjs/index.js +1 -0
- package/cjs/index.js.map +1 -1
- package/cjs/keyring-core.js +96 -61
- package/cjs/keyring-core.js.map +1 -1
- package/cjs/keyring-manager.js +15 -16
- package/cjs/keyring-manager.js.map +1 -1
- package/cjs/ledger/host-types.js.map +1 -1
- package/cjs/ledger/index.js +24 -4
- package/cjs/ledger/index.js.map +1 -1
- package/cjs/ledger-hardware.js +15 -0
- package/cjs/ledger-hardware.js.map +1 -0
- package/cjs/software.js +6 -25
- package/cjs/software.js.map +1 -1
- package/cjs/transactions/ethereum.js +371 -494
- package/cjs/transactions/ethereum.js.map +1 -1
- package/cjs/transactions/evm-submission-failure.js +73 -0
- package/cjs/transactions/evm-submission-failure.js.map +1 -0
- package/cjs/transactions/evm-submission.js +35 -61
- package/cjs/transactions/evm-submission.js.map +1 -1
- package/cjs/transactions/ledger-signing.js +52 -0
- package/cjs/transactions/ledger-signing.js.map +1 -0
- package/cjs/transactions/prepared-evm.js +24 -1
- package/cjs/transactions/prepared-evm.js.map +1 -1
- package/cjs/transactions/trezor-signing.js +90 -0
- package/cjs/transactions/trezor-signing.js.map +1 -0
- package/cjs/trezor/connect.js +238 -243
- package/cjs/trezor/connect.js.map +1 -1
- package/cjs/trezor/host-types.js +19 -0
- package/cjs/trezor/host-types.js.map +1 -0
- package/cjs/trezor/index.js +75 -23
- package/cjs/trezor/index.js.map +1 -1
- package/cjs/trezor/webextension-host.js +118 -0
- package/cjs/trezor/webextension-host.js.map +1 -0
- package/cjs/trezor-hardware.js +16 -0
- package/cjs/trezor-hardware.js.map +1 -0
- package/cjs/types.js.map +1 -1
- package/esm/hardware-transaction-authority.js +14 -11
- package/esm/hardware-transaction-authority.js.map +1 -1
- package/esm/hardware-wallet-manager.js +20 -32
- package/esm/hardware-wallet-manager.js.map +1 -1
- package/esm/hardware-wallet-types.js +13 -0
- package/esm/hardware-wallet-types.js.map +1 -0
- package/esm/keyring-core.js +98 -63
- package/esm/keyring-core.js.map +1 -1
- package/esm/ledger/dmk-host.js +2 -0
- package/esm/ledger/dmk-host.js.map +1 -1
- package/esm/ledger/dmk-session.js +73 -8
- package/esm/ledger/dmk-session.js.map +1 -1
- package/esm/ledger/host-types.js.map +1 -1
- package/esm/ledger/index.js +22 -2
- package/esm/ledger/index.js.map +1 -1
- package/esm/transactions/ethereum.js +372 -495
- package/esm/transactions/ethereum.js.map +1 -1
- package/esm/transactions/evm-submission-failure.js +68 -0
- package/esm/transactions/evm-submission-failure.js.map +1 -0
- package/esm/transactions/evm-submission.js +32 -59
- package/esm/transactions/evm-submission.js.map +1 -1
- package/esm/transactions/ledger-signing.js +49 -0
- package/esm/transactions/ledger-signing.js.map +1 -0
- package/esm/transactions/prepared-evm.js +23 -1
- package/esm/transactions/prepared-evm.js.map +1 -1
- package/esm/transactions/trezor-signing.js +87 -0
- package/esm/transactions/trezor-signing.js.map +1 -0
- package/esm/trezor/connect.js +236 -209
- package/esm/trezor/connect.js.map +1 -1
- package/esm/trezor/host-types.js +16 -0
- package/esm/trezor/host-types.js.map +1 -0
- package/esm/trezor/index.js +74 -22
- package/esm/trezor/index.js.map +1 -1
- package/esm/types.js.map +1 -1
- package/package.json +61 -1
- package/types/hardware-transaction-authority.d.ts +1 -0
- package/types/hardware-wallet-manager.d.ts +6 -22
- package/types/hardware-wallet-types.d.ts +21 -0
- package/types/host-keyring.d.ts +16 -0
- package/types/index.d.ts +1 -0
- package/types/keyring-core.d.ts +12 -4
- package/types/keyring-manager.d.ts +5 -3
- package/types/ledger/dmk-host.d.ts +2 -0
- package/types/ledger/dmk-session.d.ts +9 -0
- package/types/ledger/host-types.d.ts +2 -0
- package/types/ledger/index.d.ts +3 -1
- package/types/ledger-hardware.d.ts +5 -0
- package/types/software.d.ts +2 -16
- package/types/transactions/ethereum.d.ts +11 -1
- package/types/transactions/evm-submission-failure.d.ts +11 -0
- package/types/transactions/evm-submission.d.ts +6 -8
- package/types/transactions/ledger-signing.d.ts +13 -0
- package/types/transactions/prepared-evm.d.ts +12 -0
- package/types/transactions/trezor-signing.d.ts +13 -0
- package/types/trezor/connect.d.ts +11 -9
- package/types/trezor/host-types.d.ts +25 -0
- package/types/trezor/index.d.ts +7 -7
- package/types/trezor/webextension-host.d.ts +7 -0
- package/types/trezor-hardware.d.ts +6 -0
- package/types/types.d.ts +16 -4
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Transaction } from 'ethers/transaction';
|
|
2
|
+
import { readEvmOwnData } from './evm-envelope';
|
|
3
|
+
import { annotateEvmSubmissionFailure } from './evm-submission-failure';
|
|
4
|
+
export { copyEvmSubmissionFailure, evmSubmissionFailure, } from './evm-submission-failure';
|
|
2
5
|
const capturedBoundaries = new WeakSet();
|
|
3
6
|
function assertSynchronous(check) {
|
|
4
7
|
const result = check();
|
|
@@ -13,6 +16,19 @@ function assertSynchronous(check) {
|
|
|
13
16
|
/** Capture once, before RPC or device work. Never reread host capabilities later. */
|
|
14
17
|
export function captureEvmSubmission(input, assertCurrent, capture) {
|
|
15
18
|
const { origin, walletNonce } = input;
|
|
19
|
+
const inputReview = input.review;
|
|
20
|
+
const review = inputReview === undefined
|
|
21
|
+
? undefined
|
|
22
|
+
: readEvmOwnData(inputReview, ['id', 'unsignedHash']);
|
|
23
|
+
if (review !== undefined &&
|
|
24
|
+
(input.operation !== 'send' ||
|
|
25
|
+
!walletNonce ||
|
|
26
|
+
!review ||
|
|
27
|
+
typeof review.id !== 'string' ||
|
|
28
|
+
!/^[A-Za-z0-9_-]{1,128}$/.test(review.id) ||
|
|
29
|
+
typeof review.unsignedHash !== 'string' ||
|
|
30
|
+
!/^0x[0-9a-f]{64}$/.test(review.unsignedHash)))
|
|
31
|
+
throw new TypeError('Invalid EVM fee review identity');
|
|
16
32
|
let approvedWalletNonce;
|
|
17
33
|
if (walletNonce !== undefined) {
|
|
18
34
|
if (!walletNonce ||
|
|
@@ -30,6 +46,14 @@ export function captureEvmSubmission(input, assertCurrent, capture) {
|
|
|
30
46
|
account: Object.freeze({ ...input.account }),
|
|
31
47
|
network: Object.freeze({ ...input.network }),
|
|
32
48
|
operation: input.operation,
|
|
49
|
+
...(review
|
|
50
|
+
? {
|
|
51
|
+
review: Object.freeze({
|
|
52
|
+
id: review.id,
|
|
53
|
+
unsignedHash: review.unsignedHash,
|
|
54
|
+
}),
|
|
55
|
+
}
|
|
56
|
+
: {}),
|
|
33
57
|
...(approvedWalletNonce ? { walletNonce: approvedWalletNonce } : {}),
|
|
34
58
|
...(input.originalHash !== undefined
|
|
35
59
|
? { originalHash: input.originalHash }
|
|
@@ -68,7 +92,13 @@ export function captureEvmSubmission(input, assertCurrent, capture) {
|
|
|
68
92
|
const boundary = Object.freeze({
|
|
69
93
|
context,
|
|
70
94
|
assertCurrent: guard,
|
|
71
|
-
persistSigned
|
|
95
|
+
persistSigned: (record) => {
|
|
96
|
+
if (context.review &&
|
|
97
|
+
Transaction.from(record.rawTransaction).unsignedHash !==
|
|
98
|
+
context.review.unsignedHash)
|
|
99
|
+
throw new Error('Signed EVM transaction does not match its fee review');
|
|
100
|
+
return persistSigned(record);
|
|
101
|
+
},
|
|
72
102
|
dispatchSigned,
|
|
73
103
|
});
|
|
74
104
|
capturedBoundaries.add(boundary);
|
|
@@ -80,21 +110,6 @@ export function assertDurableEvmSubmission(boundary) {
|
|
|
80
110
|
throw new TypeError('A captured durable EVM submission is required');
|
|
81
111
|
boundary.assertCurrent();
|
|
82
112
|
}
|
|
83
|
-
const failures = new WeakMap();
|
|
84
|
-
/** Only local stage evidence can label an error as a possibly dispatched send. */
|
|
85
|
-
export function evmSubmissionFailure(error) {
|
|
86
|
-
return ((error && (typeof error === 'object' || typeof error === 'function')
|
|
87
|
-
? failures.get(error)
|
|
88
|
-
: undefined) ?? { transactionNotBroadcast: true });
|
|
89
|
-
}
|
|
90
|
-
/** Preserve local evidence when an existing public API wraps its Error object. */
|
|
91
|
-
export function copyEvmSubmissionFailure(source, target) {
|
|
92
|
-
if (source && (typeof source === 'object' || typeof source === 'function')) {
|
|
93
|
-
const failure = failures.get(source);
|
|
94
|
-
if (failure)
|
|
95
|
-
failures.set(target, failure);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
113
|
/** Compare signed wire bytes with the complete envelope captured before signing. */
|
|
99
114
|
export function assertSignedEvmTransactionMatches(rawTransaction, expectedUnsignedTransaction, expectedFrom) {
|
|
100
115
|
if (typeof rawTransaction !== 'string' ||
|
|
@@ -206,52 +221,10 @@ async function submit(rawTransaction, broadcast, boundary, beforeBroadcast, expe
|
|
|
206
221
|
}
|
|
207
222
|
}
|
|
208
223
|
catch (cause) {
|
|
209
|
-
|
|
224
|
+
throw annotateEvmSubmissionFailure(cause, {
|
|
210
225
|
transactionNotBroadcast: !dispatched,
|
|
211
226
|
...(hash ? { signedTransactionHash: hash } : {}),
|
|
212
227
|
});
|
|
213
|
-
// Preserve provider Error identity/class and its data/shortMessage/reason/
|
|
214
|
-
// cause contract. Only the locally owned submission fields are overwritten.
|
|
215
|
-
let error = cause instanceof Error
|
|
216
|
-
? cause
|
|
217
|
-
: new Error(typeof cause === 'string' ? cause : 'EVM submission failed');
|
|
218
|
-
if (!(cause instanceof Error) && cause && typeof cause === 'object') {
|
|
219
|
-
// JSON-RPC adapters can reject with a plain error object. Copy data
|
|
220
|
-
// descriptors without invoking accessors or accepting its stage claim.
|
|
221
|
-
for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(cause))) {
|
|
222
|
-
if (key !== 'transactionNotBroadcast' &&
|
|
223
|
-
key !== 'signedTransactionHash' &&
|
|
224
|
-
'value' in descriptor) {
|
|
225
|
-
Object.defineProperty(error, key, descriptor);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
const stageDescriptors = Object.fromEntries(Object.entries({ ...failure, signedTransactionHash: hash }).map(([key, value]) => [
|
|
230
|
-
key,
|
|
231
|
-
{ value, enumerable: true, configurable: true, writable: true },
|
|
232
|
-
]));
|
|
233
|
-
try {
|
|
234
|
-
Object.defineProperties(error, stageDescriptors);
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
// A frozen provider Error may have non-configurable forged stage fields.
|
|
238
|
-
// Retain its original details/cause without allowing those fields to win.
|
|
239
|
-
const wrapped = new Error(error.message);
|
|
240
|
-
wrapped.name = error.name;
|
|
241
|
-
const descriptors = Object.getOwnPropertyDescriptors(error);
|
|
242
|
-
delete descriptors.transactionNotBroadcast;
|
|
243
|
-
delete descriptors.signedTransactionHash;
|
|
244
|
-
Object.defineProperties(wrapped, descriptors);
|
|
245
|
-
if (!Object.prototype.hasOwnProperty.call(wrapped, 'cause'))
|
|
246
|
-
Object.defineProperty(wrapped, 'cause', {
|
|
247
|
-
value: error,
|
|
248
|
-
configurable: true,
|
|
249
|
-
});
|
|
250
|
-
Object.defineProperties(wrapped, stageDescriptors);
|
|
251
|
-
error = wrapped;
|
|
252
|
-
}
|
|
253
|
-
failures.set(error, failure);
|
|
254
|
-
throw error;
|
|
255
228
|
}
|
|
256
229
|
}
|
|
257
230
|
//# sourceMappingURL=evm-submission.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-submission.js","sourceRoot":"","sources":["../../../src/transactions/evm-submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"evm-submission.js","sourceRoot":"","sources":["../../../src/transactions/evm-submission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { getAddress } from 'ethers/address';
|
|
2
|
+
import { Signature } from 'ethers/crypto';
|
|
3
|
+
import { Transaction } from 'ethers/transaction';
|
|
4
|
+
import { assertSignedEvmTransactionMatches } from './evm-submission';
|
|
5
|
+
import { annotateEvmSubmissionFailure } from './evm-submission-failure';
|
|
6
|
+
import { captureHardwareTransactionAuthority } from '../hardware-transaction-authority';
|
|
7
|
+
/** Sign the reviewed bytes through the shared Ledger adapter without changing fees or nonce. */
|
|
8
|
+
export async function signLedgerEvmTransaction(signer, request, authority) {
|
|
9
|
+
try {
|
|
10
|
+
const owner = captureHardwareTransactionAuthority(authority);
|
|
11
|
+
const { accountIndex, unsignedTransaction } = request;
|
|
12
|
+
const expectedAddress = getAddress(request.expectedAddress);
|
|
13
|
+
if (!Number.isSafeInteger(accountIndex) ||
|
|
14
|
+
accountIndex < 0 ||
|
|
15
|
+
accountIndex > 0x7fffffff ||
|
|
16
|
+
typeof unsignedTransaction !== 'string')
|
|
17
|
+
throw new TypeError('Invalid reviewed Ledger transaction');
|
|
18
|
+
const transaction = Transaction.from(unsignedTransaction);
|
|
19
|
+
if (transaction.isSigned() ||
|
|
20
|
+
transaction.chainId <= 0n ||
|
|
21
|
+
transaction.unsignedSerialized !== unsignedTransaction)
|
|
22
|
+
throw new TypeError('Ledger signing requires canonical unsigned transaction bytes');
|
|
23
|
+
owner.assertCurrent();
|
|
24
|
+
const signature = await signer.evm.signEVMTransaction({
|
|
25
|
+
accountIndex,
|
|
26
|
+
expectedAddress,
|
|
27
|
+
rawTx: unsignedTransaction.slice(2),
|
|
28
|
+
}, owner);
|
|
29
|
+
owner.assertCurrent();
|
|
30
|
+
transaction.signature = Signature.from({
|
|
31
|
+
r: `0x${signature.r}`,
|
|
32
|
+
s: `0x${signature.s}`,
|
|
33
|
+
v: Number.parseInt(signature.v, 16),
|
|
34
|
+
});
|
|
35
|
+
const rawTransaction = transaction.serialized;
|
|
36
|
+
if (transaction.from?.toLowerCase() !== expectedAddress.toLowerCase()) {
|
|
37
|
+
throw Object.assign(new Error('Hardware signature does not match the approved account'), { code: 'HARDWARE_ACCOUNT_MISMATCH' });
|
|
38
|
+
}
|
|
39
|
+
const checked = assertSignedEvmTransactionMatches(rawTransaction, unsignedTransaction, expectedAddress);
|
|
40
|
+
owner.assertCurrent();
|
|
41
|
+
return Object.freeze({ rawTransaction, hash: checked.hash });
|
|
42
|
+
}
|
|
43
|
+
catch (cause) {
|
|
44
|
+
throw annotateEvmSubmissionFailure(cause, {
|
|
45
|
+
transactionNotBroadcast: true,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ledger-signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-signing.js","sourceRoot":"","sources":["../../../src/transactions/ledger-signing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,mCAAmC,CAAC;AAKxF,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAwD,EACxD,OAIE,EACF,SAAuC;IAEvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,mCAAmC,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;QACtD,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5D,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC;YACnC,YAAY,GAAG,CAAC;YAChB,YAAY,GAAG,UAAU;YACzB,OAAO,mBAAmB,KAAK,QAAQ;YAEvC,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1D,IACE,WAAW,CAAC,QAAQ,EAAE;YACtB,WAAW,CAAC,OAAO,IAAI,EAAE;YACzB,WAAW,CAAC,kBAAkB,KAAK,mBAAmB;YAEtD,MAAM,IAAI,SAAS,CACjB,8DAA8D,CAC/D,CAAC;QACJ,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,CACnD;YACE,YAAY;YACZ,eAAe;YACf,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;SACpC,EACD,KAAK,CACN,CAAC;QACF,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;YACrC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,EAAE;YACrB,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,EAAE;YACrB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC;QAC9C,IAAI,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;YACtE,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CAAC,wDAAwD,CAAC,EACnE,EAAE,IAAI,EAAE,2BAA2B,EAAE,CACtC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,iCAAiC,CAC/C,cAAc,EACd,mBAAmB,EACnB,eAAe,CAChB,CAAC;QACF,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,IAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,4BAA4B,CAAC,KAAK,EAAE;YACxC,uBAAuB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -4,8 +4,29 @@ import { prepareUnsignedEvmEnvelope, readEvmOwnData, snapshotPreparedEvmTransact
|
|
|
4
4
|
import { signTransaction } from './evm-local-signer';
|
|
5
5
|
import { assertSignedEvmTransactionMatches } from './evm-submission';
|
|
6
6
|
const invalid = () => new TypeError('Invalid prepared EVM signing request');
|
|
7
|
+
export function snapshotEvmSigningIdentity(input) {
|
|
8
|
+
const identity = readEvmOwnData(input, ['id', 'type', 'expectedAddress']);
|
|
9
|
+
if (!Number.isSafeInteger(identity.id) ||
|
|
10
|
+
identity.id < 0 ||
|
|
11
|
+
identity.id > 0x7fffffff ||
|
|
12
|
+
!['HDAccount', 'Imported', 'Ledger', 'Trezor', 'SmartAccount'].includes(identity.type) ||
|
|
13
|
+
typeof identity.expectedAddress !== 'string' ||
|
|
14
|
+
!/^0x[0-9a-fA-F]{40}$/.test(identity.expectedAddress))
|
|
15
|
+
throw invalid();
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
id: identity.id,
|
|
18
|
+
type: identity.type,
|
|
19
|
+
expectedAddress: getAddress(identity.expectedAddress),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
7
22
|
export function snapshotPreparedEvmRequest(input) {
|
|
8
|
-
const root = readEvmOwnData(input, [
|
|
23
|
+
const root = readEvmOwnData(input, [
|
|
24
|
+
'selectedAccount',
|
|
25
|
+
'account',
|
|
26
|
+
'network',
|
|
27
|
+
'transaction',
|
|
28
|
+
]);
|
|
29
|
+
const selectedAccount = snapshotEvmSigningIdentity(root.selectedAccount);
|
|
9
30
|
const account = readEvmOwnData(root.account, [
|
|
10
31
|
'id',
|
|
11
32
|
'type',
|
|
@@ -40,6 +61,7 @@ export function snapshotPreparedEvmRequest(input) {
|
|
|
40
61
|
if (transaction.from !== expectedAddress || network.chainId !== chainId)
|
|
41
62
|
throw invalid();
|
|
42
63
|
return Object.freeze({
|
|
64
|
+
selectedAccount,
|
|
43
65
|
account: Object.freeze({
|
|
44
66
|
id: account.id,
|
|
45
67
|
type: account.type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-evm.js","sourceRoot":"","sources":["../../../src/transactions/prepared-evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAIrE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"prepared-evm.js","sourceRoot":"","sources":["../../../src/transactions/prepared-evm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { getAddress } from 'ethers/address';
|
|
2
|
+
import { Signature } from 'ethers/crypto';
|
|
3
|
+
import { Transaction } from 'ethers/transaction';
|
|
4
|
+
import { toBeHex } from 'ethers/utils';
|
|
5
|
+
import { assertSignedEvmTransactionMatches } from './evm-submission';
|
|
6
|
+
import { annotateEvmSubmissionFailure } from './evm-submission-failure';
|
|
7
|
+
import { assertEvmGasLimit } from '../evm-fees';
|
|
8
|
+
import { captureHardwareTransactionAuthority } from '../hardware-transaction-authority';
|
|
9
|
+
// Connect returns hexadecimal fields, including an optionally numeric recovery v.
|
|
10
|
+
const trezorSignature = (signature) => {
|
|
11
|
+
const { r, s, v } = signature;
|
|
12
|
+
if (![r, s].every((value) => /^(?:0x)?[0-9a-f]{64}$/i.test(value)))
|
|
13
|
+
throw new Error('Invalid Trezor signature scalar encoding');
|
|
14
|
+
if (typeof v === 'string' && !/^(?:0x)?[0-9a-f]+$/i.test(v))
|
|
15
|
+
throw new Error('Invalid Trezor signature recovery value');
|
|
16
|
+
const recovery = typeof v === 'number' ? v : Number.parseInt(v, 16);
|
|
17
|
+
if (!Number.isSafeInteger(recovery) || recovery < 0)
|
|
18
|
+
throw new Error('Invalid Trezor signature recovery value');
|
|
19
|
+
return Signature.from({
|
|
20
|
+
r: `0x${r.replace(/^0x/i, '')}`,
|
|
21
|
+
s: `0x${s.replace(/^0x/i, '')}`,
|
|
22
|
+
v: recovery,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
/** Sign reviewed bytes through an explicitly hosted Trezor keyring. */
|
|
26
|
+
export async function signTrezorEvmTransaction(signer, request, authority) {
|
|
27
|
+
try {
|
|
28
|
+
const owner = captureHardwareTransactionAuthority(authority);
|
|
29
|
+
const { accountIndex, coin, slip44, unsignedTransaction } = request;
|
|
30
|
+
const expectedAddress = getAddress(request.expectedAddress);
|
|
31
|
+
if (!Number.isSafeInteger(accountIndex) ||
|
|
32
|
+
accountIndex < 0 ||
|
|
33
|
+
accountIndex > 0x7fffffff ||
|
|
34
|
+
!Number.isSafeInteger(slip44) ||
|
|
35
|
+
slip44 < 0 ||
|
|
36
|
+
slip44 > 0x7fffffff ||
|
|
37
|
+
typeof coin !== 'string' ||
|
|
38
|
+
coin.length === 0 ||
|
|
39
|
+
typeof unsignedTransaction !== 'string')
|
|
40
|
+
throw new TypeError('Invalid reviewed Trezor transaction');
|
|
41
|
+
const transaction = Transaction.from(unsignedTransaction);
|
|
42
|
+
if (transaction.isSigned() ||
|
|
43
|
+
transaction.chainId <= 0n ||
|
|
44
|
+
transaction.chainId > BigInt(Number.MAX_SAFE_INTEGER) ||
|
|
45
|
+
(transaction.type !== 0 && transaction.type !== 2) ||
|
|
46
|
+
transaction.unsignedSerialized !== unsignedTransaction)
|
|
47
|
+
throw new TypeError('Trezor signing requires canonical unsigned type 0 or type 2 transaction bytes');
|
|
48
|
+
assertEvmGasLimit(transaction.gasLimit, transaction.chainId);
|
|
49
|
+
const common = {
|
|
50
|
+
to: transaction.to,
|
|
51
|
+
value: toBeHex(transaction.value),
|
|
52
|
+
gasLimit: toBeHex(transaction.gasLimit),
|
|
53
|
+
nonce: toBeHex(transaction.nonce),
|
|
54
|
+
data: transaction.data,
|
|
55
|
+
chainId: Number(transaction.chainId),
|
|
56
|
+
};
|
|
57
|
+
const tx = transaction.type === 0
|
|
58
|
+
? { ...common, gasPrice: toBeHex(transaction.gasPrice) }
|
|
59
|
+
: {
|
|
60
|
+
...common,
|
|
61
|
+
maxFeePerGas: toBeHex(transaction.maxFeePerGas),
|
|
62
|
+
maxPriorityFeePerGas: toBeHex(transaction.maxPriorityFeePerGas),
|
|
63
|
+
accessList: transaction.accessList.map(({ address, storageKeys }) => ({
|
|
64
|
+
address,
|
|
65
|
+
storageKeys: [...storageKeys],
|
|
66
|
+
})),
|
|
67
|
+
};
|
|
68
|
+
owner.assertCurrent();
|
|
69
|
+
const signature = await signer.signEthTransaction({ index: String(accountIndex), coin, slip44, tx }, owner);
|
|
70
|
+
owner.assertCurrent();
|
|
71
|
+
if (signature.success !== true)
|
|
72
|
+
throw new Error('Transaction signature failed');
|
|
73
|
+
transaction.signature = trezorSignature(signature.payload);
|
|
74
|
+
const rawTransaction = transaction.serialized;
|
|
75
|
+
if (transaction.from?.toLowerCase() !== expectedAddress.toLowerCase())
|
|
76
|
+
throw Object.assign(new Error('Hardware signature does not match the approved account'), { code: 'HARDWARE_ACCOUNT_MISMATCH' });
|
|
77
|
+
const checked = assertSignedEvmTransactionMatches(rawTransaction, unsignedTransaction, expectedAddress);
|
|
78
|
+
owner.assertCurrent();
|
|
79
|
+
return Object.freeze({ rawTransaction, hash: checked.hash });
|
|
80
|
+
}
|
|
81
|
+
catch (cause) {
|
|
82
|
+
throw annotateEvmSubmissionFailure(cause, {
|
|
83
|
+
transactionNotBroadcast: true,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=trezor-signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trezor-signing.js","sourceRoot":"","sources":["../../../src/transactions/trezor-signing.ts"],"names":[],"mappings":"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"}
|