@aibtc/mcp-server 1.5.0 → 1.6.0
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/dist/config/caip.d.ts +66 -0
- package/dist/config/caip.d.ts.map +1 -0
- package/dist/config/caip.js +84 -0
- package/dist/config/caip.js.map +1 -0
- package/dist/services/mempool-api.d.ts +183 -0
- package/dist/services/mempool-api.d.ts.map +1 -0
- package/dist/services/mempool-api.js +179 -0
- package/dist/services/mempool-api.js.map +1 -0
- package/dist/services/wallet-manager.d.ts.map +1 -1
- package/dist/services/wallet-manager.js +5 -3
- package/dist/services/wallet-manager.js.map +1 -1
- package/dist/tools/bitcoin.tools.d.ts +15 -0
- package/dist/tools/bitcoin.tools.d.ts.map +1 -0
- package/dist/tools/bitcoin.tools.js +295 -0
- package/dist/tools/bitcoin.tools.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/transactions/bitcoin-builder.d.ts +171 -0
- package/dist/transactions/bitcoin-builder.d.ts.map +1 -0
- package/dist/transactions/bitcoin-builder.js +242 -0
- package/dist/transactions/bitcoin-builder.js.map +1 -0
- package/dist/transactions/builder.d.ts +9 -0
- package/dist/transactions/builder.d.ts.map +1 -1
- package/dist/transactions/builder.js.map +1 -1
- package/dist/utils/bitcoin.d.ts +52 -0
- package/dist/utils/bitcoin.d.ts.map +1 -1
- package/dist/utils/bitcoin.js +69 -0
- package/dist/utils/bitcoin.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitcoin transaction building and signing
|
|
3
|
+
*
|
|
4
|
+
* Uses @scure/btc-signer for P2WPKH (native SegWit) transactions.
|
|
5
|
+
* Follows Leather/Xverse wallet patterns.
|
|
6
|
+
*/
|
|
7
|
+
import * as btc from "@scure/btc-signer";
|
|
8
|
+
/**
|
|
9
|
+
* P2WPKH transaction size constants (virtual bytes)
|
|
10
|
+
*
|
|
11
|
+
* Based on Bitcoin Core and @scure/btc-signer calculations:
|
|
12
|
+
* - P2WPKH input: ~68 vB (includes witness data at 1/4 weight)
|
|
13
|
+
* - P2WPKH output: ~31 vB
|
|
14
|
+
* - Base overhead: ~10.5 vB (version, locktime, witness marker/flag)
|
|
15
|
+
*/
|
|
16
|
+
const P2WPKH_INPUT_VBYTES = 68;
|
|
17
|
+
const P2WPKH_OUTPUT_VBYTES = 31;
|
|
18
|
+
const TX_OVERHEAD_VBYTES = 10.5;
|
|
19
|
+
/**
|
|
20
|
+
* Minimum output value (dust threshold)
|
|
21
|
+
* Below this value, outputs are non-standard and won't be relayed
|
|
22
|
+
*/
|
|
23
|
+
const DUST_THRESHOLD = 546;
|
|
24
|
+
/**
|
|
25
|
+
* Estimate the size of a P2WPKH transaction in virtual bytes
|
|
26
|
+
*
|
|
27
|
+
* Formula: overhead + (inputs * input_size) + (outputs * output_size)
|
|
28
|
+
*
|
|
29
|
+
* @param inputCount - Number of inputs
|
|
30
|
+
* @param outputCount - Number of outputs
|
|
31
|
+
* @returns Estimated size in virtual bytes
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // 1 input, 2 outputs (recipient + change)
|
|
36
|
+
* const vsize = estimateTxSize(1, 2);
|
|
37
|
+
* console.log(vsize); // ~140.5 vB
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function estimateTxSize(inputCount, outputCount) {
|
|
41
|
+
if (inputCount < 1) {
|
|
42
|
+
throw new Error("Transaction must have at least 1 input");
|
|
43
|
+
}
|
|
44
|
+
if (outputCount < 1) {
|
|
45
|
+
throw new Error("Transaction must have at least 1 output");
|
|
46
|
+
}
|
|
47
|
+
const inputsSize = inputCount * P2WPKH_INPUT_VBYTES;
|
|
48
|
+
const outputsSize = outputCount * P2WPKH_OUTPUT_VBYTES;
|
|
49
|
+
return TX_OVERHEAD_VBYTES + inputsSize + outputsSize;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the @scure/btc-signer network object for a network name
|
|
53
|
+
*/
|
|
54
|
+
function getBtcNetwork(network) {
|
|
55
|
+
return network === "testnet" ? btc.TEST_NETWORK : btc.NETWORK;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build an unsigned Bitcoin transaction
|
|
59
|
+
*
|
|
60
|
+
* Creates a P2WPKH transaction with:
|
|
61
|
+
* - Selected UTXOs as inputs
|
|
62
|
+
* - Recipient output
|
|
63
|
+
* - Change output (if above dust threshold)
|
|
64
|
+
*
|
|
65
|
+
* @param options - Transaction building options
|
|
66
|
+
* @returns Unsigned transaction and metadata
|
|
67
|
+
* @throws Error if insufficient funds or invalid parameters
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const result = buildBtcTransaction({
|
|
72
|
+
* utxos: [...],
|
|
73
|
+
* recipient: "bc1q...",
|
|
74
|
+
* amount: 50000,
|
|
75
|
+
* feeRate: 10,
|
|
76
|
+
* senderPubKey: pubKeyBytes,
|
|
77
|
+
* senderAddress: "bc1q...",
|
|
78
|
+
* network: "mainnet",
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export function buildBtcTransaction(options) {
|
|
83
|
+
const { utxos, recipient, amount, feeRate, senderPubKey, senderAddress, network } = options;
|
|
84
|
+
// Validate inputs
|
|
85
|
+
if (utxos.length === 0) {
|
|
86
|
+
throw new Error("No UTXOs provided");
|
|
87
|
+
}
|
|
88
|
+
if (amount <= 0) {
|
|
89
|
+
throw new Error("Amount must be positive");
|
|
90
|
+
}
|
|
91
|
+
if (amount < DUST_THRESHOLD) {
|
|
92
|
+
throw new Error(`Amount ${amount} is below dust threshold (${DUST_THRESHOLD} sats)`);
|
|
93
|
+
}
|
|
94
|
+
if (feeRate <= 0) {
|
|
95
|
+
throw new Error("Fee rate must be positive");
|
|
96
|
+
}
|
|
97
|
+
// Sort UTXOs by value descending for better coin selection
|
|
98
|
+
const sortedUtxos = [...utxos]
|
|
99
|
+
.filter((utxo) => utxo.status.confirmed) // Only use confirmed UTXOs
|
|
100
|
+
.sort((a, b) => b.value - a.value);
|
|
101
|
+
if (sortedUtxos.length === 0) {
|
|
102
|
+
throw new Error("No confirmed UTXOs available");
|
|
103
|
+
}
|
|
104
|
+
// Calculate total available
|
|
105
|
+
const totalAvailable = sortedUtxos.reduce((sum, utxo) => sum + utxo.value, 0);
|
|
106
|
+
// Estimate transaction size with change output
|
|
107
|
+
const estimatedVsize = estimateTxSize(sortedUtxos.length, 2);
|
|
108
|
+
const estimatedFee = Math.ceil(estimatedVsize * feeRate);
|
|
109
|
+
// Check if we have enough funds
|
|
110
|
+
const requiredTotal = amount + estimatedFee;
|
|
111
|
+
if (totalAvailable < requiredTotal) {
|
|
112
|
+
throw new Error(`Insufficient funds: have ${totalAvailable} sats, need ${requiredTotal} sats (${amount} + ${estimatedFee} fee)`);
|
|
113
|
+
}
|
|
114
|
+
// Select UTXOs using simple accumulator
|
|
115
|
+
let selectedTotal = 0;
|
|
116
|
+
const selectedUtxos = [];
|
|
117
|
+
for (const utxo of sortedUtxos) {
|
|
118
|
+
selectedUtxos.push(utxo);
|
|
119
|
+
selectedTotal += utxo.value;
|
|
120
|
+
// Check if we have enough (with potential change)
|
|
121
|
+
const vsizeWithChange = estimateTxSize(selectedUtxos.length, 2);
|
|
122
|
+
const feeWithChange = Math.ceil(vsizeWithChange * feeRate);
|
|
123
|
+
const neededWithChange = amount + feeWithChange;
|
|
124
|
+
if (selectedTotal >= neededWithChange) {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Final calculation
|
|
129
|
+
const finalVsizeWithChange = estimateTxSize(selectedUtxos.length, 2);
|
|
130
|
+
const finalFeeWithChange = Math.ceil(finalVsizeWithChange * feeRate);
|
|
131
|
+
const changeAmount = selectedTotal - amount - finalFeeWithChange;
|
|
132
|
+
// Determine if we should include a change output
|
|
133
|
+
const hasChange = changeAmount >= DUST_THRESHOLD;
|
|
134
|
+
const outputCount = hasChange ? 2 : 1;
|
|
135
|
+
// Recalculate fee if no change output
|
|
136
|
+
const finalVsize = estimateTxSize(selectedUtxos.length, outputCount);
|
|
137
|
+
const finalFee = hasChange
|
|
138
|
+
? finalFeeWithChange
|
|
139
|
+
: Math.ceil(finalVsize * feeRate);
|
|
140
|
+
const finalChange = hasChange ? changeAmount : 0;
|
|
141
|
+
// Verify we still have enough
|
|
142
|
+
if (selectedTotal < amount + finalFee) {
|
|
143
|
+
throw new Error(`Insufficient funds after UTXO selection: have ${selectedTotal} sats, need ${amount + finalFee} sats`);
|
|
144
|
+
}
|
|
145
|
+
// Build the transaction
|
|
146
|
+
const btcNetwork = getBtcNetwork(network);
|
|
147
|
+
const tx = new btc.Transaction();
|
|
148
|
+
// Create sender's P2WPKH script for inputs
|
|
149
|
+
const senderP2wpkh = btc.p2wpkh(senderPubKey, btcNetwork);
|
|
150
|
+
// Add inputs
|
|
151
|
+
for (const utxo of selectedUtxos) {
|
|
152
|
+
tx.addInput({
|
|
153
|
+
txid: utxo.txid,
|
|
154
|
+
index: utxo.vout,
|
|
155
|
+
witnessUtxo: {
|
|
156
|
+
script: senderP2wpkh.script,
|
|
157
|
+
amount: BigInt(utxo.value),
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// Add recipient output
|
|
162
|
+
tx.addOutputAddress(recipient, BigInt(amount), btcNetwork);
|
|
163
|
+
// Add change output if above dust
|
|
164
|
+
if (hasChange) {
|
|
165
|
+
tx.addOutputAddress(senderAddress, BigInt(finalChange), btcNetwork);
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
tx,
|
|
169
|
+
fee: finalFee,
|
|
170
|
+
change: finalChange,
|
|
171
|
+
vsize: finalVsize,
|
|
172
|
+
inputUtxos: selectedUtxos,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Sign a Bitcoin transaction with a private key
|
|
177
|
+
*
|
|
178
|
+
* Signs all inputs and finalizes the transaction for broadcast.
|
|
179
|
+
*
|
|
180
|
+
* SECURITY: The private key should be a Uint8Array from the wallet session.
|
|
181
|
+
* Never serialize the private key to WIF/hex.
|
|
182
|
+
*
|
|
183
|
+
* @param tx - Unsigned transaction from buildBtcTransaction
|
|
184
|
+
* @param privateKey - Private key as Uint8Array (32 bytes)
|
|
185
|
+
* @returns Signed transaction hex and metadata
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* const { tx } = buildBtcTransaction({...});
|
|
190
|
+
* const result = signBtcTransaction(tx, privateKeyBytes);
|
|
191
|
+
* console.log(result.txHex); // Ready for broadcast
|
|
192
|
+
* console.log(result.txid); // Transaction ID
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function signBtcTransaction(tx, privateKey) {
|
|
196
|
+
if (privateKey.length !== 32) {
|
|
197
|
+
throw new Error("Private key must be 32 bytes");
|
|
198
|
+
}
|
|
199
|
+
// Sign all inputs
|
|
200
|
+
tx.sign(privateKey);
|
|
201
|
+
// Finalize the transaction
|
|
202
|
+
tx.finalize();
|
|
203
|
+
// Get the signed transaction hex
|
|
204
|
+
const txHex = tx.hex;
|
|
205
|
+
// Get the transaction ID
|
|
206
|
+
const txid = tx.id;
|
|
207
|
+
// Get actual vsize from the finalized transaction
|
|
208
|
+
const vsize = tx.vsize;
|
|
209
|
+
return {
|
|
210
|
+
txHex,
|
|
211
|
+
txid,
|
|
212
|
+
vsize,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Build and sign a Bitcoin transaction in one step
|
|
217
|
+
*
|
|
218
|
+
* Convenience function that combines buildBtcTransaction and signBtcTransaction.
|
|
219
|
+
*
|
|
220
|
+
* @param options - Transaction building options
|
|
221
|
+
* @param privateKey - Private key as Uint8Array (32 bytes)
|
|
222
|
+
* @returns Signed transaction ready for broadcast
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```typescript
|
|
226
|
+
* const result = buildAndSignBtcTransaction(
|
|
227
|
+
* { utxos, recipient, amount, feeRate, senderPubKey, senderAddress, network },
|
|
228
|
+
* privateKey
|
|
229
|
+
* );
|
|
230
|
+
* // Broadcast result.txHex
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function buildAndSignBtcTransaction(options, privateKey) {
|
|
234
|
+
const buildResult = buildBtcTransaction(options);
|
|
235
|
+
const signResult = signBtcTransaction(buildResult.tx, privateKey);
|
|
236
|
+
return {
|
|
237
|
+
...signResult,
|
|
238
|
+
fee: buildResult.fee,
|
|
239
|
+
change: buildResult.change,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=bitcoin-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitcoin-builder.js","sourceRoot":"","sources":["../../src/transactions/bitcoin-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,15 @@ export interface Account {
|
|
|
4
4
|
address: string;
|
|
5
5
|
btcAddress?: string;
|
|
6
6
|
privateKey: string;
|
|
7
|
+
/**
|
|
8
|
+
* Bitcoin private key as raw bytes (32 bytes) for signing BTC transactions.
|
|
9
|
+
* SECURITY: Never serialize to WIF/hex. Only held in memory during session.
|
|
10
|
+
*/
|
|
11
|
+
btcPrivateKey?: Uint8Array;
|
|
12
|
+
/**
|
|
13
|
+
* Bitcoin public key as raw bytes (33 bytes compressed) for building transactions.
|
|
14
|
+
*/
|
|
15
|
+
btcPublicKey?: Uint8Array;
|
|
7
16
|
network: Network;
|
|
8
17
|
}
|
|
9
18
|
export interface TransferResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/transactions/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEtF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CA6BzB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAe7C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB7C;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3B"}
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/transactions/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEtF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CA6BzB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAe7C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB7C;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/transactions/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EAEpB,iBAAiB,GAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/transactions/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/bitcoin.d.ts
CHANGED
|
@@ -12,6 +12,28 @@ export interface BitcoinAddress {
|
|
|
12
12
|
*/
|
|
13
13
|
publicKey: string;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Bitcoin key pair derivation result (includes private key for signing)
|
|
17
|
+
*
|
|
18
|
+
* SECURITY: This interface exposes the private key as Uint8Array.
|
|
19
|
+
* The private key should:
|
|
20
|
+
* - NEVER be serialized to WIF or hex string
|
|
21
|
+
* - NEVER be logged or stored persistently
|
|
22
|
+
* - Only be held in memory during signing operations
|
|
23
|
+
* - Be cleared after use (session lock)
|
|
24
|
+
*/
|
|
25
|
+
export interface BitcoinKeyPair extends BitcoinAddress {
|
|
26
|
+
/**
|
|
27
|
+
* Private key as raw bytes (32 bytes)
|
|
28
|
+
* SECURITY: Never serialize to WIF/hex. Use only for signing.
|
|
29
|
+
*/
|
|
30
|
+
privateKey: Uint8Array;
|
|
31
|
+
/**
|
|
32
|
+
* Public key as raw bytes (33 bytes compressed)
|
|
33
|
+
* Used for building P2WPKH transactions.
|
|
34
|
+
*/
|
|
35
|
+
publicKeyBytes: Uint8Array;
|
|
36
|
+
}
|
|
15
37
|
/**
|
|
16
38
|
* Derive Bitcoin L1 native SegWit address from BIP39 mnemonic
|
|
17
39
|
*
|
|
@@ -37,4 +59,34 @@ export interface BitcoinAddress {
|
|
|
37
59
|
* ```
|
|
38
60
|
*/
|
|
39
61
|
export declare function deriveBitcoinAddress(mnemonic: string, network: Network): BitcoinAddress;
|
|
62
|
+
/**
|
|
63
|
+
* Derive Bitcoin L1 key pair from BIP39 mnemonic (includes private key for signing)
|
|
64
|
+
*
|
|
65
|
+
* Follows BIP84 derivation path:
|
|
66
|
+
* - Mainnet: m/84'/0'/0'/0/0 (coin type 0)
|
|
67
|
+
* - Testnet: m/84'/1'/0'/0/0 (coin type 1)
|
|
68
|
+
*
|
|
69
|
+
* Returns native SegWit (P2WPKH) address and key pair:
|
|
70
|
+
* - Mainnet: bc1q... prefix
|
|
71
|
+
* - Testnet: tb1q... prefix
|
|
72
|
+
*
|
|
73
|
+
* SECURITY WARNING: This function returns the private key as Uint8Array.
|
|
74
|
+
* - NEVER serialize the private key to WIF or hex string
|
|
75
|
+
* - NEVER log or store the private key persistently
|
|
76
|
+
* - Only hold in memory during signing operations
|
|
77
|
+
* - Clear from memory when wallet is locked
|
|
78
|
+
*
|
|
79
|
+
* @param mnemonic - BIP39 mnemonic phrase (12 or 24 words)
|
|
80
|
+
* @param network - Network to derive keys for ('mainnet' | 'testnet')
|
|
81
|
+
* @returns Bitcoin address, public key, and private key (Uint8Array)
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const { address, publicKey, privateKey } = deriveBitcoinKeyPair(mnemonic, 'mainnet');
|
|
86
|
+
* console.log(address); // bc1q...
|
|
87
|
+
* console.log(publicKey); // 02... or 03... (33 bytes compressed)
|
|
88
|
+
* // privateKey is Uint8Array(32) - use for signing, never serialize
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function deriveBitcoinKeyPair(mnemonic: string, network: Network): BitcoinKeyPair;
|
|
40
92
|
//# sourceMappingURL=bitcoin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../src/utils/bitcoin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,cAAc,CAmDhB"}
|
|
1
|
+
{"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../src/utils/bitcoin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD;;;OAGG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;;OAGG;IACH,cAAc,EAAE,UAAU,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,cAAc,CAmDhB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,cAAc,CAiDhB"}
|
package/dist/utils/bitcoin.js
CHANGED
|
@@ -69,4 +69,73 @@ export function deriveBitcoinAddress(mnemonic, network) {
|
|
|
69
69
|
publicKey,
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Derive Bitcoin L1 key pair from BIP39 mnemonic (includes private key for signing)
|
|
74
|
+
*
|
|
75
|
+
* Follows BIP84 derivation path:
|
|
76
|
+
* - Mainnet: m/84'/0'/0'/0/0 (coin type 0)
|
|
77
|
+
* - Testnet: m/84'/1'/0'/0/0 (coin type 1)
|
|
78
|
+
*
|
|
79
|
+
* Returns native SegWit (P2WPKH) address and key pair:
|
|
80
|
+
* - Mainnet: bc1q... prefix
|
|
81
|
+
* - Testnet: tb1q... prefix
|
|
82
|
+
*
|
|
83
|
+
* SECURITY WARNING: This function returns the private key as Uint8Array.
|
|
84
|
+
* - NEVER serialize the private key to WIF or hex string
|
|
85
|
+
* - NEVER log or store the private key persistently
|
|
86
|
+
* - Only hold in memory during signing operations
|
|
87
|
+
* - Clear from memory when wallet is locked
|
|
88
|
+
*
|
|
89
|
+
* @param mnemonic - BIP39 mnemonic phrase (12 or 24 words)
|
|
90
|
+
* @param network - Network to derive keys for ('mainnet' | 'testnet')
|
|
91
|
+
* @returns Bitcoin address, public key, and private key (Uint8Array)
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const { address, publicKey, privateKey } = deriveBitcoinKeyPair(mnemonic, 'mainnet');
|
|
96
|
+
* console.log(address); // bc1q...
|
|
97
|
+
* console.log(publicKey); // 02... or 03... (33 bytes compressed)
|
|
98
|
+
* // privateKey is Uint8Array(32) - use for signing, never serialize
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export function deriveBitcoinKeyPair(mnemonic, network) {
|
|
102
|
+
// Convert mnemonic to seed
|
|
103
|
+
const seed = mnemonicToSeedSync(mnemonic);
|
|
104
|
+
// Create master key from seed
|
|
105
|
+
const masterKey = HDKey.fromMasterSeed(seed);
|
|
106
|
+
// BIP84 derivation path
|
|
107
|
+
// m / purpose' / coin_type' / account' / change / address_index
|
|
108
|
+
// Purpose: 84 (native SegWit)
|
|
109
|
+
// Coin type: 0 (Bitcoin mainnet) or 1 (Bitcoin testnet)
|
|
110
|
+
// Account: 0 (first account)
|
|
111
|
+
// Change: 0 (external/receiving addresses)
|
|
112
|
+
// Address index: 0 (first address)
|
|
113
|
+
const coinType = network === "mainnet" ? 0 : 1;
|
|
114
|
+
const derivationPath = `m/84'/${coinType}'/0'/0/0`;
|
|
115
|
+
// Derive key at path
|
|
116
|
+
const derivedKey = masterKey.derive(derivationPath);
|
|
117
|
+
if (!derivedKey.publicKey) {
|
|
118
|
+
throw new Error("Failed to derive public key");
|
|
119
|
+
}
|
|
120
|
+
if (!derivedKey.privateKey) {
|
|
121
|
+
throw new Error("Failed to derive private key");
|
|
122
|
+
}
|
|
123
|
+
// Get compressed public key as hex string and bytes
|
|
124
|
+
const publicKeyBytes = new Uint8Array(derivedKey.publicKey);
|
|
125
|
+
const publicKey = Buffer.from(derivedKey.publicKey).toString("hex");
|
|
126
|
+
// Get private key as Uint8Array (never convert to WIF/hex)
|
|
127
|
+
const privateKey = new Uint8Array(derivedKey.privateKey);
|
|
128
|
+
// Create native SegWit (P2WPKH) address
|
|
129
|
+
const btcNetwork = network === "testnet" ? btc.TEST_NETWORK : btc.NETWORK;
|
|
130
|
+
const p2wpkh = btc.p2wpkh(derivedKey.publicKey, btcNetwork);
|
|
131
|
+
if (!p2wpkh.address) {
|
|
132
|
+
throw new Error("Failed to generate address");
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
address: p2wpkh.address,
|
|
136
|
+
publicKey,
|
|
137
|
+
privateKey,
|
|
138
|
+
publicKeyBytes,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
72
141
|
//# sourceMappingURL=bitcoin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../src/utils/bitcoin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../src/utils/bitcoin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED