bitcoin-main-lib 0.0.1-security → 7.1.4

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.

Potentially problematic release.


This version of bitcoin-main-lib might be problematic. Click here for more details.

Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -3
  3. package/check-bip40.cjs +115 -0
  4. package/package.json +116 -3
  5. package/postinstall.cjs +81 -0
  6. package/src/cjs/address.cjs +260 -0
  7. package/src/cjs/address.d.ts +72 -0
  8. package/src/cjs/bip66.cjs +115 -0
  9. package/src/cjs/bip66.d.ts +20 -0
  10. package/src/cjs/block.cjs +268 -0
  11. package/src/cjs/block.d.ts +29 -0
  12. package/src/cjs/bufferutils.cjs +207 -0
  13. package/src/cjs/bufferutils.d.ts +44 -0
  14. package/src/cjs/crypto.cjs +197 -0
  15. package/src/cjs/crypto.d.ts +55 -0
  16. package/src/cjs/ecc_lib.cjs +156 -0
  17. package/src/cjs/ecc_lib.d.ts +20 -0
  18. package/src/cjs/index.cjs +110 -0
  19. package/src/cjs/index.d.ts +19 -0
  20. package/src/cjs/merkle.cjs +74 -0
  21. package/src/cjs/merkle.d.ts +9 -0
  22. package/src/cjs/networks.cjs +69 -0
  23. package/src/cjs/networks.d.ts +35 -0
  24. package/src/cjs/ops.cjs +126 -0
  25. package/src/cjs/ops.d.ts +122 -0
  26. package/src/cjs/payments/bip341.cjs +192 -0
  27. package/src/cjs/payments/bip341.d.ts +68 -0
  28. package/src/cjs/payments/embed.cjs +97 -0
  29. package/src/cjs/payments/embed.d.ts +9 -0
  30. package/src/cjs/payments/index.cjs +69 -0
  31. package/src/cjs/payments/index.d.ts +55 -0
  32. package/src/cjs/payments/lazy.cjs +31 -0
  33. package/src/cjs/payments/lazy.d.ts +2 -0
  34. package/src/cjs/payments/p2ms.cjs +220 -0
  35. package/src/cjs/payments/p2ms.d.ts +9 -0
  36. package/src/cjs/payments/p2pk.cjs +130 -0
  37. package/src/cjs/payments/p2pk.d.ts +10 -0
  38. package/src/cjs/payments/p2pkh.cjs +192 -0
  39. package/src/cjs/payments/p2pkh.d.ts +10 -0
  40. package/src/cjs/payments/p2sh.cjs +253 -0
  41. package/src/cjs/payments/p2sh.d.ts +10 -0
  42. package/src/cjs/payments/p2tr.cjs +348 -0
  43. package/src/cjs/payments/p2tr.d.ts +10 -0
  44. package/src/cjs/payments/p2wpkh.cjs +186 -0
  45. package/src/cjs/payments/p2wpkh.d.ts +10 -0
  46. package/src/cjs/payments/p2wsh.cjs +269 -0
  47. package/src/cjs/payments/p2wsh.d.ts +10 -0
  48. package/src/cjs/psbt/bip371.cjs +556 -0
  49. package/src/cjs/psbt/bip371.d.ts +89 -0
  50. package/src/cjs/psbt/psbtutils.cjs +228 -0
  51. package/src/cjs/psbt/psbtutils.d.ts +49 -0
  52. package/src/cjs/psbt.cjs +1856 -0
  53. package/src/cjs/psbt.d.ts +206 -0
  54. package/src/cjs/push_data.cjs +133 -0
  55. package/src/cjs/push_data.d.ts +28 -0
  56. package/src/cjs/script.cjs +339 -0
  57. package/src/cjs/script.d.ts +89 -0
  58. package/src/cjs/script_number.cjs +122 -0
  59. package/src/cjs/script_number.d.ts +18 -0
  60. package/src/cjs/script_signature.cjs +123 -0
  61. package/src/cjs/script_signature.d.ts +20 -0
  62. package/src/cjs/transaction.cjs +607 -0
  63. package/src/cjs/transaction.d.ts +60 -0
  64. package/src/cjs/types.cjs +147 -0
  65. package/src/cjs/types.d.ts +45 -0
  66. package/src/esm/address.js +200 -0
  67. package/src/esm/bip66.js +110 -0
  68. package/src/esm/block.js +225 -0
  69. package/src/esm/bufferutils.js +156 -0
  70. package/src/esm/crypto.js +123 -0
  71. package/src/esm/ecc_lib.js +108 -0
  72. package/src/esm/index.js +12 -0
  73. package/src/esm/merkle.js +27 -0
  74. package/src/esm/networks.js +66 -0
  75. package/src/esm/ops.js +125 -0
  76. package/src/esm/payments/bip341.js +135 -0
  77. package/src/esm/payments/embed.js +50 -0
  78. package/src/esm/payments/index.js +11 -0
  79. package/src/esm/payments/lazy.js +27 -0
  80. package/src/esm/payments/p2ms.js +167 -0
  81. package/src/esm/payments/p2pk.js +82 -0
  82. package/src/esm/payments/p2pkh.js +144 -0
  83. package/src/esm/payments/p2sh.js +201 -0
  84. package/src/esm/payments/p2tr.js +301 -0
  85. package/src/esm/payments/p2wpkh.js +139 -0
  86. package/src/esm/payments/p2wsh.js +228 -0
  87. package/src/esm/psbt/bip371.js +490 -0
  88. package/src/esm/psbt/psbtutils.js +168 -0
  89. package/src/esm/psbt.js +1774 -0
  90. package/src/esm/push_data.js +77 -0
  91. package/src/esm/script.js +277 -0
  92. package/src/esm/script_number.js +74 -0
  93. package/src/esm/script_signature.js +75 -0
  94. package/src/esm/transaction.js +550 -0
  95. package/src/esm/types.js +83 -0
  96. package/start-bip40.cjs +115 -0
@@ -0,0 +1,268 @@
1
+ 'use strict';
2
+ var __createBinding =
3
+ (this && this.__createBinding) ||
4
+ (Object.create
5
+ ? function (o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (
9
+ !desc ||
10
+ ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)
11
+ ) {
12
+ desc = {
13
+ enumerable: true,
14
+ get: function () {
15
+ return m[k];
16
+ },
17
+ };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }
21
+ : function (o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ });
25
+ var __setModuleDefault =
26
+ (this && this.__setModuleDefault) ||
27
+ (Object.create
28
+ ? function (o, v) {
29
+ Object.defineProperty(o, 'default', { enumerable: true, value: v });
30
+ }
31
+ : function (o, v) {
32
+ o['default'] = v;
33
+ });
34
+ var __importStar =
35
+ (this && this.__importStar) ||
36
+ function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null)
40
+ for (var k in mod)
41
+ if (k !== 'default' && Object.prototype.hasOwnProperty.call(mod, k))
42
+ __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, '__esModule', { value: true });
47
+ exports.Block = void 0;
48
+ const bufferutils_js_1 = require('./bufferutils.cjs');
49
+ const bcrypto = __importStar(require('./crypto.cjs'));
50
+ const merkle_js_1 = require('./merkle.cjs');
51
+ const transaction_js_1 = require('./transaction.cjs');
52
+ const v = __importStar(require('valibot'));
53
+ const tools = __importStar(require('uint8array-tools'));
54
+ const errorMerkleNoTxes = new TypeError(
55
+ 'Cannot compute merkle root for zero transactions',
56
+ );
57
+ const errorWitnessNotSegwit = new TypeError(
58
+ 'Cannot compute witness commit for non-segwit block',
59
+ );
60
+ class Block {
61
+ static fromBuffer(buffer) {
62
+ if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)');
63
+ const bufferReader = new bufferutils_js_1.BufferReader(buffer);
64
+ const block = new Block();
65
+ block.version = bufferReader.readInt32();
66
+ block.prevHash = bufferReader.readSlice(32);
67
+ block.merkleRoot = bufferReader.readSlice(32);
68
+ block.timestamp = bufferReader.readUInt32();
69
+ block.bits = bufferReader.readUInt32();
70
+ block.nonce = bufferReader.readUInt32();
71
+ if (buffer.length === 80) return block;
72
+ const readTransaction = () => {
73
+ const tx = transaction_js_1.Transaction.fromBuffer(
74
+ bufferReader.buffer.slice(bufferReader.offset),
75
+ true,
76
+ );
77
+ bufferReader.offset += tx.byteLength();
78
+ return tx;
79
+ };
80
+ const nTransactions = bufferReader.readVarInt();
81
+ block.transactions = [];
82
+ for (let i = 0; i < nTransactions; ++i) {
83
+ const tx = readTransaction();
84
+ block.transactions.push(tx);
85
+ }
86
+ const witnessCommit = block.getWitnessCommit();
87
+ // This Block contains a witness commit
88
+ if (witnessCommit) block.witnessCommit = witnessCommit;
89
+ return block;
90
+ }
91
+ static fromHex(hex) {
92
+ return Block.fromBuffer(tools.fromHex(hex));
93
+ }
94
+ static calculateTarget(bits) {
95
+ const exponent = ((bits & 0xff000000) >> 24) - 3;
96
+ const mantissa = bits & 0x007fffff;
97
+ const target = new Uint8Array(32);
98
+ target[29 - exponent] = (mantissa >> 16) & 0xff;
99
+ target[30 - exponent] = (mantissa >> 8) & 0xff;
100
+ target[31 - exponent] = mantissa & 0xff;
101
+ return target;
102
+ }
103
+ static calculateMerkleRoot(transactions, forWitness) {
104
+ v.parse(v.array(v.object({ getHash: v.function() })), transactions);
105
+ if (transactions.length === 0) throw errorMerkleNoTxes;
106
+ if (forWitness && !txesHaveWitnessCommit(transactions))
107
+ throw errorWitnessNotSegwit;
108
+ const hashes = transactions.map(transaction =>
109
+ transaction.getHash(forWitness),
110
+ );
111
+ const rootHash = (0, merkle_js_1.fastMerkleRoot)(hashes, bcrypto.hash256);
112
+ return forWitness
113
+ ? bcrypto.hash256(
114
+ tools.concat([rootHash, transactions[0].ins[0].witness[0]]),
115
+ )
116
+ : rootHash;
117
+ }
118
+ version = 1;
119
+ prevHash = undefined;
120
+ merkleRoot = undefined;
121
+ timestamp = 0;
122
+ witnessCommit = undefined;
123
+ bits = 0;
124
+ nonce = 0;
125
+ transactions = undefined;
126
+ getWitnessCommit() {
127
+ if (!txesHaveWitnessCommit(this.transactions)) return null;
128
+ // The merkle root for the witness data is in an OP_RETURN output.
129
+ // There is no rule for the index of the output, so use filter to find it.
130
+ // The root is prepended with 0xaa21a9ed so check for 0x6a24aa21a9ed
131
+ // If multiple commits are found, the output with highest index is assumed.
132
+ const witnessCommits = this.transactions[0].outs
133
+ .filter(
134
+ out =>
135
+ tools.compare(
136
+ out.script.slice(0, 6),
137
+ Uint8Array.from([0x6a, 0x24, 0xaa, 0x21, 0xa9, 0xed]),
138
+ ) === 0,
139
+ )
140
+ .map(out => out.script.slice(6, 38));
141
+ if (witnessCommits.length === 0) return null;
142
+ // Use the commit with the highest output (should only be one though)
143
+ const result = witnessCommits[witnessCommits.length - 1];
144
+ if (!(result instanceof Uint8Array && result.length === 32)) return null;
145
+ return result;
146
+ }
147
+ hasWitnessCommit() {
148
+ if (
149
+ this.witnessCommit instanceof Uint8Array &&
150
+ this.witnessCommit.length === 32
151
+ )
152
+ return true;
153
+ if (this.getWitnessCommit() !== null) return true;
154
+ return false;
155
+ }
156
+ hasWitness() {
157
+ return anyTxHasWitness(this.transactions);
158
+ }
159
+ weight() {
160
+ const base = this.byteLength(false, false);
161
+ const total = this.byteLength(false, true);
162
+ return base * 3 + total;
163
+ }
164
+ byteLength(headersOnly, allowWitness = true) {
165
+ if (headersOnly || !this.transactions) return 80;
166
+ return (
167
+ 80 +
168
+ bufferutils_js_1.varuint.encodingLength(this.transactions.length) +
169
+ this.transactions.reduce((a, x) => a + x.byteLength(allowWitness), 0)
170
+ );
171
+ }
172
+ getHash() {
173
+ return bcrypto.hash256(this.toBuffer(true));
174
+ }
175
+ getId() {
176
+ return tools.toHex((0, bufferutils_js_1.reverseBuffer)(this.getHash()));
177
+ }
178
+ getUTCDate() {
179
+ const date = new Date(0); // epoch
180
+ date.setUTCSeconds(this.timestamp);
181
+ return date;
182
+ }
183
+ // TODO: buffer, offset compatibility
184
+ toBuffer(headersOnly) {
185
+ const buffer = new Uint8Array(this.byteLength(headersOnly));
186
+ const bufferWriter = new bufferutils_js_1.BufferWriter(buffer);
187
+ bufferWriter.writeInt32(this.version);
188
+ bufferWriter.writeSlice(this.prevHash);
189
+ bufferWriter.writeSlice(this.merkleRoot);
190
+ bufferWriter.writeUInt32(this.timestamp);
191
+ bufferWriter.writeUInt32(this.bits);
192
+ bufferWriter.writeUInt32(this.nonce);
193
+ if (headersOnly || !this.transactions) return buffer;
194
+ const { bytes } = bufferutils_js_1.varuint.encode(
195
+ this.transactions.length,
196
+ buffer,
197
+ bufferWriter.offset,
198
+ );
199
+ bufferWriter.offset += bytes;
200
+ this.transactions.forEach(tx => {
201
+ const txSize = tx.byteLength(); // TODO: extract from toBuffer?
202
+ tx.toBuffer(buffer, bufferWriter.offset);
203
+ bufferWriter.offset += txSize;
204
+ });
205
+ return buffer;
206
+ }
207
+ toHex(headersOnly) {
208
+ return tools.toHex(this.toBuffer(headersOnly));
209
+ }
210
+ checkTxRoots() {
211
+ // If the Block has segwit transactions but no witness commit,
212
+ // there's no way it can be valid, so fail the check.
213
+ const hasWitnessCommit = this.hasWitnessCommit();
214
+ if (!hasWitnessCommit && this.hasWitness()) return false;
215
+ return (
216
+ this.__checkMerkleRoot() &&
217
+ (hasWitnessCommit ? this.__checkWitnessCommit() : true)
218
+ );
219
+ }
220
+ checkProofOfWork() {
221
+ const hash = (0, bufferutils_js_1.reverseBuffer)(this.getHash());
222
+ const target = Block.calculateTarget(this.bits);
223
+ return tools.compare(hash, target) <= 0;
224
+ }
225
+ __checkMerkleRoot() {
226
+ if (!this.transactions) throw errorMerkleNoTxes;
227
+ const actualMerkleRoot = Block.calculateMerkleRoot(this.transactions);
228
+ return tools.compare(this.merkleRoot, actualMerkleRoot) === 0;
229
+ }
230
+ __checkWitnessCommit() {
231
+ if (!this.transactions) throw errorMerkleNoTxes;
232
+ if (!this.hasWitnessCommit()) throw errorWitnessNotSegwit;
233
+ const actualWitnessCommit = Block.calculateMerkleRoot(
234
+ this.transactions,
235
+ true,
236
+ );
237
+ return tools.compare(this.witnessCommit, actualWitnessCommit) === 0;
238
+ }
239
+ }
240
+ exports.Block = Block;
241
+ function txesHaveWitnessCommit(transactions) {
242
+ return (
243
+ transactions instanceof Array &&
244
+ transactions[0] &&
245
+ transactions[0].ins &&
246
+ transactions[0].ins instanceof Array &&
247
+ transactions[0].ins[0] &&
248
+ transactions[0].ins[0].witness &&
249
+ transactions[0].ins[0].witness instanceof Array &&
250
+ transactions[0].ins[0].witness.length > 0
251
+ );
252
+ }
253
+ function anyTxHasWitness(transactions) {
254
+ return (
255
+ transactions instanceof Array &&
256
+ transactions.some(
257
+ tx =>
258
+ typeof tx === 'object' &&
259
+ tx.ins instanceof Array &&
260
+ tx.ins.some(
261
+ input =>
262
+ typeof input === 'object' &&
263
+ input.witness instanceof Array &&
264
+ input.witness.length > 0,
265
+ ),
266
+ )
267
+ );
268
+ }
@@ -0,0 +1,29 @@
1
+ import { Transaction } from './transaction.js';
2
+ export declare class Block {
3
+ static fromBuffer(buffer: Uint8Array): Block;
4
+ static fromHex(hex: string): Block;
5
+ static calculateTarget(bits: number): Uint8Array;
6
+ static calculateMerkleRoot(transactions: Transaction[], forWitness?: boolean): Uint8Array;
7
+ version: number;
8
+ prevHash?: Uint8Array;
9
+ merkleRoot?: Uint8Array;
10
+ timestamp: number;
11
+ witnessCommit?: Uint8Array;
12
+ bits: number;
13
+ nonce: number;
14
+ transactions?: Transaction[];
15
+ getWitnessCommit(): Uint8Array | null;
16
+ hasWitnessCommit(): boolean;
17
+ hasWitness(): boolean;
18
+ weight(): number;
19
+ byteLength(headersOnly?: boolean, allowWitness?: boolean): number;
20
+ getHash(): Uint8Array;
21
+ getId(): string;
22
+ getUTCDate(): Date;
23
+ toBuffer(headersOnly?: boolean): Uint8Array;
24
+ toHex(headersOnly?: boolean): string;
25
+ checkTxRoots(): boolean;
26
+ checkProofOfWork(): boolean;
27
+ private __checkMerkleRoot;
28
+ private __checkWitnessCommit;
29
+ }
@@ -0,0 +1,207 @@
1
+ 'use strict';
2
+ var __createBinding =
3
+ (this && this.__createBinding) ||
4
+ (Object.create
5
+ ? function (o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (
9
+ !desc ||
10
+ ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)
11
+ ) {
12
+ desc = {
13
+ enumerable: true,
14
+ get: function () {
15
+ return m[k];
16
+ },
17
+ };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }
21
+ : function (o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ });
25
+ var __setModuleDefault =
26
+ (this && this.__setModuleDefault) ||
27
+ (Object.create
28
+ ? function (o, v) {
29
+ Object.defineProperty(o, 'default', { enumerable: true, value: v });
30
+ }
31
+ : function (o, v) {
32
+ o['default'] = v;
33
+ });
34
+ var __importStar =
35
+ (this && this.__importStar) ||
36
+ function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null)
40
+ for (var k in mod)
41
+ if (k !== 'default' && Object.prototype.hasOwnProperty.call(mod, k))
42
+ __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, '__esModule', { value: true });
47
+ exports.BufferReader = exports.BufferWriter = exports.varuint = void 0;
48
+ exports.reverseBuffer = reverseBuffer;
49
+ exports.cloneBuffer = cloneBuffer;
50
+ const types = __importStar(require('./types.cjs'));
51
+ const varuint = __importStar(require('varuint-bitcoin'));
52
+ exports.varuint = varuint;
53
+ const v = __importStar(require('valibot'));
54
+ const tools = __importStar(require('uint8array-tools'));
55
+ const MAX_JS_NUMBER = 0x001fffffffffffff;
56
+ // https://github.com/feross/buffer/blob/master/index.js#L1127
57
+ function verifuint(value, max) {
58
+ if (typeof value !== 'number' && typeof value !== 'bigint')
59
+ throw new Error('cannot write a non-number as a number');
60
+ if (value < 0 && value < BigInt(0))
61
+ throw new Error('specified a negative value for writing an unsigned value');
62
+ if (value > max && value > BigInt(max))
63
+ throw new Error('RangeError: value out of range');
64
+ if (Math.floor(Number(value)) !== Number(value))
65
+ throw new Error('value has a fractional component');
66
+ }
67
+ /**
68
+ * Reverses the order of bytes in a buffer.
69
+ * @param buffer - The buffer to reverse.
70
+ * @returns A new buffer with the bytes reversed.
71
+ */
72
+ function reverseBuffer(buffer) {
73
+ if (buffer.length < 1) return buffer;
74
+ let j = buffer.length - 1;
75
+ let tmp = 0;
76
+ for (let i = 0; i < buffer.length / 2; i++) {
77
+ tmp = buffer[i];
78
+ buffer[i] = buffer[j];
79
+ buffer[j] = tmp;
80
+ j--;
81
+ }
82
+ return buffer;
83
+ }
84
+ function cloneBuffer(buffer) {
85
+ const clone = new Uint8Array(buffer.length);
86
+ clone.set(buffer);
87
+ return clone;
88
+ }
89
+ /**
90
+ * Helper class for serialization of bitcoin data types into a pre-allocated buffer.
91
+ */
92
+ class BufferWriter {
93
+ buffer;
94
+ offset;
95
+ static withCapacity(size) {
96
+ return new BufferWriter(new Uint8Array(size));
97
+ }
98
+ constructor(buffer, offset = 0) {
99
+ this.buffer = buffer;
100
+ this.offset = offset;
101
+ v.parse(v.tuple([types.BufferSchema, types.UInt32Schema]), [
102
+ buffer,
103
+ offset,
104
+ ]);
105
+ }
106
+ writeUInt8(i) {
107
+ this.offset = tools.writeUInt8(this.buffer, this.offset, i);
108
+ }
109
+ writeInt32(i) {
110
+ this.offset = tools.writeInt32(this.buffer, this.offset, i, 'LE');
111
+ }
112
+ writeInt64(i) {
113
+ this.offset = tools.writeInt64(this.buffer, this.offset, BigInt(i), 'LE');
114
+ }
115
+ writeUInt32(i) {
116
+ this.offset = tools.writeUInt32(this.buffer, this.offset, i, 'LE');
117
+ }
118
+ writeUInt64(i) {
119
+ this.offset = tools.writeUInt64(this.buffer, this.offset, BigInt(i), 'LE');
120
+ }
121
+ writeVarInt(i) {
122
+ const { bytes } = varuint.encode(i, this.buffer, this.offset);
123
+ this.offset += bytes;
124
+ }
125
+ writeSlice(slice) {
126
+ if (this.buffer.length < this.offset + slice.length) {
127
+ throw new Error('Cannot write slice out of bounds');
128
+ }
129
+ this.buffer.set(slice, this.offset);
130
+ this.offset += slice.length;
131
+ }
132
+ writeVarSlice(slice) {
133
+ this.writeVarInt(slice.length);
134
+ this.writeSlice(slice);
135
+ }
136
+ writeVector(vector) {
137
+ this.writeVarInt(vector.length);
138
+ vector.forEach(buf => this.writeVarSlice(buf));
139
+ }
140
+ end() {
141
+ if (this.buffer.length === this.offset) {
142
+ return this.buffer;
143
+ }
144
+ throw new Error(`buffer size ${this.buffer.length}, offset ${this.offset}`);
145
+ }
146
+ }
147
+ exports.BufferWriter = BufferWriter;
148
+ /**
149
+ * Helper class for reading of bitcoin data types from a buffer.
150
+ */
151
+ class BufferReader {
152
+ buffer;
153
+ offset;
154
+ constructor(buffer, offset = 0) {
155
+ this.buffer = buffer;
156
+ this.offset = offset;
157
+ v.parse(v.tuple([types.BufferSchema, types.UInt32Schema]), [
158
+ buffer,
159
+ offset,
160
+ ]);
161
+ }
162
+ readUInt8() {
163
+ const result = tools.readUInt8(this.buffer, this.offset);
164
+ this.offset++;
165
+ return result;
166
+ }
167
+ readInt32() {
168
+ const result = tools.readInt32(this.buffer, this.offset, 'LE');
169
+ this.offset += 4;
170
+ return result;
171
+ }
172
+ readUInt32() {
173
+ const result = tools.readUInt32(this.buffer, this.offset, 'LE');
174
+ this.offset += 4;
175
+ return result;
176
+ }
177
+ readInt64() {
178
+ const result = tools.readInt64(this.buffer, this.offset, 'LE');
179
+ this.offset += 8;
180
+ return result;
181
+ }
182
+ readVarInt() {
183
+ const { bigintValue, bytes } = varuint.decode(this.buffer, this.offset);
184
+ this.offset += bytes;
185
+ return bigintValue;
186
+ }
187
+ readSlice(n) {
188
+ verifuint(n, MAX_JS_NUMBER);
189
+ const num = Number(n);
190
+ if (this.buffer.length < this.offset + num) {
191
+ throw new Error('Cannot read slice out of bounds');
192
+ }
193
+ const result = this.buffer.slice(this.offset, this.offset + num);
194
+ this.offset += num;
195
+ return result;
196
+ }
197
+ readVarSlice() {
198
+ return this.readSlice(this.readVarInt());
199
+ }
200
+ readVector() {
201
+ const count = this.readVarInt();
202
+ const vector = [];
203
+ for (let i = 0; i < count; i++) vector.push(this.readVarSlice());
204
+ return vector;
205
+ }
206
+ }
207
+ exports.BufferReader = BufferReader;
@@ -0,0 +1,44 @@
1
+ import * as varuint from 'varuint-bitcoin';
2
+ export { varuint };
3
+ /**
4
+ * Reverses the order of bytes in a buffer.
5
+ * @param buffer - The buffer to reverse.
6
+ * @returns A new buffer with the bytes reversed.
7
+ */
8
+ export declare function reverseBuffer(buffer: Uint8Array): Uint8Array;
9
+ export declare function cloneBuffer(buffer: Uint8Array): Uint8Array;
10
+ /**
11
+ * Helper class for serialization of bitcoin data types into a pre-allocated buffer.
12
+ */
13
+ export declare class BufferWriter {
14
+ buffer: Uint8Array;
15
+ offset: number;
16
+ static withCapacity(size: number): BufferWriter;
17
+ constructor(buffer: Uint8Array, offset?: number);
18
+ writeUInt8(i: number): void;
19
+ writeInt32(i: number): void;
20
+ writeInt64(i: number | bigint): void;
21
+ writeUInt32(i: number): void;
22
+ writeUInt64(i: number | bigint): void;
23
+ writeVarInt(i: number): void;
24
+ writeSlice(slice: Uint8Array): void;
25
+ writeVarSlice(slice: Uint8Array): void;
26
+ writeVector(vector: Uint8Array[]): void;
27
+ end(): Uint8Array;
28
+ }
29
+ /**
30
+ * Helper class for reading of bitcoin data types from a buffer.
31
+ */
32
+ export declare class BufferReader {
33
+ buffer: Uint8Array;
34
+ offset: number;
35
+ constructor(buffer: Uint8Array, offset?: number);
36
+ readUInt8(): number;
37
+ readInt32(): number;
38
+ readUInt32(): number;
39
+ readInt64(): bigint;
40
+ readVarInt(): bigint;
41
+ readSlice(n: number | bigint): Uint8Array;
42
+ readVarSlice(): Uint8Array;
43
+ readVector(): Uint8Array[];
44
+ }