@sidhujag/sysweb3-keyring 1.0.612 → 1.0.615
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 +61 -0
- package/README.md +39 -1
- package/cjs/hardware-wallet-manager.js +3 -1
- package/cjs/hardware-wallet-manager.js.map +1 -1
- package/cjs/keyring-manager.js +184 -43
- package/cjs/keyring-manager.js.map +1 -1
- package/cjs/ledger/bitcoin_client/lib/psbtv2.js +11 -2
- package/cjs/ledger/bitcoin_client/lib/psbtv2.js.map +1 -1
- package/cjs/ledger/index.js +4 -0
- package/cjs/ledger/index.js.map +1 -1
- package/cjs/storage.js +26 -16
- package/cjs/storage.js.map +1 -1
- package/cjs/transactions/ethereum.js +174 -114
- package/cjs/transactions/ethereum.js.map +1 -1
- package/cjs/transactions/evm-local-signer.js +2 -1
- package/cjs/transactions/evm-local-signer.js.map +1 -1
- package/cjs/transactions/syscoin.js +108 -5
- package/cjs/transactions/syscoin.js.map +1 -1
- package/cjs/trezor/index.js +115 -31
- package/cjs/trezor/index.js.map +1 -1
- package/cjs/types.js.map +1 -1
- package/cjs/utils/psbt-account-scope.js +347 -0
- package/cjs/utils/psbt-account-scope.js.map +1 -0
- package/package.json +3 -2
- package/types/keyring-manager.d.ts +4 -0
- package/types/storage.d.ts +3 -1
- package/types/transactions/ethereum.d.ts +7 -4
- package/types/transactions/evm-local-signer.d.ts +1 -1
- package/types/transactions/syscoin.d.ts +2 -1
- package/types/types.d.ts +18 -2
- package/types/utils/psbt-account-scope.d.ts +17 -0
|
@@ -0,0 +1,347 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createPsbtDerivationGuard = createPsbtDerivationGuard;
|
|
37
|
+
exports.assertPsbtAccountScope = assertPsbtAccountScope;
|
|
38
|
+
const ecc = __importStar(require("@bitcoinerlab/secp256k1"));
|
|
39
|
+
const sysweb3_network_1 = require("@sidhujag/sysweb3-network");
|
|
40
|
+
const bip32_1 = require("bip32");
|
|
41
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
42
|
+
const types_1 = require("../types");
|
|
43
|
+
const derivation_paths_1 = require("./derivation-paths");
|
|
44
|
+
const bip32 = (0, bip32_1.BIP32Factory)(ecc);
|
|
45
|
+
const SCOPE_ERROR = 'PSBT input is outside the approved account';
|
|
46
|
+
const fail = () => {
|
|
47
|
+
throw new Error(SCOPE_ERROR);
|
|
48
|
+
};
|
|
49
|
+
const clearSigningHints = (input) => {
|
|
50
|
+
delete input.bip32Derivation;
|
|
51
|
+
delete input.tapBip32Derivation;
|
|
52
|
+
input.unknownKeyVals = (input.unknownKeyVals || []).filter((field) => Buffer.from(field.key).toString() !== 'path');
|
|
53
|
+
};
|
|
54
|
+
const equal = (a, b) => Boolean(a && b && Buffer.from(a).equals(Buffer.from(b)));
|
|
55
|
+
const childIndex = (value) => {
|
|
56
|
+
if (!/^(0|[1-9][0-9]*)$/.test(value))
|
|
57
|
+
return fail();
|
|
58
|
+
const index = Number(value);
|
|
59
|
+
if (!Number.isSafeInteger(index) || index >= 0x80000000)
|
|
60
|
+
return fail();
|
|
61
|
+
return index;
|
|
62
|
+
};
|
|
63
|
+
const publicAccountNode = (xpub) => {
|
|
64
|
+
// Account keys use coin-specific xpub/zpub/vpub version bytes. Preserve the
|
|
65
|
+
// checked public payload instead of guessing its network from that prefix.
|
|
66
|
+
const codec = require('bs58check');
|
|
67
|
+
const payload = Buffer.from((codec.default || codec).decode(xpub));
|
|
68
|
+
if (payload.length !== 78 || (payload[45] !== 2 && payload[45] !== 3))
|
|
69
|
+
return fail();
|
|
70
|
+
return bip32.fromBase58(xpub, {
|
|
71
|
+
...bitcoinjs_lib_1.networks.bitcoin,
|
|
72
|
+
bip32: { public: payload.readUInt32BE(0), private: 0x0488ade4 },
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
function createPsbtDerivationGuard(scope) {
|
|
76
|
+
const { account, accountId, accountType, network } = scope;
|
|
77
|
+
const node = publicAccountNode(account.xpub);
|
|
78
|
+
const prefix = accountType === types_1.KeyringAccountType.HDAccount
|
|
79
|
+
? `m/84'/${network.slip44}'/${accountId}'`
|
|
80
|
+
: (0, derivation_paths_1.getAccountDerivationPath)(network.currency, network.slip44, accountType === types_1.KeyringAccountType.Imported && node.depth === 3
|
|
81
|
+
? node.index & 0x7fffffff
|
|
82
|
+
: accountId);
|
|
83
|
+
return (path) => {
|
|
84
|
+
let relative = path;
|
|
85
|
+
if (relative.startsWith(`${prefix}/`))
|
|
86
|
+
relative = relative.slice(prefix.length + 1);
|
|
87
|
+
else if (relative.startsWith('m/') ||
|
|
88
|
+
accountType !== types_1.KeyringAccountType.Imported)
|
|
89
|
+
return fail();
|
|
90
|
+
const parts = relative.split('/');
|
|
91
|
+
if (parts.length !== 2)
|
|
92
|
+
return fail();
|
|
93
|
+
if (![0, 1].includes(childIndex(parts[0])))
|
|
94
|
+
return fail();
|
|
95
|
+
childIndex(parts[1]);
|
|
96
|
+
return relative;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Verify key ownership from public derivation and the actual spent script.
|
|
100
|
+
* Proprietary address metadata is deliberately never an authority here.
|
|
101
|
+
*/
|
|
102
|
+
function assertPsbtAccountScope(psbt, scope) {
|
|
103
|
+
const { account, accountType, network } = scope;
|
|
104
|
+
const config = (0, sysweb3_network_1.getNetworkConfig)(network.slip44, network.currency);
|
|
105
|
+
const bitcoinNetwork = network.slip44 === 1 ? config.networks.testnet : config.networks.mainnet;
|
|
106
|
+
const singleAddress = accountType === types_1.KeyringAccountType.Imported &&
|
|
107
|
+
account.xpub === account.address;
|
|
108
|
+
const node = singleAddress ? undefined : publicAccountNode(account.xpub);
|
|
109
|
+
const guardPath = singleAddress
|
|
110
|
+
? undefined
|
|
111
|
+
: createPsbtDerivationGuard(scope);
|
|
112
|
+
if (!singleAddress && !node?.isNeutered())
|
|
113
|
+
return fail();
|
|
114
|
+
if (!Array.isArray(psbt.data?.inputs) || psbt.data.inputs.length === 0)
|
|
115
|
+
return fail();
|
|
116
|
+
const derivedKeys = new Map();
|
|
117
|
+
let ownedInputs = 0;
|
|
118
|
+
let hasUnfinishedInputs = false;
|
|
119
|
+
psbt.data.inputs.forEach((input, inputIndex) => {
|
|
120
|
+
// Finalized co-signer inputs may remain in a PSBT. Remove signing hints so
|
|
121
|
+
// even a permissive underlying signer cannot add another signature there.
|
|
122
|
+
if (input.finalScriptSig || input.finalScriptWitness) {
|
|
123
|
+
clearSigningHints(input);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
hasUnfinishedInputs = true;
|
|
127
|
+
const txInput = psbt.txInputs[inputIndex];
|
|
128
|
+
let spent = input.witnessUtxo;
|
|
129
|
+
if (input.nonWitnessUtxo) {
|
|
130
|
+
const previous = bitcoinjs_lib_1.Transaction.fromBuffer(input.nonWitnessUtxo);
|
|
131
|
+
if (!equal(previous.getHash(), txInput.hash))
|
|
132
|
+
return fail();
|
|
133
|
+
const output = previous.outs[txInput.index];
|
|
134
|
+
if (!output ||
|
|
135
|
+
(spent &&
|
|
136
|
+
(!equal(output.script, spent.script) || output.value !== spent.value)))
|
|
137
|
+
return fail();
|
|
138
|
+
spent = output;
|
|
139
|
+
}
|
|
140
|
+
if (!spent)
|
|
141
|
+
return fail();
|
|
142
|
+
try {
|
|
143
|
+
let multisigKeys;
|
|
144
|
+
const multisigScript = input.witnessScript || input.redeemScript;
|
|
145
|
+
if (multisigScript) {
|
|
146
|
+
try {
|
|
147
|
+
// Only standard multisig is supported here. The scripts, not the
|
|
148
|
+
// cosigners' supplied derivation metadata, authenticate membership.
|
|
149
|
+
const multisig = bitcoinjs_lib_1.payments.p2ms({
|
|
150
|
+
output: multisigScript,
|
|
151
|
+
network: bitcoinNetwork,
|
|
152
|
+
});
|
|
153
|
+
if (!multisig.pubkeys?.length)
|
|
154
|
+
return fail();
|
|
155
|
+
if (input.witnessScript) {
|
|
156
|
+
const witness = bitcoinjs_lib_1.payments.p2wsh({
|
|
157
|
+
redeem: multisig,
|
|
158
|
+
network: bitcoinNetwork,
|
|
159
|
+
});
|
|
160
|
+
if (input.redeemScript &&
|
|
161
|
+
!equal(input.redeemScript, witness.output))
|
|
162
|
+
return fail();
|
|
163
|
+
const output = input.redeemScript
|
|
164
|
+
? bitcoinjs_lib_1.payments.p2sh({ redeem: witness, network: bitcoinNetwork })
|
|
165
|
+
.output
|
|
166
|
+
: witness.output;
|
|
167
|
+
if (!equal(output, spent.script))
|
|
168
|
+
return fail();
|
|
169
|
+
}
|
|
170
|
+
else if (!equal(bitcoinjs_lib_1.payments.p2sh({ redeem: multisig, network: bitcoinNetwork })
|
|
171
|
+
.output, spent.script)) {
|
|
172
|
+
// Nested single-key P2WPKH is validated below, not as multisig.
|
|
173
|
+
return fail();
|
|
174
|
+
}
|
|
175
|
+
multisigKeys = multisig.pubkeys;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// A wrapped single-key input has a redeemScript but no multisig.
|
|
179
|
+
// Its normal derived-key output check below still authenticates it.
|
|
180
|
+
if (input.witnessScript)
|
|
181
|
+
return fail();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (singleAddress) {
|
|
185
|
+
const approvedScript = bitcoinjs_lib_1.address.toOutputScript(account.address, bitcoinNetwork);
|
|
186
|
+
if (multisigKeys) {
|
|
187
|
+
const ownsKey = multisigKeys.some((pubkey) => {
|
|
188
|
+
const witness = bitcoinjs_lib_1.payments.p2wpkh({
|
|
189
|
+
pubkey,
|
|
190
|
+
network: bitcoinNetwork,
|
|
191
|
+
});
|
|
192
|
+
return [
|
|
193
|
+
bitcoinjs_lib_1.payments.p2pkh({ pubkey, network: bitcoinNetwork }).output,
|
|
194
|
+
witness.output,
|
|
195
|
+
bitcoinjs_lib_1.payments.p2sh({ redeem: witness, network: bitcoinNetwork })
|
|
196
|
+
.output,
|
|
197
|
+
].some((output) => equal(output, approvedScript));
|
|
198
|
+
});
|
|
199
|
+
if (!ownsKey)
|
|
200
|
+
return fail();
|
|
201
|
+
delete input.bip32Derivation;
|
|
202
|
+
delete input.tapBip32Derivation;
|
|
203
|
+
input.unknownKeyVals = (input.unknownKeyVals || []).filter((field) => Buffer.from(field.key).toString() !== 'path');
|
|
204
|
+
}
|
|
205
|
+
else if (!equal(spent.script, approvedScript))
|
|
206
|
+
return fail();
|
|
207
|
+
ownedInputs += 1;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const derivations = [
|
|
211
|
+
...(input.bip32Derivation || []),
|
|
212
|
+
...(input.tapBip32Derivation || []),
|
|
213
|
+
];
|
|
214
|
+
const paths = derivations.map((derivation) => ({
|
|
215
|
+
path: derivation.path,
|
|
216
|
+
pubkey: derivation.pubkey,
|
|
217
|
+
source: derivation,
|
|
218
|
+
}));
|
|
219
|
+
for (const field of input.unknownKeyVals || []) {
|
|
220
|
+
if (Buffer.from(field.key).toString() === 'path')
|
|
221
|
+
paths.push({
|
|
222
|
+
path: Buffer.from(field.value).toString(),
|
|
223
|
+
pubkey: undefined,
|
|
224
|
+
source: field,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
if (!paths.length)
|
|
228
|
+
return fail();
|
|
229
|
+
const approvedHints = new Set();
|
|
230
|
+
for (const candidate of paths) {
|
|
231
|
+
let relative;
|
|
232
|
+
try {
|
|
233
|
+
relative = guardPath(candidate.path);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (multisigKeys)
|
|
237
|
+
continue;
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
const parts = relative.split('/');
|
|
241
|
+
if (parts.length !== 2)
|
|
242
|
+
return fail();
|
|
243
|
+
const branch = childIndex(parts[0]);
|
|
244
|
+
const index = childIndex(parts[1]);
|
|
245
|
+
if (branch !== 0 && branch !== 1)
|
|
246
|
+
return fail();
|
|
247
|
+
let derived = derivedKeys.get(relative);
|
|
248
|
+
if (!derived) {
|
|
249
|
+
const publicKey = node.derive(branch).derive(index).publicKey;
|
|
250
|
+
const p2pkh = bitcoinjs_lib_1.payments.p2pkh({
|
|
251
|
+
pubkey: publicKey,
|
|
252
|
+
network: bitcoinNetwork,
|
|
253
|
+
});
|
|
254
|
+
const p2wpkh = bitcoinjs_lib_1.payments.p2wpkh({
|
|
255
|
+
pubkey: publicKey,
|
|
256
|
+
network: bitcoinNetwork,
|
|
257
|
+
});
|
|
258
|
+
const p2sh = bitcoinjs_lib_1.payments.p2sh({
|
|
259
|
+
redeem: p2wpkh,
|
|
260
|
+
network: bitcoinNetwork,
|
|
261
|
+
});
|
|
262
|
+
derived = {
|
|
263
|
+
publicKey,
|
|
264
|
+
scripts: [p2pkh.output, p2wpkh.output, p2sh.output],
|
|
265
|
+
};
|
|
266
|
+
derivedKeys.set(relative, derived);
|
|
267
|
+
}
|
|
268
|
+
const { publicKey } = derived;
|
|
269
|
+
if (candidate.pubkey &&
|
|
270
|
+
!equal(candidate.pubkey, publicKey) &&
|
|
271
|
+
!equal(candidate.pubkey, publicKey.slice(1))) {
|
|
272
|
+
if (multisigKeys)
|
|
273
|
+
continue;
|
|
274
|
+
return fail();
|
|
275
|
+
}
|
|
276
|
+
if (multisigKeys) {
|
|
277
|
+
if (!multisigKeys.some((key) => equal(key, publicKey)))
|
|
278
|
+
continue;
|
|
279
|
+
approvedHints.add(candidate.source);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const ordinary = derived.scripts.some((script) => equal(script, spent.script));
|
|
283
|
+
let taproot = false;
|
|
284
|
+
// Key-path signing can reconstruct an omitted internal key from this
|
|
285
|
+
// approved derivation. Commit any supplied Merkle root when checking
|
|
286
|
+
// the output, but do not infer script-path keys or accept a conflicting
|
|
287
|
+
// explicit internal key.
|
|
288
|
+
if (input.tapInternalKey === undefined
|
|
289
|
+
? !ordinary &&
|
|
290
|
+
!input.tapLeafScript?.length &&
|
|
291
|
+
!input.tapScriptSig?.length &&
|
|
292
|
+
!input.tapBip32Derivation?.some((derivation) => derivation.leafHashes.length > 0)
|
|
293
|
+
: equal(input.tapInternalKey, publicKey.slice(1))) {
|
|
294
|
+
const p2tr = bitcoinjs_lib_1.payments.p2tr({
|
|
295
|
+
internalPubkey: publicKey.slice(1),
|
|
296
|
+
hash: input.tapMerkleRoot,
|
|
297
|
+
network: bitcoinNetwork,
|
|
298
|
+
});
|
|
299
|
+
taproot = equal(p2tr.output, spent.script);
|
|
300
|
+
}
|
|
301
|
+
if (!ordinary && !taproot)
|
|
302
|
+
return fail();
|
|
303
|
+
}
|
|
304
|
+
if (multisigKeys) {
|
|
305
|
+
if (!approvedHints.size)
|
|
306
|
+
return fail();
|
|
307
|
+
// Keep cosigner signatures, but expose only the approved account's paths
|
|
308
|
+
// to the underlying signer, including its full-root HD fallback.
|
|
309
|
+
if (input.bip32Derivation)
|
|
310
|
+
input.bip32Derivation = input.bip32Derivation.filter((value) => approvedHints.has(value));
|
|
311
|
+
if (input.tapBip32Derivation)
|
|
312
|
+
input.tapBip32Derivation = input.tapBip32Derivation.filter((value) => approvedHints.has(value));
|
|
313
|
+
if (input.unknownKeyVals)
|
|
314
|
+
input.unknownKeyVals = input.unknownKeyVals.filter((field) => Buffer.from(field.key).toString() !== 'path' ||
|
|
315
|
+
approvedHints.has(field));
|
|
316
|
+
}
|
|
317
|
+
ownedInputs += 1;
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
if (singleAddress ||
|
|
321
|
+
!(error instanceof Error) ||
|
|
322
|
+
error.message !== SCOPE_ERROR)
|
|
323
|
+
throw error;
|
|
324
|
+
// A joint PSBT may include inputs for another signer. Hide every HD
|
|
325
|
+
// hint before our private signer runs; even another account in this
|
|
326
|
+
// wallet must remain unsigned. The public API restores metadata later.
|
|
327
|
+
clearSigningHints(input);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
if (hasUnfinishedInputs && ownedInputs === 0)
|
|
331
|
+
return fail();
|
|
332
|
+
// An imported extended key is already the account node, so the signer must
|
|
333
|
+
// receive only the validated relative children, never another full root path.
|
|
334
|
+
if (accountType === types_1.KeyringAccountType.Imported && !singleAddress) {
|
|
335
|
+
for (const input of psbt.data.inputs) {
|
|
336
|
+
for (const derivation of [
|
|
337
|
+
...(input.bip32Derivation || []),
|
|
338
|
+
...(input.tapBip32Derivation || []),
|
|
339
|
+
])
|
|
340
|
+
derivation.path = guardPath(derivation.path);
|
|
341
|
+
for (const field of input.unknownKeyVals || [])
|
|
342
|
+
if (Buffer.from(field.key).toString() === 'path')
|
|
343
|
+
field.value = Buffer.from(guardPath(Buffer.from(field.value).toString()));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=psbt-account-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbt-account-scope.js","sourceRoot":"","sources":["../../../src/utils/psbt-account-scope.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sidhujag/sysweb3-keyring",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.615",
|
|
4
4
|
"description": "Keyring Manager for UTXO and Web3 Wallets",
|
|
5
5
|
"main": "cjs/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"@ledgerhq/hw-transport-webhid": "^6.30.5",
|
|
18
18
|
"@ledgerhq/logs": "^6.10.1",
|
|
19
19
|
"@metamask/eth-sig-util": "^8.2.0",
|
|
20
|
-
"@sidhujag/sysweb3-core": "^1.0.
|
|
20
|
+
"@sidhujag/sysweb3-core": "^1.0.29",
|
|
21
21
|
"@sidhujag/sysweb3-network": "^1.0.109",
|
|
22
22
|
"@sidhujag/sysweb3-utils": "^1.1.278",
|
|
23
23
|
"@trezor/connect-web": "^9.7.1",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"bip32-path": "^0.4.2",
|
|
28
28
|
"bitcoin-ops": "^1.4.1",
|
|
29
29
|
"bitcoinjs-lib": "^7.0.1",
|
|
30
|
+
"bs58check": "^3.0.1",
|
|
30
31
|
"crypto-js": "^4.1.1",
|
|
31
32
|
"ethers": "^6.17.0"
|
|
32
33
|
},
|
|
@@ -148,8 +148,10 @@ export declare class KeyringManager implements IKeyringManager {
|
|
|
148
148
|
* PRIVATE METHODS
|
|
149
149
|
*/
|
|
150
150
|
private getDecryptedPrivateKey;
|
|
151
|
+
private capturePsbtSigningContext;
|
|
151
152
|
private getSigner;
|
|
152
153
|
private getReadOnlySigner;
|
|
154
|
+
private writeUtf8Diagnostic;
|
|
153
155
|
private validateAndHandleErrorByMessage;
|
|
154
156
|
private getAccountsState;
|
|
155
157
|
/**
|
|
@@ -165,6 +167,8 @@ export declare class KeyringManager implements IKeyringManager {
|
|
|
165
167
|
private getEncIterations;
|
|
166
168
|
private pbkdf2WebCryptoHex;
|
|
167
169
|
private encryptSHA512Async;
|
|
170
|
+
private deriveLegacySessionKey;
|
|
171
|
+
private deriveStoredSessionKey;
|
|
168
172
|
private getSysActivePrivateKey;
|
|
169
173
|
private getInitialAccountData;
|
|
170
174
|
private _createTrezorAccount;
|
package/types/storage.d.ts
CHANGED
|
@@ -2,5 +2,7 @@ export declare class VaultAuthenticationError extends Error {
|
|
|
2
2
|
readonly code = "INVALID_PASSWORD";
|
|
3
3
|
constructor();
|
|
4
4
|
}
|
|
5
|
-
export declare const setEncryptedVault: (decryptedVault: any, pwd: string
|
|
5
|
+
export declare const setEncryptedVault: (decryptedVault: any, pwd: string, freshVaultKeys?: {
|
|
6
|
+
salt: string;
|
|
7
|
+
}) => Promise<void>;
|
|
6
8
|
export declare const getDecryptedVault: (pwd: string, legacyPassword?: string) => Promise<any>;
|
|
@@ -4,7 +4,7 @@ import { BigNumber, TransactionResponse } from '../ethers-v6';
|
|
|
4
4
|
import { LedgerKeyring } from '../ledger';
|
|
5
5
|
import { CustomJsonRpcProvider } from '../providers';
|
|
6
6
|
import { TrezorKeyring } from '../trezor';
|
|
7
|
-
import { IResponseFromSendErcSignedTransaction, ISendSignedErcTransactionProps, IEthereumTransactions, SimpleTransactionRequest, KeyringAccountType, accountType, IGasParams } from '../types';
|
|
7
|
+
import { IResponseFromSendErcSignedTransaction, ISendSignedErcTransactionProps, IEthereumTransactions, IEvmReplacementOptions, SimpleTransactionRequest, KeyringAccountType, accountType, IGasParams } from '../types';
|
|
8
8
|
export declare class EthereumTransactions implements IEthereumTransactions {
|
|
9
9
|
private _web3Provider;
|
|
10
10
|
private _web3ProviderKey?;
|
|
@@ -15,7 +15,7 @@ export declare class EthereumTransactions implements IEthereumTransactions {
|
|
|
15
15
|
private getDecryptedPrivateKey;
|
|
16
16
|
private gasOverrides;
|
|
17
17
|
private getState;
|
|
18
|
-
constructor(getNetwork: () => INetwork, getDecryptedPrivateKey: () => {
|
|
18
|
+
constructor(getNetwork: () => INetwork, getDecryptedPrivateKey: (targetAccount?: IEvmReplacementOptions['targetAccount']) => {
|
|
19
19
|
address: string;
|
|
20
20
|
decryptedPrivateKey: string;
|
|
21
21
|
}, getState: () => {
|
|
@@ -49,7 +49,7 @@ export declare class EthereumTransactions implements IEthereumTransactions {
|
|
|
49
49
|
receivingAddress: string;
|
|
50
50
|
value: any;
|
|
51
51
|
}) => string;
|
|
52
|
-
getFeeDataWithDynamicMaxPriorityFeePerGas: () => Promise<{
|
|
52
|
+
getFeeDataWithDynamicMaxPriorityFeePerGas: (provider?: CustomJsonRpcProvider) => Promise<{
|
|
53
53
|
maxFeePerGas: BigNumber;
|
|
54
54
|
maxPriorityFeePerGas: BigNumber;
|
|
55
55
|
}>;
|
|
@@ -61,10 +61,13 @@ export declare class EthereumTransactions implements IEthereumTransactions {
|
|
|
61
61
|
}>;
|
|
62
62
|
sendFormattedTransaction: (params: SimpleTransactionRequest, isLegacy?: boolean) => Promise<any>;
|
|
63
63
|
private sendFormattedTransactionInternal;
|
|
64
|
-
sendTransactionWithEditedFee: (txHash: string, isLegacy?: boolean) => Promise<{
|
|
64
|
+
sendTransactionWithEditedFee: (txHash: string, isLegacy?: boolean, options?: IEvmReplacementOptions) => Promise<{
|
|
65
|
+
maximumFee?: string;
|
|
65
66
|
error?: boolean;
|
|
66
67
|
isSpeedUp: boolean;
|
|
67
68
|
transaction?: TransactionResponse;
|
|
69
|
+
code?: string;
|
|
70
|
+
message?: string;
|
|
68
71
|
}>;
|
|
69
72
|
sendSignedErc20Transaction: ({ receiver, tokenAddress, tokenAmount, isLegacy, maxPriorityFeePerGas, maxFeePerGas, gasPrice, decimals, gasLimit, saveTrezorTx, }: ISendSignedErcTransactionProps) => Promise<IResponseFromSendErcSignedTransaction>;
|
|
70
73
|
sendSignedErc721Transaction: ({ receiver, tokenAddress, tokenId, isLegacy, maxPriorityFeePerGas, maxFeePerGas, gasPrice, gasLimit, }: ISendSignedErcTransactionProps) => Promise<IResponseFromSendErcSignedTransaction>;
|
|
@@ -20,5 +20,5 @@ export declare const hashPersonalMessage: (message: Uint8Array) => string;
|
|
|
20
20
|
export declare const signPersonalMessage: (message: string | Uint8Array, privateKey: string | Uint8Array) => string;
|
|
21
21
|
export declare const parsePersonalMessage: (hexMessage: string) => string;
|
|
22
22
|
export declare const signTransaction: (transaction: TransactionRequest, privateKey: string | Uint8Array) => string;
|
|
23
|
-
export declare const sendLocalEvmTransaction: (provider: CustomJsonRpcProvider, privateKey: string, transaction: Deferrable<Record<string, any>>, beforeBroadcast?: () => void) => Promise<any>;
|
|
23
|
+
export declare const sendLocalEvmTransaction: (provider: CustomJsonRpcProvider, privateKey: string, transaction: Deferrable<Record<string, any>>, beforeBroadcast?: () => void, beforeSign?: () => void) => Promise<any>;
|
|
24
24
|
export declare const sameAddress: (left: string, right: string) => boolean;
|
|
@@ -11,6 +11,7 @@ export declare class SyscoinTransactions implements ISyscoinTransactions {
|
|
|
11
11
|
private ledger;
|
|
12
12
|
private getState;
|
|
13
13
|
private getAddress;
|
|
14
|
+
private captureSigningContext?;
|
|
14
15
|
constructor(getSyscoinSigner: () => {
|
|
15
16
|
hd: SyscoinHDSigner;
|
|
16
17
|
main: any;
|
|
@@ -26,7 +27,7 @@ export declare class SyscoinTransactions implements ISyscoinTransactions {
|
|
|
26
27
|
activeAccountId: number;
|
|
27
28
|
activeAccountType: KeyringAccountType;
|
|
28
29
|
activeNetwork: INetwork;
|
|
29
|
-
}, getAddress: (xpub: string, isChangeAddress: boolean) => Promise<string>, ledgerSigner: LedgerKeyring, trezorSigner: TrezorKeyring);
|
|
30
|
+
}, getAddress: (xpub: string, isChangeAddress: boolean) => Promise<string>, ledgerSigner: LedgerKeyring, trezorSigner: TrezorKeyring, captureSigningContext?: () => () => void);
|
|
30
31
|
private getTransactionPSBT;
|
|
31
32
|
decodeRawTransaction: (psbtOrHex: any, isRawHex?: boolean) => any;
|
|
32
33
|
private feeCache;
|
package/types/types.d.ts
CHANGED
|
@@ -34,6 +34,21 @@ export type EvmLocalAccount = {
|
|
|
34
34
|
privateKey: string;
|
|
35
35
|
publicKey: string;
|
|
36
36
|
};
|
|
37
|
+
export interface IEvmReplacementOptions {
|
|
38
|
+
/** Read-only preview; never requests credentials, a device signature or broadcast. */
|
|
39
|
+
previewOnly?: boolean;
|
|
40
|
+
/** Required for sending: maximum execution gas fee in decimal wei approved by the user. */
|
|
41
|
+
approvedMaximumFee?: string;
|
|
42
|
+
/** Select the locally controlled outer gas payer for a smart-account transaction. */
|
|
43
|
+
targetAccount?: {
|
|
44
|
+
id: number;
|
|
45
|
+
type: KeyringAccountType;
|
|
46
|
+
};
|
|
47
|
+
/** Host guard for the current account, network, session and pending original. */
|
|
48
|
+
assertCurrentContext?: () => void;
|
|
49
|
+
validateOriginal?: (transaction: TransactionResponse) => void;
|
|
50
|
+
beforeBroadcast?: () => void;
|
|
51
|
+
}
|
|
37
52
|
export interface IEthereumTransactions {
|
|
38
53
|
cancelSentTransaction: (txHash: string, isLegacy?: boolean, fallbackNonce?: number) => Promise<{
|
|
39
54
|
error?: boolean;
|
|
@@ -46,7 +61,7 @@ export interface IEthereumTransactions {
|
|
|
46
61
|
getEncryptedPubKey: () => string;
|
|
47
62
|
getErc20TokensByAddress?: (address: string, isSupported: boolean, apiUrl: string) => Promise<any[]>;
|
|
48
63
|
getFeeByType: (type: string) => Promise<string>;
|
|
49
|
-
getFeeDataWithDynamicMaxPriorityFeePerGas: () => Promise<any>;
|
|
64
|
+
getFeeDataWithDynamicMaxPriorityFeePerGas: (provider?: CustomJsonRpcProvider) => Promise<any>;
|
|
50
65
|
getGasLimit: (toAddress: string) => Promise<number>;
|
|
51
66
|
getGasOracle?: () => Promise<any>;
|
|
52
67
|
getRecommendedNonce: (address: string) => Promise<number>;
|
|
@@ -59,7 +74,8 @@ export interface IEthereumTransactions {
|
|
|
59
74
|
toBigNumber: (aBigNumberish: string | number) => BigNumber;
|
|
60
75
|
sendSignedErc20Transaction: ({ networkUrl, receiver, tokenAddress, tokenAmount, }: ISendSignedErcTransactionProps) => Promise<IResponseFromSendErcSignedTransaction>;
|
|
61
76
|
sendSignedErc721Transaction: ({ networkUrl, receiver, tokenAddress, tokenId, }: ISendSignedErcTransactionProps) => Promise<IResponseFromSendErcSignedTransaction>;
|
|
62
|
-
sendTransactionWithEditedFee: (txHash: string, isLegacy?: boolean) => Promise<{
|
|
77
|
+
sendTransactionWithEditedFee: (txHash: string, isLegacy?: boolean, options?: IEvmReplacementOptions) => Promise<{
|
|
78
|
+
maximumFee?: string;
|
|
63
79
|
isSpeedUp: boolean;
|
|
64
80
|
transaction?: TransactionResponse;
|
|
65
81
|
error?: boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { INetwork } from '@sidhujag/sysweb3-network';
|
|
2
|
+
import { Psbt } from 'bitcoinjs-lib';
|
|
3
|
+
import { KeyringAccountType } from '../types';
|
|
4
|
+
export type PsbtAccountScope = {
|
|
5
|
+
account: {
|
|
6
|
+
address: string;
|
|
7
|
+
xpub: string;
|
|
8
|
+
};
|
|
9
|
+
accountId: number;
|
|
10
|
+
accountType: KeyringAccountType;
|
|
11
|
+
network: INetwork;
|
|
12
|
+
};
|
|
13
|
+
export declare function createPsbtDerivationGuard(scope: PsbtAccountScope): (path: string) => string;
|
|
14
|
+
/** Verify key ownership from public derivation and the actual spent script.
|
|
15
|
+
* Proprietary address metadata is deliberately never an authority here.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertPsbtAccountScope(psbt: Psbt, scope: PsbtAccountScope): void;
|