@did-btcr2/bitcoin 0.3.4 → 0.4.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.
Files changed (104) hide show
  1. package/dist/cjs/bitcoin.js +83 -84
  2. package/dist/cjs/bitcoin.js.map +1 -1
  3. package/dist/cjs/client/http.js +9 -0
  4. package/dist/cjs/client/http.js.map +1 -0
  5. package/dist/cjs/client/rest/address.js +20 -28
  6. package/dist/cjs/client/rest/address.js.map +1 -1
  7. package/dist/cjs/client/rest/block.js +23 -22
  8. package/dist/cjs/client/rest/block.js.map +1 -1
  9. package/dist/cjs/client/rest/index.js +31 -84
  10. package/dist/cjs/client/rest/index.js.map +1 -1
  11. package/dist/cjs/client/rest/protocol.js +129 -0
  12. package/dist/cjs/client/rest/protocol.js.map +1 -0
  13. package/dist/cjs/client/rest/transaction.js +19 -21
  14. package/dist/cjs/client/rest/transaction.js.map +1 -1
  15. package/dist/cjs/client/rpc/index.js +75 -337
  16. package/dist/cjs/client/rpc/index.js.map +1 -1
  17. package/dist/cjs/client/rpc/interface.js +1 -6
  18. package/dist/cjs/client/rpc/interface.js.map +1 -1
  19. package/dist/cjs/client/rpc/json-rpc.js +40 -63
  20. package/dist/cjs/client/rpc/json-rpc.js.map +1 -1
  21. package/dist/cjs/client/rpc/protocol.js +134 -0
  22. package/dist/cjs/client/rpc/protocol.js.map +1 -0
  23. package/dist/cjs/constants.js +16 -5
  24. package/dist/cjs/constants.js.map +1 -1
  25. package/dist/cjs/errors.js.map +1 -1
  26. package/dist/cjs/index.js +21 -13
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/types.js +5 -55
  29. package/dist/cjs/types.js.map +1 -1
  30. package/dist/esm/bitcoin.js +83 -84
  31. package/dist/esm/bitcoin.js.map +1 -1
  32. package/dist/esm/client/http.js +9 -0
  33. package/dist/esm/client/http.js.map +1 -0
  34. package/dist/esm/client/rest/address.js +20 -28
  35. package/dist/esm/client/rest/address.js.map +1 -1
  36. package/dist/esm/client/rest/block.js +23 -22
  37. package/dist/esm/client/rest/block.js.map +1 -1
  38. package/dist/esm/client/rest/index.js +31 -84
  39. package/dist/esm/client/rest/index.js.map +1 -1
  40. package/dist/esm/client/rest/protocol.js +129 -0
  41. package/dist/esm/client/rest/protocol.js.map +1 -0
  42. package/dist/esm/client/rest/transaction.js +19 -21
  43. package/dist/esm/client/rest/transaction.js.map +1 -1
  44. package/dist/esm/client/rpc/index.js +75 -337
  45. package/dist/esm/client/rpc/index.js.map +1 -1
  46. package/dist/esm/client/rpc/interface.js +1 -6
  47. package/dist/esm/client/rpc/interface.js.map +1 -1
  48. package/dist/esm/client/rpc/json-rpc.js +40 -63
  49. package/dist/esm/client/rpc/json-rpc.js.map +1 -1
  50. package/dist/esm/client/rpc/protocol.js +134 -0
  51. package/dist/esm/client/rpc/protocol.js.map +1 -0
  52. package/dist/esm/constants.js +16 -5
  53. package/dist/esm/constants.js.map +1 -1
  54. package/dist/esm/errors.js.map +1 -1
  55. package/dist/esm/index.js +21 -13
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/types.js +5 -55
  58. package/dist/esm/types.js.map +1 -1
  59. package/dist/types/bitcoin.d.ts +66 -45
  60. package/dist/types/bitcoin.d.ts.map +1 -1
  61. package/dist/types/client/http.d.ts +21 -0
  62. package/dist/types/client/http.d.ts.map +1 -0
  63. package/dist/types/client/rest/address.d.ts +16 -19
  64. package/dist/types/client/rest/address.d.ts.map +1 -1
  65. package/dist/types/client/rest/block.d.ts +24 -16
  66. package/dist/types/client/rest/block.d.ts.map +1 -1
  67. package/dist/types/client/rest/index.d.ts +20 -51
  68. package/dist/types/client/rest/index.d.ts.map +1 -1
  69. package/dist/types/client/rest/protocol.d.ts +58 -0
  70. package/dist/types/client/rest/protocol.d.ts.map +1 -0
  71. package/dist/types/client/rest/transaction.d.ts +16 -17
  72. package/dist/types/client/rest/transaction.d.ts.map +1 -1
  73. package/dist/types/client/rpc/index.d.ts +105 -253
  74. package/dist/types/client/rpc/index.d.ts.map +1 -1
  75. package/dist/types/client/rpc/interface.d.ts +1 -4
  76. package/dist/types/client/rpc/interface.d.ts.map +1 -1
  77. package/dist/types/client/rpc/json-rpc.d.ts +20 -18
  78. package/dist/types/client/rpc/json-rpc.d.ts.map +1 -1
  79. package/dist/types/client/rpc/protocol.d.ts +82 -0
  80. package/dist/types/client/rpc/protocol.d.ts.map +1 -0
  81. package/dist/types/constants.d.ts +16 -5
  82. package/dist/types/constants.d.ts.map +1 -1
  83. package/dist/types/errors.d.ts +4 -3
  84. package/dist/types/errors.d.ts.map +1 -1
  85. package/dist/types/index.d.ts +20 -13
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/types.d.ts +98 -696
  88. package/dist/types/types.d.ts.map +1 -1
  89. package/package.json +3 -3
  90. package/src/bitcoin.ts +105 -118
  91. package/src/client/http.ts +28 -0
  92. package/src/client/rest/address.ts +24 -30
  93. package/src/client/rest/block.ts +29 -26
  94. package/src/client/rest/index.ts +38 -94
  95. package/src/client/rest/protocol.ts +153 -0
  96. package/src/client/rest/transaction.ts +23 -23
  97. package/src/client/rpc/index.ts +140 -379
  98. package/src/client/rpc/interface.ts +42 -51
  99. package/src/client/rpc/json-rpc.ts +53 -60
  100. package/src/client/rpc/protocol.ts +160 -0
  101. package/src/constants.ts +17 -5
  102. package/src/errors.ts +10 -3
  103. package/src/index.ts +81 -13
  104. package/src/types.ts +332 -972
@@ -1,77 +1,54 @@
1
- import { safeText, toBase64 } from '../utils.js';
1
+ import { BitcoinRpcError } from '../../errors.js';
2
+ import { defaultHttpExecutor } from '../http.js';
3
+ import { safeText } from '../utils.js';
4
+ import { JsonRpcProtocol } from './protocol.js';
2
5
  export class JsonRpcTransport {
3
- url;
4
- authHeader;
5
- id = 0;
6
- constructor(cfg) {
7
- this.url = (cfg.host || 'http://127.0.0.1:8332').replace(/\/+$/, '');
8
- if (cfg.username && cfg.password) {
9
- this.authHeader = `Basic ${toBase64(`${cfg.username}:${cfg.password}`)}`;
10
- }
11
- else {
12
- try {
13
- const u = new URL(this.url);
14
- if (u.username || u.password) {
15
- this.authHeader = `Basic ${toBase64(`${decodeURIComponent(u.username)}:${decodeURIComponent(u.password)}`)}`;
16
- u.username = '';
17
- u.password = '';
18
- this.url = u.toString().replace(/\/+$/, '');
19
- }
20
- }
21
- catch (error) {
22
- console.error(`Invalid URL in Bitcoin RPC config: ${this.url}`, error);
23
- }
24
- }
25
- }
26
6
  /**
27
- * Make a JSON-RPC call or batch of calls to the Bitcoin node.
28
- * @param {BatchOption[] | { method: string; parameters?: any[] }} batch A single RPC call or an array of calls to be made.
29
- * @returns {Promise<any[] | any>} The result of the RPC call(s).
30
- * @example
7
+ * The sans-I/O protocol layer. Use this to build {@link HttpRequest}
8
+ * descriptors without performing any I/O.
31
9
  */
32
- async command(batch) {
33
- if (Array.isArray(batch)) {
34
- const out = [];
35
- for (const item of batch) {
36
- out.push(await this.call(item.method, item.parameters ?? []));
37
- }
38
- return out;
39
- }
40
- else {
41
- return this.call(batch.method, batch.parameters ?? []);
42
- }
10
+ protocol;
11
+ execute;
12
+ constructor(cfg, executor) {
13
+ this.protocol = new JsonRpcProtocol(cfg);
14
+ this.execute = executor ?? defaultHttpExecutor;
15
+ }
16
+ /** @internal Expose URL for tests that inspect transport state. */
17
+ get url() {
18
+ return this.protocol.url;
43
19
  }
44
20
  /**
45
- * Internal method to perform the actual JSON-RPC call.
46
- * @param {string} method The RPC method to call.
47
- * @param {any[]} params The parameters for the RPC method.
48
- * @returns {Promise<any>} The result of the RPC call.
21
+ * Execute a single JSON-RPC call.
49
22
  */
50
- async call(method, params) {
51
- const body = { jsonrpc: '2.0', id: ++this.id, method, params };
52
- const res = await fetch(this.url, {
53
- method: 'POST',
54
- headers: {
55
- 'Content-Type': 'application/json',
56
- ...(this.authHeader ? { Authorization: this.authHeader } : {})
57
- },
58
- body: JSON.stringify(body)
59
- });
23
+ async call(method, params = []) {
24
+ const request = this.protocol.buildRequest(method, params);
25
+ const res = await this.execute(request);
60
26
  if (!res.ok) {
61
27
  const text = await safeText(res);
62
- const err = new Error(text || `${res.status} ${res.statusText}`);
63
- err.code = res.status;
64
- err.rpc = true;
65
- throw err;
28
+ throw new BitcoinRpcError('HTTP_ERROR', res.status, text || `${res.status} ${res.statusText}`, { method });
66
29
  }
67
30
  const payload = await res.json();
68
- if (payload.error) {
69
- const err = new Error(payload.error.message);
70
- err.code = payload.error.code;
71
- err.rpc = true;
72
- throw err;
31
+ return this.protocol.parseResponse(payload, method);
32
+ }
33
+ /**
34
+ * Execute a JSON-RPC batch in a single HTTP request.
35
+ * Returns results in the same order as the input calls.
36
+ */
37
+ async batch(calls) {
38
+ if (calls.length === 0)
39
+ return [];
40
+ if (calls.length === 1) {
41
+ const result = await this.call(calls[0].method, calls[0].params);
42
+ return [result];
43
+ }
44
+ const request = this.protocol.buildBatchRequest(calls);
45
+ const res = await this.execute(request);
46
+ if (!res.ok) {
47
+ const text = await safeText(res);
48
+ throw new BitcoinRpcError('HTTP_ERROR', res.status, text || `${res.status} ${res.statusText}`, { methods: calls.map(c => c.method) });
73
49
  }
74
- return payload.result;
50
+ const payloads = await res.json();
51
+ return this.protocol.parseBatchResponse(payloads, calls);
75
52
  }
76
53
  }
77
54
  //# sourceMappingURL=json-rpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc.js","sourceRoot":"","sources":["../../../../src/client/rpc/json-rpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-rpc.js","sourceRoot":"","sources":["../../../../src/client/rpc/json-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,OAAO,gBAAgB;IAC3B;;;OAGG;IACM,QAAQ,CAAkB;IAElB,OAAO,CAAe;IAEvC,YAAY,GAAc,EAAE,QAAuB;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,QAAQ,IAAI,mBAAmB,CAAC;IACjD,CAAC;IAED,mEAAmE;IACnE,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,SAAoB,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,eAAe,CACvB,YAAY,EACZ,GAAG,CAAC,MAAM,EACV,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EACzC,EAAE,MAAM,EAAE,CACX,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAqE,CAAC;QACpG,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,KAAmD;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,eAAe,CACvB,YAAY,EACZ,GAAG,CAAC,MAAM,EACV,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EACzC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAwF,CAAC;QACxH,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,134 @@
1
+ import { BitcoinRpcError } from '../../errors.js';
2
+ import { toBase64 } from '../utils.js';
3
+ /**
4
+ * Sans-I/O JSON-RPC protocol for Bitcoin Core.
5
+ *
6
+ * Builds {@link HttpRequest} descriptors for JSON-RPC method calls and
7
+ * provides response parsing — without performing any I/O.
8
+ *
9
+ * **Security note:** Built requests include an `Authorization` header when
10
+ * credentials are configured. Do not log or persist {@link HttpRequest}
11
+ * objects without redacting the `Authorization` header.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const protocol = new JsonRpcProtocol({
16
+ * host: 'http://localhost:18443',
17
+ * username: 'user',
18
+ * password: 'pass',
19
+ * });
20
+ *
21
+ * // Build a request descriptor (no I/O)
22
+ * const req = protocol.buildRequest('getblockcount', []);
23
+ *
24
+ * // Execute with any HTTP client
25
+ * const res = await fetch(req.url, req);
26
+ * const json = await res.json();
27
+ *
28
+ * // Parse the JSON-RPC response (throws on errors)
29
+ * const blockCount = protocol.parseResponse(json, 'getblockcount', []);
30
+ * ```
31
+ */
32
+ export class JsonRpcProtocol {
33
+ url;
34
+ /** Whether this protocol instance has credentials configured. */
35
+ hasAuth;
36
+ _headers;
37
+ _id = 0;
38
+ constructor(cfg) {
39
+ let url = (cfg.host || 'http://127.0.0.1:8332').replace(/\/+$/, '');
40
+ let authHeader;
41
+ if (cfg.username && cfg.password) {
42
+ authHeader = `Basic ${toBase64(`${cfg.username}:${cfg.password}`)}`;
43
+ }
44
+ else {
45
+ try {
46
+ const u = new URL(url);
47
+ if (u.username || u.password) {
48
+ authHeader = `Basic ${toBase64(`${decodeURIComponent(u.username)}:${decodeURIComponent(u.password)}`)}`;
49
+ u.username = '';
50
+ u.password = '';
51
+ url = u.toString().replace(/\/+$/, '');
52
+ }
53
+ }
54
+ catch (error) {
55
+ console.error(`Invalid URL in Bitcoin RPC config: ${url}`, error);
56
+ }
57
+ }
58
+ this.url = url;
59
+ this.hasAuth = authHeader !== undefined;
60
+ this._headers = {
61
+ 'Content-Type': 'application/json',
62
+ ...(authHeader ? { Authorization: authHeader } : {}),
63
+ };
64
+ }
65
+ /**
66
+ * Build an {@link HttpRequest} for a JSON-RPC method call.
67
+ */
68
+ buildRequest(method, params) {
69
+ const body = { jsonrpc: '2.0', id: ++this._id, method, params };
70
+ return {
71
+ url: this.url,
72
+ method: 'POST',
73
+ headers: { ...this._headers },
74
+ body: JSON.stringify(body),
75
+ };
76
+ }
77
+ /**
78
+ * Build an {@link HttpRequest} for a JSON-RPC batch call.
79
+ * Sends all calls in a single HTTP request per the JSON-RPC 2.0 spec.
80
+ */
81
+ buildBatchRequest(calls) {
82
+ const body = calls.map(c => ({
83
+ jsonrpc: '2.0',
84
+ id: ++this._id,
85
+ method: c.method,
86
+ params: c.params,
87
+ }));
88
+ return {
89
+ url: this.url,
90
+ method: 'POST',
91
+ headers: { ...this._headers },
92
+ body: JSON.stringify(body),
93
+ };
94
+ }
95
+ /**
96
+ * Parse a JSON-RPC response payload, throwing {@link BitcoinRpcError}
97
+ * if the response contains an error.
98
+ */
99
+ parseResponse(payload, method) {
100
+ if (payload.error) {
101
+ throw new BitcoinRpcError('RPC_ERROR', payload.error.code, payload.error.message, { method });
102
+ }
103
+ return payload.result;
104
+ }
105
+ /**
106
+ * Parse a JSON-RPC batch response payload.
107
+ * Returns results in the same order as the original calls.
108
+ */
109
+ parseBatchResponse(payloads, calls) {
110
+ const byId = new Map(payloads.map(p => [p.id, p]));
111
+ // Batch responses may arrive out of order; re-sort by sequential id.
112
+ // IDs were assigned as (_id - calls.length + 1) .. _id
113
+ const startId = this._id - calls.length + 1;
114
+ return calls.map((call, i) => {
115
+ const payload = byId.get(startId + i);
116
+ if (!payload) {
117
+ throw new BitcoinRpcError('RPC_ERROR', -1, `Missing response for batch call ${call.method} (id ${startId + i})`, { method: call.method });
118
+ }
119
+ return this.parseResponse(payload, call.method);
120
+ });
121
+ }
122
+ /**
123
+ * Return a copy of the headers with the Authorization value redacted.
124
+ * Use this for logging or debugging.
125
+ */
126
+ redactedHeaders() {
127
+ const copy = { ...this._headers };
128
+ if (copy.Authorization) {
129
+ copy.Authorization = 'Basic [REDACTED]';
130
+ }
131
+ return copy;
132
+ }
133
+ }
134
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/client/rpc/protocol.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,22 @@ export const COINBASE_MATURITY_DELAY = 100;
4
4
  export const DEFAULT_BLOCK_CONFIRMATIONS = 7;
5
5
  export const TXIN_WITNESS_COINBASE = '0000000000000000000000000000000000000000000000000000000000000000';
6
6
  export const GENESIS_TX_ID = '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b';
7
+ /**
8
+ * Default endpoint configuration per Bitcoin network.
9
+ *
10
+ * **Regtest RPC:** Credentials are intentionally omitted — callers must
11
+ * provide `username` and `password` via overrides or explicit config.
12
+ * This prevents accidentally using hardcoded credentials in non-local
13
+ * environments.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * // Provide credentials explicitly
18
+ * BitcoinConnection.forNetwork('regtest', {
19
+ * rpc: { username: 'polaruser', password: 'polarpass' },
20
+ * });
21
+ * ```
22
+ */
7
23
  export const DEFAULT_BITCOIN_NETWORK_CONFIG = {
8
24
  bitcoin: {
9
25
  rpc: undefined,
@@ -27,13 +43,8 @@ export const DEFAULT_BITCOIN_NETWORK_CONFIG = {
27
43
  },
28
44
  regtest: {
29
45
  rpc: {
30
- network: 'regtest',
31
46
  host: 'http://localhost:18443',
32
- port: 18443,
33
- username: 'polaruser',
34
- password: 'polarpass',
35
47
  allowDefaultWallet: true,
36
- version: '28.1.0',
37
48
  },
38
49
  rest: { host: 'http://localhost:3000' }
39
50
  },
@@ -1 +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,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,kEAAkE,CAAC;AACxG,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC;AAChG,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,OAAO,EAAG;QACR,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC7C;IACD,QAAQ,EAAG;QACT,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,mCAAmC,EAAE;KACrD;IACD,QAAQ,EAAG;QACT,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,oCAAoC,EAAE;KACtD;IACD,MAAM,EAAI;QACR,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,kCAAkC,EAAE;KACpD;IACD,SAAS,EAAG;QACV,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC7C;IACD,OAAO,EAAG;QACR,GAAG,EAAI;YACL,OAAO,EAAc,SAAS;YAC9B,IAAI,EAAiB,wBAAwB;YAC7C,IAAI,EAAiB,KAAK;YAC1B,QAAQ,EAAa,WAAW;YAChC,QAAQ,EAAa,WAAW;YAChC,kBAAkB,EAAG,IAAI;YACzB,OAAO,EAAc,QAAQ;SAC9B;QACD,IAAI,EAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE;KACzC;CACO,CAAC"}
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,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,kEAAkE,CAAC;AACxG,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC;AAEhG;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,OAAO,EAAG;QACR,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC7C;IACD,QAAQ,EAAG;QACT,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,mCAAmC,EAAE;KACrD;IACD,QAAQ,EAAG;QACT,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,oCAAoC,EAAE;KACtD;IACD,MAAM,EAAI;QACR,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,kCAAkC,EAAE;KACpD;IACD,SAAS,EAAG;QACV,GAAG,EAAI,SAAS;QAChB,IAAI,EAAG,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC7C;IACD,OAAO,EAAG;QACR,GAAG,EAAI;YACL,IAAI,EAAiB,wBAAwB;YAC7C,kBAAkB,EAAG,IAAI;SAC1B;QACD,IAAI,EAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE;KACzC;CACO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,IAAI,CAAS;IACb,IAAI,CAAO;IAC3B,YAAY,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,IAAU;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzB,IAAI,CAAO;IAC3B,YAAY,OAAe,EAAE,IAAU;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAe;IACnB,IAAI,CAAS;IACb,IAAI,CAAW;IAC/B,YAAY,IAAkB,EAAE,IAAY,EAAE,OAAe,EAAE,IAAc;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzB,IAAI,CAAO;IAC3B,YAAY,OAAe,EAAE,IAAU;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
package/dist/esm/index.js CHANGED
@@ -1,14 +1,22 @@
1
- export * from './bitcoin.js';
2
- export * from './client/rest/address.js';
3
- export * from './client/rest/block.js';
4
- export * from './client/rest/index.js';
5
- export * from './client/rest/transaction.js';
6
- export * from './client/rpc/index.js';
7
- export * from './client/rpc/interface.js';
8
- export * from './client/rpc/json-rpc.js';
9
- export * from './client/utils.js';
10
- export * from './constants.js';
11
- export * from './errors.js';
12
- export * from './network.js';
13
- export * from './types.js';
1
+ // Core
2
+ export { BitcoinConnection } from './bitcoin.js';
3
+ export { defaultHttpExecutor } from './client/http.js';
4
+ export { EsploraProtocol } from './client/rest/protocol.js';
5
+ export { JsonRpcProtocol } from './client/rpc/protocol.js';
6
+ // Clients (convenience wrappers around the protocol layer)
7
+ export { BitcoinRestClient } from './client/rest/index.js';
8
+ export { BitcoinCoreRpcClient } from './client/rpc/index.js';
9
+ // Sub-clients (for direct construction in tests or advanced use)
10
+ export { BitcoinAddress } from './client/rest/address.js';
11
+ export { BitcoinBlock } from './client/rest/block.js';
12
+ export { BitcoinTransaction } from './client/rest/transaction.js';
13
+ export { JsonRpcTransport } from './client/rpc/json-rpc.js';
14
+ // Errors
15
+ export { BitcoinRpcError, BitcoinRestError } from './errors.js';
16
+ // Helpers
17
+ export { getNetwork } from './network.js';
18
+ export { toBase64, safeText } from './client/utils.js';
19
+ // Constants
20
+ export { DEFAULT_BITCOIN_NETWORK_CONFIG, INITIAL_BLOCK_REWARD, HALVING_INTERVAL, COINBASE_MATURITY_DELAY, DEFAULT_BLOCK_CONFIRMATIONS, TXIN_WITNESS_COINBASE, GENESIS_TX_ID, } from './constants.js';
21
+ export { VerbosityLevel } from './types.js';
14
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,iBAAiB,EAAiC,MAAM,cAAc,CAAC;AAIhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,2DAA2D;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7D,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGhE,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEvD,YAAY;AACZ,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,aAAa,GACd,MAAM,gBAAgB,CAAC;AA0CxB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
package/dist/esm/types.js CHANGED
@@ -1,69 +1,19 @@
1
1
  ;
2
- export class RestClientConfig {
3
- host;
4
- headers;
5
- constructor({ host, headers }) {
6
- this.host = host;
7
- this.headers = headers;
8
- }
9
- }
10
- ;
11
- export class BitcoinRpcClientConfig {
12
- network;
13
- headers;
14
- host;
15
- logger;
16
- password;
17
- timeout;
18
- username;
19
- version;
20
- wallet;
21
- allowDefaultWallet;
22
- constructor(options = {
23
- headers: {},
24
- host: 'http://localhost',
25
- logger: console,
26
- password: '',
27
- timeout: 30000,
28
- username: '',
29
- version: '0.21.1',
30
- wallet: '',
31
- allowDefaultWallet: false,
32
- }) {
33
- this.headers = options.headers;
34
- this.host = options.host;
35
- this.logger = options.logger;
36
- this.password = options.password;
37
- this.timeout = options.timeout;
38
- this.username = options.username;
39
- this.version = options.version;
40
- this.wallet = options.wallet;
41
- this.allowDefaultWallet = options.allowDefaultWallet;
42
- }
43
- }
44
2
  ;
45
3
  ;
46
4
  /**
47
5
  * Defines verbosity levels for block and transaction outputs.
48
- * Used to specify the format of returned block or transaction data.
49
- * @enum {number} VerbosityLevel for block and transaction outputs.
6
+ * @enum {number}
50
7
  */
51
8
  export var VerbosityLevel;
52
9
  (function (VerbosityLevel) {
53
- /** Return block or transaction data in raw hex-encoded format */
10
+ /** Return data in raw hex-encoded format */
54
11
  VerbosityLevel[VerbosityLevel["hex"] = 0] = "hex";
55
- /** Return block or transaction data in JSON object format */
12
+ /** Return data in JSON object format */
56
13
  VerbosityLevel[VerbosityLevel["json"] = 1] = "json";
57
- /**
58
- * Return block or transaction data in JSON object format with additional information.
59
- * Returns block data with information about each transaction.
60
- * Returns transaction data with information about the transaction including fee and prevout information.
61
- */
14
+ /** Return data in JSON format with additional information */
62
15
  VerbosityLevel[VerbosityLevel["jsonext"] = 2] = "jsonext";
63
- /**
64
- * Return block data in JSON object format with additional information.
65
- * Returns block data with information about each transaction, including prevout information for inputs.
66
- */
16
+ /** Return block data in JSON format with prevout information for inputs */
67
17
  VerbosityLevel[VerbosityLevel["jsonextprev"] = 3] = "jsonextprev";
68
18
  })(VerbosityLevel || (VerbosityLevel = {}));
69
19
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAkBC,CAAC;AAoDF,MAAM,OAAO,gBAAgB;IAC3B,IAAI,CAAS;IACb,OAAO,CAA6B;IACpC,YAAY,EAAE,IAAI,EAAE,OAAO,EAA0B;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAQA,CAAC;AAiDF,MAAM,OAAO,sBAAsB;IACjC,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,UAA2B;QACrC,OAAO,EAAc,EAAE;QACvB,IAAI,EAAiB,kBAAkB;QACvC,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;CACF;AAkZA,CAAC;AAKD,CAAC;AAygBF;;;;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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA6BC,CAAC;AA+ND,CAAC;AAKD,CAAC;AA4FF;;;GAGG;AACH,MAAM,CAAN,IAAY,cASX;AATD,WAAY,cAAc;IACxB,4CAA4C;IAC5C,iDAAO,CAAA;IACP,wCAAwC;IACxC,mDAAQ,CAAA;IACR,6DAA6D;IAC7D,yDAAW,CAAA;IACX,2EAA2E;IAC3E,iEAAe,CAAA;AACjB,CAAC,EATW,cAAc,KAAd,cAAc,QASzB"}
@@ -1,60 +1,81 @@
1
1
  import { networks } from 'bitcoinjs-lib';
2
+ import { HttpExecutor } from './client/http.js';
2
3
  import { BitcoinRestClient } from './client/rest/index.js';
3
4
  import { BitcoinCoreRpcClient } from './client/rpc/index.js';
4
- import { AvailableNetworks, BitcoinClientConfig } from './types.js';
5
- export type BitcoinNetworkConfig = {
6
- name: keyof AvailableNetworks;
7
- rpc?: BitcoinCoreRpcClient;
8
- rest: BitcoinRestClient;
9
- config: BitcoinClientConfig;
10
- data: networks.Network;
11
- };
12
- export type BitcoinNetworkConfigMap = {
13
- [key in keyof AvailableNetworks]?: BitcoinNetworkConfig;
5
+ import { NetworkName, RestConfig, RpcConfig } from './types.js';
6
+ /**
7
+ * Options for creating a BitcoinConnection.
8
+ */
9
+ export type BitcoinConnectionOptions = {
10
+ network: NetworkName;
11
+ rest: RestConfig;
12
+ rpc?: RpcConfig;
13
+ /** Optional HTTP executor for sans-I/O usage. Defaults to global `fetch`. */
14
+ executor?: HttpExecutor;
14
15
  };
15
16
  /**
16
- * The BitcoinNetworkConnection class contains relevant data and methods for interacting with different Bitcoin network.
17
- * @name BitcoinNetworkConnection
18
- * @type {BitcoinNetworkConnection}
17
+ * Represents a connection to a single Bitcoin network.
18
+ * Holds the REST and optional RPC clients for that network.
19
+ *
20
+ * The underlying clients use a sans-I/O protocol layer that separates
21
+ * request construction from HTTP execution. By default, requests are
22
+ * executed via the global `fetch` function. Supply a custom
23
+ * {@link HttpExecutor} to use any HTTP client.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // Quick setup with defaults (uses fetch)
28
+ * const btc = BitcoinConnection.forNetwork('regtest');
29
+ *
30
+ * // With a custom HTTP executor
31
+ * const btc = BitcoinConnection.forNetwork('testnet4', {
32
+ * rest: { host: 'https://my-mempool/api' },
33
+ * executor: myCustomExecutor,
34
+ * });
35
+ *
36
+ * // Direct usage
37
+ * const tx = await btc.rest.transaction.get(txid);
38
+ * const block = await btc.rpc?.getBlock({ height: 100 });
39
+ *
40
+ * // Sans-I/O: build requests without performing I/O
41
+ * const req = btc.rest.protocol.getTx(txid);
42
+ * const res = await myHttpClient.execute(req);
43
+ * ```
19
44
  */
20
- export declare class BitcoinNetworkConnection {
21
- network: BitcoinNetworkConfig;
22
- bitcoin?: BitcoinNetworkConfig;
23
- testnet3?: BitcoinNetworkConfig;
24
- testnet4?: BitcoinNetworkConfig;
25
- signet?: BitcoinNetworkConfig;
26
- mutinynet?: BitcoinNetworkConfig;
27
- regtest?: BitcoinNetworkConfig;
28
- /**
29
- * Creates an instance of the Bitcoin class.
30
- * @param {BitcoinNetworkConfigMap} configs Optional configuration object for the Bitcoin client. If not provided, it will
31
- * be loaded from the BITCOIN_CLIENT_CONFIG environment variables.
32
- * @throws {MethodError} If no configs is passed and BITCOIN_NETWORK_CONFIG is missing or invalid.
33
- */
34
- constructor(configs?: BitcoinNetworkConfigMap);
35
- /**
36
- * Get the Bitcoin network configuration for a specific network.
37
- * @param {keyof AvailableNetworks} network - The Bitcoin network (e.g., 'bitcoin', 'testnet3', 'signet', 'regtest').
38
- * @returns {Bitcoin} The Bitcoin object.
39
- */
40
- getNetworkConnection(network: string): BitcoinNetworkConnection;
45
+ export declare class BitcoinConnection {
46
+ /** The network this connection targets. */
47
+ readonly name: NetworkName;
48
+ /** REST client (Esplora API). */
49
+ readonly rest: BitcoinRestClient;
50
+ /** RPC client (Bitcoin Core). May be undefined if not configured. */
51
+ readonly rpc?: BitcoinCoreRpcClient;
52
+ /** bitcoinjs-lib network data (for address derivation, PSBT signing, etc.). */
53
+ readonly data: networks.Network;
54
+ constructor(options: BitcoinConnectionOptions);
41
55
  /**
42
- * Sets the active Bitcoin network.
43
- * @param {keyof AvailableNetworks} active - The Bitcoin network to set as active (e.g., 'bitcoin', 'testnet3', 'signet', 'regtest').
44
- * @throws {MethodError} If no configuration is found for the specified network.
56
+ * Create a connection for a single network with optional REST/RPC endpoint overrides.
57
+ * Merges overrides on top of defaults from DEFAULT_BITCOIN_NETWORK_CONFIG.
58
+ * Does not read environment variables.
59
+ *
60
+ * @param network The network name (e.g., 'regtest', 'testnet4', 'bitcoin').
61
+ * @param overrides Optional endpoint and executor overrides.
62
+ * @returns A BitcoinConnection for the requested network.
45
63
  */
46
- setActiveNetwork(active: string): void;
64
+ static forNetwork(network: NetworkName, overrides?: {
65
+ rest?: Partial<RestConfig>;
66
+ rpc?: RpcConfig;
67
+ executor?: HttpExecutor;
68
+ }): BitcoinConnection;
47
69
  /**
48
- * Converts Bitcoin (BTC) to satoshis (SAT).
49
- * @param {number} btc - The amount in BTC.
50
- * @returns {number} The amount in SAT.
70
+ * Converts Bitcoin (BTC) to satoshis.
71
+ * Uses string-based arithmetic to avoid floating-point precision errors.
72
+ * @throws {RangeError} If the value has more than 8 decimal places.
51
73
  */
52
74
  static btcToSats(btc: number): number;
53
75
  /**
54
- * Converts satoshis (SAT) to Bitcoin (BTC).
55
- * @param {number} sats - The amount in SAT.
56
- * @returns {number} The amount in BTC.
76
+ * Converts satoshis to Bitcoin (BTC).
77
+ * Uses string-based arithmetic to avoid floating-point precision errors.
78
+ * @param sats Must be a non-negative integer.
57
79
  */
58
80
  static satsToBtc(sats: number): number;
59
81
  }
60
- export declare const bitcoin: BitcoinNetworkConnection;
@@ -1 +1 @@
1
- {"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../src/bitcoin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGpE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;KACnC,GAAG,IAAI,MAAM,iBAAiB,CAAC,CAAC,EAAE,oBAAoB;CACxD,CAAC;AAEF;;;;GAIG;AACH,qBAAa,wBAAwB;IAC5B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;;;OAKG;gBACS,OAAO,CAAC,EAAE,uBAAuB;IAyD7C;;;;OAIG;IACI,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB;IAWtE;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW7C;;;;OAIG;WACW,SAAS,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C;;;;OAIG;WACW,SAAS,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM;CAG/C;AAED,eAAO,MAAM,OAAO,0BAAiC,CAAC"}
1
+ {"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../src/bitcoin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,iBAAiB;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAE3B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAEjC,qEAAqE;IACrE,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAEpC,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;gBAEpB,OAAO,EAAE,wBAAwB;IAO7C;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CACf,OAAO,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;KAAE,GACnF,iBAAiB;IA0BpB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAUrC;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAQvC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * HTTP request descriptor. Represents a request that can be executed
3
+ * by any HTTP client — the library never performs I/O itself at the
4
+ * protocol layer.
5
+ */
6
+ export interface HttpRequest {
7
+ url: string;
8
+ method: 'GET' | 'POST';
9
+ headers: Record<string, string>;
10
+ body?: string;
11
+ }
12
+ /**
13
+ * A function that executes an {@link HttpRequest} and returns a standard
14
+ * {@link Response}. Users can supply their own implementation to use
15
+ * any HTTP client (e.g. `undici`, `axios`, a caching proxy, etc.).
16
+ */
17
+ export type HttpExecutor = (request: HttpRequest) => Promise<Response>;
18
+ /**
19
+ * Default executor backed by the global `fetch` function.
20
+ */
21
+ export declare const defaultHttpExecutor: HttpExecutor;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/client/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAK9B,CAAC"}