@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/cjs/keyring-core.js +2512 -0
  3. package/cjs/keyring-core.js.map +1 -0
  4. package/cjs/keyring-manager.js +23 -2437
  5. package/cjs/keyring-manager.js.map +1 -1
  6. package/cjs/software.js +58 -0
  7. package/cjs/software.js.map +1 -0
  8. package/cjs/storage-core.js +227 -0
  9. package/cjs/storage-core.js.map +1 -0
  10. package/cjs/storage.js +15 -210
  11. package/cjs/storage.js.map +1 -1
  12. package/cjs/transactions/ethereum.js +121 -29
  13. package/cjs/transactions/ethereum.js.map +1 -1
  14. package/cjs/transactions/evm-local-signer.js +11 -1
  15. package/cjs/transactions/evm-local-signer.js.map +1 -1
  16. package/cjs/transactions/hardware-psbt.js +167 -0
  17. package/cjs/transactions/hardware-psbt.js.map +1 -0
  18. package/cjs/transactions/syscoin-core.js +651 -0
  19. package/cjs/transactions/syscoin-core.js.map +1 -0
  20. package/cjs/transactions/syscoin.js +8 -768
  21. package/cjs/transactions/syscoin.js.map +1 -1
  22. package/cjs/types.js.map +1 -1
  23. package/package.json +38 -4
  24. package/types/keyring-core.d.ts +257 -0
  25. package/types/keyring-manager.d.ts +5 -223
  26. package/types/software.d.ts +23 -0
  27. package/types/storage-core.d.ts +22 -0
  28. package/types/storage.d.ts +1 -4
  29. package/types/transactions/ethereum.d.ts +16 -6
  30. package/types/transactions/evm-local-signer.d.ts +3 -1
  31. package/types/transactions/hardware-psbt.d.ts +7 -0
  32. package/types/transactions/syscoin-core.d.ts +92 -0
  33. package/types/transactions/syscoin.d.ts +8 -67
  34. package/types/types.d.ts +10 -0
  35. package/cjs/transactions/__tests__/integration.test.js +0 -237
  36. package/cjs/transactions/__tests__/integration.test.js.map +0 -1
  37. package/cjs/transactions/__tests__/syscoin.test.js +0 -361
  38. package/cjs/transactions/__tests__/syscoin.test.js.map +0 -1
  39. package/types/transactions/__tests__/integration.test.d.ts +0 -1
  40. 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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"}