@sidhujag/sysweb3-keyring 1.0.626 → 1.0.628
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 +20 -0
- package/cjs/keyring-core.js +2512 -0
- package/cjs/keyring-core.js.map +1 -0
- package/cjs/keyring-manager.js +23 -2437
- package/cjs/keyring-manager.js.map +1 -1
- package/cjs/software.js +58 -0
- package/cjs/software.js.map +1 -0
- package/cjs/storage-core.js +227 -0
- package/cjs/storage-core.js.map +1 -0
- package/cjs/storage.js +15 -210
- package/cjs/storage.js.map +1 -1
- package/cjs/transactions/ethereum.js +121 -29
- package/cjs/transactions/ethereum.js.map +1 -1
- package/cjs/transactions/evm-local-signer.js +11 -1
- package/cjs/transactions/evm-local-signer.js.map +1 -1
- package/cjs/transactions/hardware-psbt.js +167 -0
- package/cjs/transactions/hardware-psbt.js.map +1 -0
- package/cjs/transactions/syscoin-core.js +651 -0
- package/cjs/transactions/syscoin-core.js.map +1 -0
- package/cjs/transactions/syscoin.js +8 -768
- package/cjs/transactions/syscoin.js.map +1 -1
- package/cjs/types.js.map +1 -1
- package/package.json +38 -4
- package/types/keyring-core.d.ts +257 -0
- package/types/keyring-manager.d.ts +5 -223
- package/types/software.d.ts +23 -0
- package/types/storage-core.d.ts +22 -0
- package/types/storage.d.ts +1 -4
- package/types/transactions/ethereum.d.ts +16 -6
- package/types/transactions/evm-local-signer.d.ts +3 -1
- package/types/transactions/hardware-psbt.d.ts +7 -0
- package/types/transactions/syscoin-core.d.ts +92 -0
- package/types/transactions/syscoin.d.ts +8 -67
- package/types/types.d.ts +10 -0
- package/cjs/transactions/__tests__/integration.test.js +0 -237
- package/cjs/transactions/__tests__/integration.test.js.map +0 -1
- package/cjs/transactions/__tests__/syscoin.test.js +0 -361
- package/cjs/transactions/__tests__/syscoin.test.js.map +0 -1
- package/types/transactions/__tests__/integration.test.d.ts +0 -1
- package/types/transactions/__tests__/syscoin.test.d.ts +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLedgerPsbtSigner = createLedgerPsbtSigner;
|
|
4
|
+
exports.createTrezorPsbtSigner = createTrezorPsbtSigner;
|
|
5
|
+
const sysweb3_network_1 = require("@sidhujag/sysweb3-network");
|
|
6
|
+
const syscoin_core_1 = require("./syscoin-core");
|
|
7
|
+
const policy_1 = require("../ledger/bitcoin_client/lib/policy");
|
|
8
|
+
const psbtv2_1 = require("../ledger/bitcoin_client/lib/psbtv2");
|
|
9
|
+
const consts_1 = require("../ledger/consts");
|
|
10
|
+
const derivation_paths_1 = require("../utils/derivation-paths");
|
|
11
|
+
const psbt_account_scope_1 = require("../utils/psbt-account-scope");
|
|
12
|
+
/** Legacy device adapter. The software transaction engine never imports it. */
|
|
13
|
+
function createLedgerPsbtSigner(ledger) {
|
|
14
|
+
return async ({ psbt, account, network: activeNetwork, scope, assertCurrent, getRawTransaction, }) => {
|
|
15
|
+
if (typeof ledger?.convertToLedgerFormat !== 'function' ||
|
|
16
|
+
typeof getRawTransaction !== 'function') {
|
|
17
|
+
throw (0, syscoin_core_1.createHardwareSignerUnavailableError)('Ledger');
|
|
18
|
+
}
|
|
19
|
+
// CRITICAL: Enhance PSBT with required Ledger fields
|
|
20
|
+
const accountXpub = account.xpub;
|
|
21
|
+
const accountId = account.id;
|
|
22
|
+
// Enrich PSBT with nonWitnessUtxo for Ledger compatibility
|
|
23
|
+
const blockbookUrl = activeNetwork.url;
|
|
24
|
+
// Some unit tests mock PSBTs without bitcoinjs-lib internals (data/txInputs).
|
|
25
|
+
// Only attempt enrichment when the PSBT looks like a real bitcoinjs-lib Psbt.
|
|
26
|
+
const psbtAny = psbt;
|
|
27
|
+
const inputMetas = psbtAny?.data?.inputs;
|
|
28
|
+
const txInputs = psbtAny?.txInputs;
|
|
29
|
+
if (Array.isArray(inputMetas) &&
|
|
30
|
+
Array.isArray(txInputs) &&
|
|
31
|
+
txInputs.length > 0) {
|
|
32
|
+
// Fetch and add nonWitnessUtxo where Ledger still needs it.
|
|
33
|
+
const txFetchPromises = txInputs.map(async (_txInput, index) => {
|
|
34
|
+
try {
|
|
35
|
+
// Keep existing previous transactions, and finalized witness
|
|
36
|
+
// inputs that already carry the prevout data needed by Ledger.
|
|
37
|
+
const input = inputMetas[index];
|
|
38
|
+
if (input?.nonWitnessUtxo ||
|
|
39
|
+
(input?.witnessUtxo &&
|
|
40
|
+
(input.finalScriptSig || input.finalScriptWitness)))
|
|
41
|
+
return { index, success: true };
|
|
42
|
+
const tx = txInputs[index];
|
|
43
|
+
const prevTxId = Buffer.from(tx.hash).reverse().toString('hex');
|
|
44
|
+
// Fetch the raw transaction
|
|
45
|
+
const rawTxResponse = await getRawTransaction(blockbookUrl, prevTxId);
|
|
46
|
+
// Handle different response formats (string, object with 'hex', or object with 'result')
|
|
47
|
+
let rawTxHex;
|
|
48
|
+
if (typeof rawTxResponse === 'string') {
|
|
49
|
+
rawTxHex = rawTxResponse;
|
|
50
|
+
}
|
|
51
|
+
else if (rawTxResponse &&
|
|
52
|
+
typeof rawTxResponse === 'object' &&
|
|
53
|
+
'hex' in rawTxResponse) {
|
|
54
|
+
rawTxHex = rawTxResponse.hex;
|
|
55
|
+
}
|
|
56
|
+
else if (rawTxResponse &&
|
|
57
|
+
typeof rawTxResponse === 'object' &&
|
|
58
|
+
'result' in rawTxResponse) {
|
|
59
|
+
rawTxHex = rawTxResponse.result;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
throw new Error(`Unexpected response format: ${JSON.stringify(rawTxResponse)}`);
|
|
63
|
+
}
|
|
64
|
+
if (!rawTxHex || typeof rawTxHex !== 'string') {
|
|
65
|
+
throw new Error(`Invalid raw transaction hex received`);
|
|
66
|
+
}
|
|
67
|
+
// Convert hex to Buffer and add to PSBT
|
|
68
|
+
const nonWitnessUtxo = Buffer.from(rawTxHex, 'hex');
|
|
69
|
+
if (nonWitnessUtxo.length === 0) {
|
|
70
|
+
throw new Error('Converted buffer is empty');
|
|
71
|
+
}
|
|
72
|
+
psbt.updateInput(index, { nonWitnessUtxo });
|
|
73
|
+
return { index, success: true };
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`[Ledger] Failed to enrich input ${index}:`, error);
|
|
77
|
+
return { index, success: false, error };
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Wait for all inputs to be enriched
|
|
81
|
+
const results = await Promise.all(txFetchPromises);
|
|
82
|
+
const failedInputs = results.filter((r) => !r.success);
|
|
83
|
+
if (failedInputs.length > 0) {
|
|
84
|
+
throw new Error(`Failed to enrich ${failedInputs.length} of ${results.length} inputs with nonWitnessUtxo. ` +
|
|
85
|
+
`Ledger devices require this data for signing.`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
assertCurrent();
|
|
89
|
+
const enhancedPsbt = await ledger.convertToLedgerFormat(psbt, accountXpub, accountId, activeNetwork.currency, activeNetwork.slip44);
|
|
90
|
+
assertCurrent();
|
|
91
|
+
(0, psbt_account_scope_1.assertPsbtAccountScope)(enhancedPsbt, scope);
|
|
92
|
+
// Get wallet policy for Ledger
|
|
93
|
+
const fingerprint = await ledger.ledgerUtxoClient.getMasterFingerprint();
|
|
94
|
+
const hdPath = (0, derivation_paths_1.getAccountDerivationPath)(activeNetwork.currency, activeNetwork.slip44, accountId);
|
|
95
|
+
// For policy key preimages, match what the currently-open Ledger app expects.
|
|
96
|
+
// Prefer the device-reported extended pubkey for this path (silent), and only fall back
|
|
97
|
+
// to converting the stored xpub/vpub/zpub if needed.
|
|
98
|
+
let deviceXpub = null;
|
|
99
|
+
try {
|
|
100
|
+
deviceXpub = await ledger.ledgerUtxoClient.getExtendedPubkey(hdPath, false);
|
|
101
|
+
}
|
|
102
|
+
catch (_e) {
|
|
103
|
+
// ignore; we'll fall back
|
|
104
|
+
}
|
|
105
|
+
if (!deviceXpub) {
|
|
106
|
+
const devicePubMagicHex = activeNetwork.slip44 === 1 ? '043587cf' : '0488b21e';
|
|
107
|
+
deviceXpub = (0, derivation_paths_1.convertExtendedKeyVersion)(accountXpub, devicePubMagicHex);
|
|
108
|
+
}
|
|
109
|
+
const xpubWithDescriptor = `[${hdPath}]${deviceXpub}`.replace('m', fingerprint);
|
|
110
|
+
const walletPolicy = new policy_1.WalletPolicy(activeNetwork.currency.toLowerCase(), consts_1.DESCRIPTOR, [xpubWithDescriptor]);
|
|
111
|
+
// Register lazily and retrieve HMAC for silent operations thereafter
|
|
112
|
+
let hmac = null;
|
|
113
|
+
if (typeof ledger.getOrRegisterHmac === 'function') {
|
|
114
|
+
hmac = await ledger.getOrRegisterHmac(walletPolicy, fingerprint);
|
|
115
|
+
}
|
|
116
|
+
// Convert to PsbtV2 for direct signing without intermediate base64 encode/decode
|
|
117
|
+
const psbtV2 = new psbtv2_1.PsbtV2().fromBitcoinJS(enhancedPsbt);
|
|
118
|
+
assertCurrent();
|
|
119
|
+
(0, psbt_account_scope_1.assertPsbtAccountScope)(enhancedPsbt, scope);
|
|
120
|
+
const signatureEntries = await ledger.ledgerUtxoClient.signPsbt(psbtV2, walletPolicy, hmac);
|
|
121
|
+
assertCurrent();
|
|
122
|
+
signatureEntries.forEach(([inputIndex, partialSig]) => {
|
|
123
|
+
const input = enhancedPsbt.data.inputs[inputIndex];
|
|
124
|
+
if (!input ||
|
|
125
|
+
input.finalScriptSig ||
|
|
126
|
+
input.finalScriptWitness ||
|
|
127
|
+
!input.bip32Derivation?.some((derivation) => Buffer.from(derivation.pubkey).equals(Buffer.from(partialSig.pubkey)))) {
|
|
128
|
+
throw new Error('PSBT input is outside the approved account');
|
|
129
|
+
}
|
|
130
|
+
enhancedPsbt.updateInput(inputIndex, {
|
|
131
|
+
partialSig: [partialSig],
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
// Preserve external inputs that were finalized before device signing.
|
|
135
|
+
enhancedPsbt.data.inputs.forEach((input, index) => {
|
|
136
|
+
if (!input.finalScriptSig && !input.finalScriptWitness)
|
|
137
|
+
enhancedPsbt.finalizeInput(index);
|
|
138
|
+
});
|
|
139
|
+
return enhancedPsbt;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** Keep Trezor conversion and signing outside the software-only import graph. */
|
|
143
|
+
function createTrezorPsbtSigner(trezor) {
|
|
144
|
+
return async ({ psbt, network: activeNetwork, assertCurrent }) => {
|
|
145
|
+
if (typeof trezor?.convertToTrezorFormat !== 'function' ||
|
|
146
|
+
typeof trezor?.signUtxoTransaction !== 'function') {
|
|
147
|
+
throw (0, syscoin_core_1.createHardwareSignerUnavailableError)('Trezor');
|
|
148
|
+
}
|
|
149
|
+
// Handle Trezor signing for UTXO
|
|
150
|
+
// Get network configuration for Trezor
|
|
151
|
+
const networkConfig = (0, sysweb3_network_1.getNetworkConfig)(activeNetwork.slip44, activeNetwork.currency);
|
|
152
|
+
const isTestnet = activeNetwork.slip44 === 1;
|
|
153
|
+
const bitcoinjsNetwork = isTestnet
|
|
154
|
+
? networkConfig?.networks?.testnet
|
|
155
|
+
: networkConfig?.networks?.mainnet;
|
|
156
|
+
const trezorTx = trezor.convertToTrezorFormat({
|
|
157
|
+
psbt,
|
|
158
|
+
coin: activeNetwork.currency.toLowerCase(),
|
|
159
|
+
network: bitcoinjsNetwork || undefined, // Pass network config for isScriptHash check
|
|
160
|
+
});
|
|
161
|
+
assertCurrent();
|
|
162
|
+
const signedPsbt = await trezor.signUtxoTransaction(trezorTx, psbt);
|
|
163
|
+
assertCurrent();
|
|
164
|
+
return signedPsbt;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=hardware-psbt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hardware-psbt.js","sourceRoot":"","sources":["../../../src/transactions/hardware-psbt.ts"],"names":[],"mappings":"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"}
|