@did-btcr2/bitcoin 0.1.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/LICENSE +373 -0
- package/README.md +3 -0
- package/dist/cjs/bitcoin.browser.js +82 -0
- package/dist/cjs/bitcoin.browser.js.map +1 -0
- package/dist/cjs/bitcoin.node.js +85 -0
- package/dist/cjs/bitcoin.node.js.map +1 -0
- package/dist/cjs/constants.js +20 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.js +14 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.browser.js +10 -0
- package/dist/cjs/index.browser.js.map +1 -0
- package/dist/cjs/index.node.js +10 -0
- package/dist/cjs/index.node.js.map +1 -0
- package/dist/cjs/interface.js +2 -0
- package/dist/cjs/interface.js.map +1 -0
- package/dist/cjs/network.js +17 -0
- package/dist/cjs/network.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/rest-client.js +294 -0
- package/dist/cjs/rest-client.js.map +1 -0
- package/dist/cjs/rpc-client.js +722 -0
- package/dist/cjs/rpc-client.js.map +1 -0
- package/dist/cjs/taproot.js +219 -0
- package/dist/cjs/taproot.js.map +1 -0
- package/dist/cjs/types.js +62 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/bitcoin.browser.js +82 -0
- package/dist/esm/bitcoin.browser.js.map +1 -0
- package/dist/esm/bitcoin.node.js +85 -0
- package/dist/esm/bitcoin.node.js.map +1 -0
- package/dist/esm/constants.js +20 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/errors.js +14 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.browser.js +10 -0
- package/dist/esm/index.browser.js.map +1 -0
- package/dist/esm/index.node.js +10 -0
- package/dist/esm/index.node.js.map +1 -0
- package/dist/esm/interface.js +2 -0
- package/dist/esm/interface.js.map +1 -0
- package/dist/esm/network.js +17 -0
- package/dist/esm/network.js.map +1 -0
- package/dist/esm/rest-client.js +294 -0
- package/dist/esm/rest-client.js.map +1 -0
- package/dist/esm/rpc-client.js +722 -0
- package/dist/esm/rpc-client.js.map +1 -0
- package/dist/esm/taproot.js +219 -0
- package/dist/esm/taproot.js.map +1 -0
- package/dist/esm/types.js +62 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/bitcoin.browser.d.ts +45 -0
- package/dist/types/bitcoin.browser.d.ts.map +1 -0
- package/dist/types/bitcoin.node.d.ts +47 -0
- package/dist/types/bitcoin.node.d.ts.map +1 -0
- package/dist/types/constants.d.ts +19 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.browser.d.ts +9 -0
- package/dist/types/index.browser.d.ts.map +1 -0
- package/dist/types/index.node.d.ts +9 -0
- package/dist/types/index.node.d.ts.map +1 -0
- package/dist/types/interface.d.ts +86 -0
- package/dist/types/interface.d.ts.map +1 -0
- package/dist/types/network.d.ts +2 -0
- package/dist/types/network.d.ts.map +1 -0
- package/dist/types/rest-client.d.ts +273 -0
- package/dist/types/rest-client.d.ts.map +1 -0
- package/dist/types/rpc-client.d.ts +506 -0
- package/dist/types/rpc-client.d.ts.map +1 -0
- package/dist/types/taproot.d.ts +34 -0
- package/dist/types/taproot.d.ts.map +1 -0
- package/dist/types/types.d.ts +841 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +118 -0
- package/src/bitcoin.browser.ts +117 -0
- package/src/bitcoin.node.ts +121 -0
- package/src/constants.ts +19 -0
- package/src/errors.ts +13 -0
- package/src/index.browser.ts +9 -0
- package/src/index.node.ts +9 -0
- package/src/interface.ts +160 -0
- package/src/network.ts +17 -0
- package/src/rest-client.ts +420 -0
- package/src/rpc-client.ts +888 -0
- package/src/taproot.ts +237 -0
- package/src/types.ts +1041 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/rpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import * as tinysecp from 'tiny-secp256k1';
|
|
2
|
+
import { payments, script, opcodes } from 'bitcoinjs-lib';
|
|
3
|
+
import { PublicKey } from '@did-btcr2/keypair';
|
|
4
|
+
/**
|
|
5
|
+
* Aggregate an array of public keys by point addition
|
|
6
|
+
*/
|
|
7
|
+
function aggregatePubkeys(pubkeys) {
|
|
8
|
+
if (pubkeys.length === 1)
|
|
9
|
+
return pubkeys[0];
|
|
10
|
+
return pubkeys.reduce((sum, pk) => {
|
|
11
|
+
const added = tinysecp.pointAdd(sum, pk);
|
|
12
|
+
if (!added)
|
|
13
|
+
throw new Error('Point addition failed');
|
|
14
|
+
return added;
|
|
15
|
+
}, pubkeys[0]);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build a P2TR script leaf for a k-of-n multisig with optional locktime/sequence
|
|
19
|
+
*/
|
|
20
|
+
function buildTapLeafScript(pubkeys, k, locktime, sequence) {
|
|
21
|
+
const ops = [];
|
|
22
|
+
// absolute timelock
|
|
23
|
+
if (locktime !== undefined) {
|
|
24
|
+
ops.push(script.number.encode(locktime));
|
|
25
|
+
ops.push(opcodes.OP_CHECKLOCKTIMEVERIFY);
|
|
26
|
+
ops.push(opcodes.OP_DROP);
|
|
27
|
+
}
|
|
28
|
+
// relative timelock
|
|
29
|
+
if (sequence !== undefined) {
|
|
30
|
+
ops.push(script.number.encode(sequence));
|
|
31
|
+
ops.push(opcodes.OP_CHECKSEQUENCEVERIFY);
|
|
32
|
+
ops.push(opcodes.OP_DROP);
|
|
33
|
+
}
|
|
34
|
+
// push each key as x-only pubkey
|
|
35
|
+
for (const pk of pubkeys) {
|
|
36
|
+
const [xOnly] = PublicKey.xOnly(pk);
|
|
37
|
+
ops.push(xOnly);
|
|
38
|
+
}
|
|
39
|
+
// push threshold k and total keys n
|
|
40
|
+
ops.push(script.number.encode(k));
|
|
41
|
+
ops.push(script.number.encode(pubkeys.length));
|
|
42
|
+
ops.push(opcodes.OP_CHECKMULTISIG);
|
|
43
|
+
return script.compile(ops);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build a P2TR script leaf for a aggregated MuSig key (key-path only)
|
|
47
|
+
*/
|
|
48
|
+
function buildMusigLeafScript(pubkeys) {
|
|
49
|
+
const agg = aggregatePubkeys(pubkeys);
|
|
50
|
+
const [xOnly] = PublicKey.xOnly(agg);
|
|
51
|
+
// In a taproot script path, OP_CHECKSIG runs schnorr
|
|
52
|
+
return script.compile([xOnly, opcodes.OP_CHECKSIG]);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Recursively combine an array of leaves into a balanced Merkle tree structure
|
|
56
|
+
*/
|
|
57
|
+
function buildMerkleTree(nodes) {
|
|
58
|
+
if (nodes.length === 1)
|
|
59
|
+
return { output: nodes[0] };
|
|
60
|
+
const next = [];
|
|
61
|
+
for (let i = 0; i < nodes.length; i += 2) {
|
|
62
|
+
if (i + 1 === nodes.length) {
|
|
63
|
+
next.push({ output: nodes[i] });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
next.push([
|
|
67
|
+
{ output: nodes[i] },
|
|
68
|
+
{ output: nodes[i + 1] },
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return buildMerkleTree(next);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate combinations of length k from an array
|
|
76
|
+
*/
|
|
77
|
+
function* combinations(array, k) {
|
|
78
|
+
const n = array.length;
|
|
79
|
+
if (k > n || k < 0)
|
|
80
|
+
return;
|
|
81
|
+
const indices = Array.from({ length: k }, (_, i) => i);
|
|
82
|
+
while (true) {
|
|
83
|
+
yield indices.map(i => array[i]);
|
|
84
|
+
let i = k - 1;
|
|
85
|
+
while (i >= 0 && indices[i] === i + n - k) {
|
|
86
|
+
i--;
|
|
87
|
+
}
|
|
88
|
+
if (i < 0)
|
|
89
|
+
break;
|
|
90
|
+
indices[i]++;
|
|
91
|
+
for (let j = i + 1; j < k; j++) {
|
|
92
|
+
indices[j] = indices[j - 1] + 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* TapRootMultiSig: builds Taproot outputs and trees for multisig and MuSig branches
|
|
98
|
+
*/
|
|
99
|
+
export class TapRootMultiSig {
|
|
100
|
+
points;
|
|
101
|
+
k;
|
|
102
|
+
defaultInternalPubkey;
|
|
103
|
+
constructor(points, k) {
|
|
104
|
+
if (points.length < k || k < 1) {
|
|
105
|
+
throw new Error(`${k} is invalid for ${points.length} keys`);
|
|
106
|
+
}
|
|
107
|
+
this.points = points;
|
|
108
|
+
this.k = k;
|
|
109
|
+
// MuSig aggregation for default internal key
|
|
110
|
+
this.defaultInternalPubkey = aggregatePubkeys(points);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Single multisig leaf as the only script path
|
|
114
|
+
*/
|
|
115
|
+
singleLeaf(locktime, sequence) {
|
|
116
|
+
const leaf = buildTapLeafScript(this.points, this.k, locktime, sequence);
|
|
117
|
+
return payments.p2tr({
|
|
118
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
119
|
+
scriptTree: { output: leaf },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* All k-of-n multisig combinations as separate leaf scripts, combined into one tree
|
|
124
|
+
*/
|
|
125
|
+
multiLeafTree(locktime, sequence) {
|
|
126
|
+
const leaves = [];
|
|
127
|
+
for (const combo of combinations(this.points, this.k)) {
|
|
128
|
+
leaves.push(buildTapLeafScript(combo, this.k, locktime, sequence));
|
|
129
|
+
}
|
|
130
|
+
const tree = buildMerkleTree(leaves);
|
|
131
|
+
return payments.p2tr({
|
|
132
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
133
|
+
scriptTree: tree,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* MuSig key-path scripts for each k-of-n combination in the script tree
|
|
138
|
+
*/
|
|
139
|
+
musigTree() {
|
|
140
|
+
const leaves = [];
|
|
141
|
+
for (const combo of combinations(this.points, this.k)) {
|
|
142
|
+
leaves.push(buildMusigLeafScript(combo));
|
|
143
|
+
}
|
|
144
|
+
const tree = buildMerkleTree(leaves);
|
|
145
|
+
return payments.p2tr({
|
|
146
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
147
|
+
scriptTree: tree,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A two-branch tree: one branch is the singleLeaf script, the other is the muSig tree
|
|
152
|
+
*/
|
|
153
|
+
musigAndSingleLeafTree(locktime, sequence) {
|
|
154
|
+
const single = buildTapLeafScript(this.points, this.k, locktime, sequence);
|
|
155
|
+
const musigLeaves = [];
|
|
156
|
+
for (const combo of combinations(this.points, this.k)) {
|
|
157
|
+
musigLeaves.push(buildMusigLeafScript(combo));
|
|
158
|
+
}
|
|
159
|
+
const tree = {
|
|
160
|
+
output: single,
|
|
161
|
+
scriptTree: buildMerkleTree(musigLeaves),
|
|
162
|
+
};
|
|
163
|
+
return payments.p2tr({
|
|
164
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
165
|
+
scriptTree: tree,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Nested tree of singleLeaf, multiLeafTree, and musigTree
|
|
170
|
+
*/
|
|
171
|
+
everythingTree(locktime, sequence) {
|
|
172
|
+
const single = buildTapLeafScript(this.points, this.k, locktime, sequence);
|
|
173
|
+
const multiLeaves = [];
|
|
174
|
+
for (const combo of combinations(this.points, this.k)) {
|
|
175
|
+
multiLeaves.push(buildTapLeafScript(combo, this.k, locktime, sequence));
|
|
176
|
+
}
|
|
177
|
+
const multiTree = buildMerkleTree(multiLeaves);
|
|
178
|
+
const musigLeaves = [];
|
|
179
|
+
for (const combo of combinations(this.points, this.k)) {
|
|
180
|
+
musigLeaves.push(buildMusigLeafScript(combo));
|
|
181
|
+
}
|
|
182
|
+
const musigTree = buildMerkleTree(musigLeaves);
|
|
183
|
+
const tree = {
|
|
184
|
+
output: single,
|
|
185
|
+
scriptTree: [multiTree, musigTree],
|
|
186
|
+
};
|
|
187
|
+
return payments.p2tr({
|
|
188
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
189
|
+
scriptTree: tree,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Degrading multisig: k-of-n initially, then (k-1)-of-n after delay, ... until 1-of-n
|
|
194
|
+
*/
|
|
195
|
+
degradingMultisigTree(sequenceBlockInterval, sequenceTimeInterval) {
|
|
196
|
+
const leaves = [];
|
|
197
|
+
for (let num = this.k; num >= 1; num--) {
|
|
198
|
+
let seq;
|
|
199
|
+
if (num === this.k) {
|
|
200
|
+
seq = undefined;
|
|
201
|
+
}
|
|
202
|
+
else if (sequenceBlockInterval != null) {
|
|
203
|
+
seq = sequenceBlockInterval * (this.k - num);
|
|
204
|
+
}
|
|
205
|
+
else if (sequenceTimeInterval != null) {
|
|
206
|
+
seq = sequenceTimeInterval * (this.k - num);
|
|
207
|
+
}
|
|
208
|
+
for (const combo of combinations(this.points, num)) {
|
|
209
|
+
leaves.push(buildTapLeafScript(combo, num, undefined, seq));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const tree = buildMerkleTree(leaves);
|
|
213
|
+
return payments.p2tr({
|
|
214
|
+
internalPubkey: this.defaultInternalPubkey,
|
|
215
|
+
scriptTree: tree,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=taproot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taproot.js","sourceRoot":"","sources":["../../src/taproot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class RpcClientConfig {
|
|
2
|
+
network;
|
|
3
|
+
headers;
|
|
4
|
+
host;
|
|
5
|
+
logger;
|
|
6
|
+
password;
|
|
7
|
+
timeout;
|
|
8
|
+
username;
|
|
9
|
+
version;
|
|
10
|
+
wallet;
|
|
11
|
+
allowDefaultWallet;
|
|
12
|
+
constructor(options = {
|
|
13
|
+
headers: {},
|
|
14
|
+
host: 'localhost',
|
|
15
|
+
logger: console,
|
|
16
|
+
password: '',
|
|
17
|
+
timeout: 30000,
|
|
18
|
+
username: '',
|
|
19
|
+
version: '0.21.1',
|
|
20
|
+
wallet: '',
|
|
21
|
+
allowDefaultWallet: false,
|
|
22
|
+
}) {
|
|
23
|
+
this.headers = options.headers;
|
|
24
|
+
this.host = options.host;
|
|
25
|
+
this.logger = options.logger;
|
|
26
|
+
this.password = options.password;
|
|
27
|
+
this.timeout = options.timeout;
|
|
28
|
+
this.username = options.username;
|
|
29
|
+
this.version = options.version;
|
|
30
|
+
this.wallet = options.wallet;
|
|
31
|
+
this.allowDefaultWallet = options.allowDefaultWallet;
|
|
32
|
+
}
|
|
33
|
+
static initialize(options) {
|
|
34
|
+
return new RpcClientConfig(options);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
;
|
|
38
|
+
;
|
|
39
|
+
/**
|
|
40
|
+
* Defines verbosity levels for block and transaction outputs.
|
|
41
|
+
* Used to specify the format of returned block or transaction data.
|
|
42
|
+
* @enum {number} VerbosityLevel for block and transaction outputs.
|
|
43
|
+
*/
|
|
44
|
+
export var VerbosityLevel;
|
|
45
|
+
(function (VerbosityLevel) {
|
|
46
|
+
/** Return block or transaction data in raw hex-encoded format */
|
|
47
|
+
VerbosityLevel[VerbosityLevel["hex"] = 0] = "hex";
|
|
48
|
+
/** Return block or transaction data in JSON object format */
|
|
49
|
+
VerbosityLevel[VerbosityLevel["json"] = 1] = "json";
|
|
50
|
+
/**
|
|
51
|
+
* Return block or transaction data in JSON object format with additional information.
|
|
52
|
+
* Returns block data with information about each transaction.
|
|
53
|
+
* Returns transaction data with information about the transaction including fee and prevout information.
|
|
54
|
+
*/
|
|
55
|
+
VerbosityLevel[VerbosityLevel["jsonext"] = 2] = "jsonext";
|
|
56
|
+
/**
|
|
57
|
+
* Return block data in JSON object format with additional information.
|
|
58
|
+
* Returns block data with information about each transaction, including prevout information for inputs.
|
|
59
|
+
*/
|
|
60
|
+
VerbosityLevel[VerbosityLevel["jsonextprev"] = 3] = "jsonextprev";
|
|
61
|
+
})(VerbosityLevel || (VerbosityLevel = {}));
|
|
62
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA6CA,MAAM,OAAO,eAAe;IAC1B,OAAO,CAAU;IACjB,OAAO,CAA0B;IACjC,IAAI,CAAU;IACd,MAAM,CAAO;IACb,QAAQ,CAAU;IAClB,OAAO,CAAU;IACjB,QAAQ,CAAU;IAClB,OAAO,CAAU;IACjB,MAAM,CAAU;IAChB,kBAAkB,CAAW;IAE7B,YAAY,UAAyB;QACnC,OAAO,EAAc,EAAE;QACvB,IAAI,EAAiB,WAAW;QAChC,MAAM,EAAe,OAAO;QAC5B,QAAQ,EAAa,EAAE;QACvB,OAAO,EAAc,KAAK;QAC1B,QAAQ,EAAa,EAAE;QACvB,OAAO,EAAc,QAAQ;QAC7B,MAAM,EAAe,EAAE;QACvB,kBAAkB,EAAG,KAAK;KAC3B;QACC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACvD,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,OAAuB;QAC9C,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;CACF;AAiZA,CAAC;AAKD,CAAC;AA2gBF;;;;GAIG;AACH,MAAM,CAAN,IAAY,cAgBX;AAhBD,WAAY,cAAc;IACtB,iEAAiE;IACjE,iDAAO,CAAA;IACP,6DAA6D;IAC7D,mDAAQ,CAAA;IACR;;;;OAIG;IACH,yDAAW,CAAA;IACX;;;OAGG;IACH,iEAAe,CAAA;AACnB,CAAC,EAhBW,cAAc,KAAd,cAAc,QAgBzB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { MethodError } from '@did-btcr2/common';
|
|
2
|
+
import { DEFAULT_REST_CLIENT_CONFIG } from './constants.js';
|
|
3
|
+
import { getNetwork } from './network.js';
|
|
4
|
+
import { BitcoinRest } from './rest-client.js';
|
|
5
|
+
/**
|
|
6
|
+
* General class to house the Bitcoin client connections, client config and various utility methods.
|
|
7
|
+
* @name Bitcoin
|
|
8
|
+
* @type {Bitcoin}
|
|
9
|
+
*/
|
|
10
|
+
export class Bitcoin {
|
|
11
|
+
network;
|
|
12
|
+
mainnet;
|
|
13
|
+
testnet;
|
|
14
|
+
signet;
|
|
15
|
+
mutinynet;
|
|
16
|
+
regtest;
|
|
17
|
+
/**
|
|
18
|
+
* Creates an instance of the Bitcoin class.
|
|
19
|
+
* @param {BitcoinNetworkConfigMap} configs Optional configuration object for the Bitcoin client. If not provided, it will
|
|
20
|
+
* be loaded from the BITCOIN_CLIENT_CONFIG environment variables.
|
|
21
|
+
* @throws {MethodError} If no configs is passed and BITCOIN_NETWORK_CONFIG is missing or invalid.
|
|
22
|
+
*/
|
|
23
|
+
constructor(configs) {
|
|
24
|
+
const BITCOIN_NETWORK_CONFIG = process.env.BITCOIN_NETWORK_CONFIG ?? JSON.stringify(configs ?? {
|
|
25
|
+
regtest: {
|
|
26
|
+
rest: DEFAULT_REST_CLIENT_CONFIG
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
if (!BITCOIN_NETWORK_CONFIG) {
|
|
30
|
+
throw new MethodError('No BITCOIN_NETWORK_CONFIG available: must pass `configs` to constructor or set `BITCOIN_NETWORK_CONFIG` in env', 'MISSING_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
31
|
+
}
|
|
32
|
+
// Check if BITCOIN_NETWORK_CONFIG is parsable JSON string
|
|
33
|
+
if (!JSON.parsable(BITCOIN_NETWORK_CONFIG)) {
|
|
34
|
+
throw new MethodError('Parsing failed: malformed BITCOIN_NETWORK_CONFIG', 'MISSING_MALFORMED_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
35
|
+
}
|
|
36
|
+
// Parse the BITCOIN_NETWORK_CONFIG
|
|
37
|
+
const networkConfigs = JSON.parse(BITCOIN_NETWORK_CONFIG);
|
|
38
|
+
// Set a list of available networks
|
|
39
|
+
const networks = ['mainnet', 'testnet', 'signet', 'mutinynet', 'regtest'];
|
|
40
|
+
// Iterate over the networks and create the client connections
|
|
41
|
+
for (const network of networks) {
|
|
42
|
+
const networkConfig = (configs?.[network] ?? networkConfigs[network]);
|
|
43
|
+
if (networkConfig) {
|
|
44
|
+
this[network] = {
|
|
45
|
+
name: network,
|
|
46
|
+
config: networkConfig,
|
|
47
|
+
rest: new BitcoinRest(networkConfig.rest ?? DEFAULT_REST_CLIENT_CONFIG),
|
|
48
|
+
data: getNetwork(network),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Load and check the ACTIVE_NETWORK variable
|
|
53
|
+
const ACTIVE_NETWORK = (process.env.ACTIVE_NETWORK?.toLowerCase() ?? 'regtest');
|
|
54
|
+
if (!ACTIVE_NETWORK) {
|
|
55
|
+
throw new MethodError('Missing ACTIVE_NETWORK environment variable', 'MISSING_ACTIVE_NETWORK', { ACTIVE_NETWORK });
|
|
56
|
+
}
|
|
57
|
+
if (!this[ACTIVE_NETWORK]) {
|
|
58
|
+
throw new MethodError(`No configuration found for ACTIVE_NETWORK='${ACTIVE_NETWORK}'`, 'MISSING_CONFIG_FOR_NETWORK');
|
|
59
|
+
}
|
|
60
|
+
this.network = this[ACTIVE_NETWORK];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Converts Bitcoin (BTC) to satoshis (SAT).
|
|
64
|
+
* @param {number} btc - The amount in BTC.
|
|
65
|
+
* @returns {number} The amount in SAT.
|
|
66
|
+
*/
|
|
67
|
+
static btcToSats(btc) {
|
|
68
|
+
return Math.round(btc * 1e8);
|
|
69
|
+
}
|
|
70
|
+
;
|
|
71
|
+
/**
|
|
72
|
+
* Converts satoshis (SAT) to Bitcoin (BTC).
|
|
73
|
+
* @param {number} sats - The amount in SAT.
|
|
74
|
+
* @returns {number} The amount in BTC.
|
|
75
|
+
*/
|
|
76
|
+
static satsToBtc(sats) {
|
|
77
|
+
return sats / 1e8;
|
|
78
|
+
}
|
|
79
|
+
;
|
|
80
|
+
}
|
|
81
|
+
export const bitcoin = new Bitcoin();
|
|
82
|
+
//# sourceMappingURL=bitcoin.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitcoin.browser.js","sourceRoot":"","sources":["../../src/bitcoin.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAc/C;;;;GAIG;AACH,MAAM,OAAO,OAAO;IACX,OAAO,CAAuB;IAC9B,OAAO,CAAwB;IAC/B,OAAO,CAAwB;IAC/B,MAAM,CAAwB;IAC9B,SAAS,CAAwB;IACjC,OAAO,CAAwB;IAEtC;;;;;OAKG;IACH,YAAY,OAAiC;QAC3C,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI;YAC7F,OAAO,EAAG;gBACR,IAAI,EAAG,0BAA0B;aAClC;SACF,CAAC,CAAC;QAEH,IAAG,CAAC,sBAAsB,EAAE,CAAC;YAC3B,MAAM,IAAI,WAAW,CACnB,gHAAgH,EAChH,gCAAgC,EAChC,EAAE,sBAAsB,EAAE,CAC3B,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,WAAW,CACnB,kDAAkD,EAClD,0CAA0C,EAC1C,EAAE,sBAAsB,EAAE,CAC3B,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,cAAc,GAAwC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE/F,mCAAmC;QACnC,MAAM,QAAQ,GAAgC,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAEvG,8DAA8D;QAC9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAwB,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAwB,CAAC;YAClH,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG;oBACd,IAAI,EAAK,OAAO;oBAChB,MAAM,EAAG,aAAa;oBACtB,IAAI,EAAK,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,IAAI,0BAA0B,CAAC;oBAC1E,IAAI,EAAK,UAAU,CAAC,OAAO,CAAC;iBAC7B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,SAAS,CAA4B,CAAC;QAC3G,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC,6CAA6C,EAAE,wBAAwB,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QACrH,CAAC;QAGD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CACnB,8CAA8C,cAAc,GAAG,EAC/D,4BAA4B,CAC7B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAE,GAAW;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAA,CAAC;IAEF;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAE,IAAY;QACnC,OAAO,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAAA,CAAC;CACH;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { MethodError } from '@did-btcr2/common';
|
|
2
|
+
import { DEFAULT_REST_CLIENT_CONFIG, DEFAULT_RPC_CLIENT_CONFIG } from './constants.js';
|
|
3
|
+
import { getNetwork } from './network.js';
|
|
4
|
+
import { BitcoinRest } from './rest-client.js';
|
|
5
|
+
import { BitcoinRpc } from './rpc-client.js';
|
|
6
|
+
/**
|
|
7
|
+
* General class to house the Bitcoin client connections, client config and various utility methods.
|
|
8
|
+
* @name Bitcoin
|
|
9
|
+
* @type {Bitcoin}
|
|
10
|
+
*/
|
|
11
|
+
export class Bitcoin {
|
|
12
|
+
network;
|
|
13
|
+
mainnet;
|
|
14
|
+
testnet;
|
|
15
|
+
signet;
|
|
16
|
+
mutinynet;
|
|
17
|
+
regtest;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an instance of the Bitcoin class.
|
|
20
|
+
* @param {BitcoinNetworkConfigMap} configs Optional configuration object for the Bitcoin client. If not provided, it will
|
|
21
|
+
* be loaded from the BITCOIN_CLIENT_CONFIG environment variables.
|
|
22
|
+
* @throws {MethodError} If no configs is passed and BITCOIN_NETWORK_CONFIG is missing or invalid.
|
|
23
|
+
*/
|
|
24
|
+
constructor(configs) {
|
|
25
|
+
const BITCOIN_NETWORK_CONFIG = process.env.BITCOIN_NETWORK_CONFIG ?? JSON.stringify(configs ?? {
|
|
26
|
+
regtest: {
|
|
27
|
+
rpc: DEFAULT_RPC_CLIENT_CONFIG,
|
|
28
|
+
rest: DEFAULT_REST_CLIENT_CONFIG
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (!BITCOIN_NETWORK_CONFIG) {
|
|
32
|
+
throw new MethodError('No BITCOIN_NETWORK_CONFIG available: must pass `configs` to constructor or set `BITCOIN_NETWORK_CONFIG` in env', 'MISSING_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
33
|
+
}
|
|
34
|
+
// Check if BITCOIN_NETWORK_CONFIG is parsable JSON string
|
|
35
|
+
if (!JSON.parsable(BITCOIN_NETWORK_CONFIG)) {
|
|
36
|
+
throw new MethodError('Parsing failed: malformed BITCOIN_NETWORK_CONFIG', 'MISSING_MALFORMED_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
37
|
+
}
|
|
38
|
+
// Parse the BITCOIN_NETWORK_CONFIG
|
|
39
|
+
const networkConfigs = JSON.parse(BITCOIN_NETWORK_CONFIG);
|
|
40
|
+
// Set a list of available networks
|
|
41
|
+
const networks = ['mainnet', 'testnet', 'signet', 'mutinynet', 'regtest'];
|
|
42
|
+
// Iterate over the networks and create the client connections
|
|
43
|
+
for (const network of networks) {
|
|
44
|
+
const networkConfig = (configs?.[network] ?? networkConfigs[network]);
|
|
45
|
+
if (networkConfig) {
|
|
46
|
+
this[network] = {
|
|
47
|
+
name: network,
|
|
48
|
+
config: networkConfig,
|
|
49
|
+
rpc: new BitcoinRpc(networkConfig.rpc ?? DEFAULT_RPC_CLIENT_CONFIG),
|
|
50
|
+
rest: new BitcoinRest(networkConfig.rest ?? DEFAULT_REST_CLIENT_CONFIG),
|
|
51
|
+
data: getNetwork(network),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Load and check the ACTIVE_NETWORK variable
|
|
56
|
+
const ACTIVE_NETWORK = (process.env.ACTIVE_NETWORK?.toLowerCase() ?? 'regtest');
|
|
57
|
+
if (!ACTIVE_NETWORK) {
|
|
58
|
+
throw new MethodError('Missing ACTIVE_NETWORK environment variable', 'MISSING_ACTIVE_NETWORK', { ACTIVE_NETWORK });
|
|
59
|
+
}
|
|
60
|
+
if (!this[ACTIVE_NETWORK]) {
|
|
61
|
+
throw new MethodError(`No configuration found for ACTIVE_NETWORK='${ACTIVE_NETWORK}'`, 'MISSING_CONFIG_FOR_NETWORK');
|
|
62
|
+
}
|
|
63
|
+
this.network = this[ACTIVE_NETWORK];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Converts Bitcoin (BTC) to satoshis (SAT).
|
|
67
|
+
* @param {number} btc - The amount in BTC.
|
|
68
|
+
* @returns {number} The amount in SAT.
|
|
69
|
+
*/
|
|
70
|
+
static btcToSats(btc) {
|
|
71
|
+
return Math.round(btc * 1e8);
|
|
72
|
+
}
|
|
73
|
+
;
|
|
74
|
+
/**
|
|
75
|
+
* Converts satoshis (SAT) to Bitcoin (BTC).
|
|
76
|
+
* @param {number} sats - The amount in SAT.
|
|
77
|
+
* @returns {number} The amount in BTC.
|
|
78
|
+
*/
|
|
79
|
+
static satsToBtc(sats) {
|
|
80
|
+
return sats / 1e8;
|
|
81
|
+
}
|
|
82
|
+
;
|
|
83
|
+
}
|
|
84
|
+
export const bitcoin = new Bitcoin();
|
|
85
|
+
//# sourceMappingURL=bitcoin.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitcoin.node.js","sourceRoot":"","sources":["../../src/bitcoin.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAe7C;;;;GAIG;AACH,MAAM,OAAO,OAAO;IACX,OAAO,CAAuB;IAC9B,OAAO,CAAwB;IAC/B,OAAO,CAAwB;IAC/B,MAAM,CAAwB;IAC9B,SAAS,CAAwB;IACjC,OAAO,CAAwB;IAEtC;;;;;OAKG;IACH,YAAY,OAAiC;QAC3C,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI;YAC7F,OAAO,EAAG;gBACR,GAAG,EAAI,yBAAyB;gBAChC,IAAI,EAAG,0BAA0B;aAClC;SACF,CAAC,CAAC;QAEH,IAAG,CAAC,sBAAsB,EAAE,CAAC;YAC3B,MAAM,IAAI,WAAW,CACnB,gHAAgH,EAChH,gCAAgC,EAChC,EAAE,sBAAsB,EAAE,CAC3B,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,WAAW,CACnB,kDAAkD,EAClD,0CAA0C,EAC1C,EAAE,sBAAsB,EAAE,CAC3B,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,cAAc,GAAwC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE/F,mCAAmC;QACnC,MAAM,QAAQ,GAAgC,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAEvG,8DAA8D;QAC9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAwB,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAwB,CAAC;YAClH,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG;oBACd,IAAI,EAAK,OAAO;oBAChB,MAAM,EAAG,aAAa;oBACtB,GAAG,EAAM,IAAI,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI,yBAAyB,CAAC;oBACvE,IAAI,EAAK,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,IAAI,0BAA0B,CAAC;oBAC1E,IAAI,EAAK,UAAU,CAAC,OAAO,CAAC;iBAC7B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,SAAS,CAA4B,CAAC;QAC3G,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC,6CAA6C,EAAE,wBAAwB,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QACrH,CAAC;QAGD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CACnB,8CAA8C,cAAc,GAAG,EAC/D,4BAA4B,CAC7B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAE,GAAW;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAA,CAAC;IAEF;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAE,IAAY;QACnC,OAAO,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAAA,CAAC;CACH;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const INITIAL_BLOCK_REWARD = 50;
|
|
2
|
+
export const HALVING_INTERVAL = 150;
|
|
3
|
+
export const COINBASE_MATURITY_DELAY = 100;
|
|
4
|
+
export const DEFAULT_RPC_CLIENT_CONFIG = {
|
|
5
|
+
network: 'regtest',
|
|
6
|
+
host: 'http://localhost:18443',
|
|
7
|
+
port: 18443,
|
|
8
|
+
username: 'polaruser',
|
|
9
|
+
password: 'polarpass',
|
|
10
|
+
allowDefaultWallet: true,
|
|
11
|
+
version: '28.1.0',
|
|
12
|
+
};
|
|
13
|
+
export const DEFAULT_REST_CLIENT_CONFIG = {
|
|
14
|
+
network: 'regtest',
|
|
15
|
+
host: 'http://localhost:3000'
|
|
16
|
+
};
|
|
17
|
+
export const DEFAULT_BLOCK_CONFIRMATIONS = 7;
|
|
18
|
+
export const TXIN_WITNESS_COINBASE = '0000000000000000000000000000000000000000000000000000000000000000';
|
|
19
|
+
export const GENESIS_TX_ID = '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b';
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,OAAO,EAAc,SAAS;IAC9B,IAAI,EAAiB,wBAAwB;IAC7C,IAAI,EAAiB,KAAK;IAC1B,QAAQ,EAAa,WAAW;IAChC,QAAQ,EAAa,WAAW;IAChC,kBAAkB,EAAG,IAAI;IACzB,OAAO,EAAc,QAAQ;CAC9B,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,OAAO,EAAG,SAAS;IACnB,IAAI,EAAM,uBAAuB;CAClC,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,kEAAkE,CAAC;AACxG,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Error class for handling Bitcoin RPC errors.
|
|
3
|
+
*/
|
|
4
|
+
export class BitcoinRpcError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
data;
|
|
7
|
+
constructor(code, message, data) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.data = data;
|
|
11
|
+
this.name = 'BitcoinRpcError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAkB;IACtB,IAAI,CAAO;IAC3B,YAAY,IAAqB,EAAE,OAAe,EAAE,IAAU;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './bitcoin.browser.js';
|
|
2
|
+
export * from './constants.js';
|
|
3
|
+
export * from './errors.js';
|
|
4
|
+
export * from './interface.js';
|
|
5
|
+
export * from './network.js';
|
|
6
|
+
export * from './rest-client.js';
|
|
7
|
+
export * from './rpc-client.js';
|
|
8
|
+
export * from './taproot.js';
|
|
9
|
+
export * from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './bitcoin.node.js';
|
|
2
|
+
export * from './constants.js';
|
|
3
|
+
export * from './errors.js';
|
|
4
|
+
export * from './interface.js';
|
|
5
|
+
export * from './network.js';
|
|
6
|
+
export * from './rest-client.js';
|
|
7
|
+
export * from './rpc-client.js';
|
|
8
|
+
export * from './taproot.js';
|
|
9
|
+
export * from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.node.js","sourceRoot":"","sources":["../../src/index.node.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { networks } from 'bitcoinjs-lib';
|
|
2
|
+
export function getNetwork(network) {
|
|
3
|
+
switch (network) {
|
|
4
|
+
case 'bitcoin':
|
|
5
|
+
return networks.bitcoin;
|
|
6
|
+
case 'testnet3':
|
|
7
|
+
case 'testnet4':
|
|
8
|
+
case 'signet':
|
|
9
|
+
case 'mutinynet':
|
|
10
|
+
return networks.testnet;
|
|
11
|
+
case 'regtest':
|
|
12
|
+
return networks.regtest;
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`Unknown network "${network}"`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|