@btc-vision/bitcoin 6.5.1 → 6.5.3
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/browser/chunks/crypto-0PweVewC.js +2033 -0
- package/browser/chunks/{payments-BE4vwHhV.js → payments-CgasufRS.js} +410 -408
- package/browser/chunks/psbt-BIwOrKer.js +4096 -0
- package/browser/chunks/{script-COWGdiOo.js → script-CROJPzz_.js} +96 -96
- package/browser/chunks/{transaction-BiXwH2v4.js → transaction-DchBu35N.js} +158 -147
- package/browser/chunks/{utils-BKmkTzNZ.js → utils-CO5kmxe9.js} +225 -223
- package/browser/crypto.d.ts +1 -1
- package/browser/hooks/HookedSigner.d.ts +1 -1
- package/browser/index.d.ts +23 -1
- package/browser/index.js +6 -6
- package/browser/payments/index.d.ts +2 -2
- package/browser/payments/lazy.d.ts +1 -1
- package/browser/psbt/bip371.d.ts +5 -1
- package/browser/psbt.d.ts +1 -1
- package/browser/typeforce.d.ts +38 -0
- package/browser/types.d.ts +22 -20
- package/build/address.js +2 -2
- package/build/bip66.js +2 -2
- package/build/block.js +2 -2
- package/build/crypto.d.ts +1 -1
- package/build/crypto.js +2 -3
- package/build/hooks/HookedSigner.d.ts +1 -1
- package/build/index.d.ts +23 -1
- package/build/payments/bip341.js +1 -1
- package/build/payments/index.d.ts +2 -2
- package/build/payments/lazy.d.ts +1 -1
- package/build/payments/p2op.js +3 -3
- package/build/payments/p2pk.js +1 -1
- package/build/payments/p2pkh.js +3 -3
- package/build/payments/p2sh.js +3 -3
- package/build/payments/p2tr.js +9 -5
- package/build/payments/p2wpkh.js +3 -3
- package/build/payments/p2wsh.js +2 -2
- package/build/psbt/bip371.d.ts +5 -1
- package/build/psbt/bip371.js +10 -7
- package/build/psbt/psbtutils.js +5 -4
- package/build/psbt.d.ts +1 -1
- package/build/psbt.js +78 -45
- package/build/script.js +2 -2
- package/build/script_signature.js +7 -7
- package/build/transaction.js +22 -10
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types.d.ts +22 -20
- package/build/types.js +10 -9
- package/package.json +32 -57
- package/src/address.ts +2 -2
- package/src/bip66.ts +2 -2
- package/src/block.ts +8 -5
- package/src/crypto.ts +3 -4
- package/src/ecc_lib.ts +1 -1
- package/src/hooks/HookedSigner.ts +1 -1
- package/src/index.ts +34 -12
- package/src/payments/bip341.ts +1 -1
- package/src/payments/embed.ts +1 -2
- package/src/payments/index.ts +4 -4
- package/src/payments/lazy.ts +3 -3
- package/src/payments/p2op.ts +4 -3
- package/src/payments/p2pk.ts +1 -1
- package/src/payments/p2pkh.ts +3 -3
- package/src/payments/p2sh.ts +13 -5
- package/src/payments/p2tr.ts +8 -9
- package/src/payments/p2wpkh.ts +3 -3
- package/src/payments/p2wsh.ts +4 -4
- package/src/psbt/bip371.ts +22 -13
- package/src/psbt/psbtutils.ts +8 -5
- package/src/psbt.ts +127 -80
- package/src/script.ts +4 -4
- package/src/script_signature.ts +7 -7
- package/src/transaction.ts +31 -18
- package/src/typeforce.d.ts +38 -0
- package/src/types.ts +34 -29
- package/test/address.spec.ts +12 -4
- package/test/bitcoin.core.spec.ts +1 -1
- package/test/block.spec.ts +1 -1
- package/test/bufferutils.spec.ts +1 -1
- package/test/crypto.spec.ts +3 -2
- package/test/fixtures/address.json +1 -1
- package/test/integration/addresses.spec.ts +1 -1
- package/test/integration/bip32.spec.ts +2 -2
- package/test/integration/blocks.spec.ts +1 -1
- package/test/integration/cltv.spec.ts +3 -3
- package/test/integration/csv.spec.ts +3 -3
- package/test/integration/payments.spec.ts +1 -1
- package/test/integration/taproot.spec.ts +8 -7
- package/test/integration/transactions.spec.ts +2 -2
- package/test/payments.spec.ts +4 -3
- package/test/psbt.spec.ts +106 -74
- package/test/script.spec.ts +73 -7
- package/test/script_number.spec.ts +1 -1
- package/test/script_signature.spec.ts +1 -1
- package/test/transaction.spec.ts +1 -1
- package/test/tsconfig.json +1 -1
- package/test/types.spec.ts +1 -1
- package/vitest.config.ts +16 -0
- package/.babelrc +0 -13
- package/.mocharc.json +0 -13
- package/browser/chunks/crypto-C6FlKKmp.js +0 -2006
- package/browser/chunks/psbt-Dlosf9CT.js +0 -3853
- package/cjs/package.json +0 -3
- package/gulpfile.js +0 -42
- package/src/crypto/crypto-browser.js +0 -75
- package/test/ts-node-register.js +0 -7
- package/webpack.config.js +0 -79
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { B as
|
|
2
|
-
import { f as z, k as K, l as D, a as C, m as b, n as P, o as _, N as
|
|
3
|
-
import {
|
|
4
|
-
const { typeforce:
|
|
5
|
-
function
|
|
6
|
-
const t =
|
|
7
|
-
return
|
|
1
|
+
import { B as c, b as U, a as N, t as $ } from "./crypto-0PweVewC.js";
|
|
2
|
+
import { f as z, k as K, l as D, a as C, m as b, n as P, o as _, N as Q, S as W, g as v, p as V, B as A, r as M, F as J, q as x, h as tt } from "./utils-CO5kmxe9.js";
|
|
3
|
+
import { d as et, c as st, o as it } from "./script-CROJPzz_.js";
|
|
4
|
+
const { typeforce: p } = K;
|
|
5
|
+
function I(l) {
|
|
6
|
+
const t = l.length;
|
|
7
|
+
return v(t) + t;
|
|
8
8
|
}
|
|
9
|
-
function rt(
|
|
10
|
-
const t =
|
|
11
|
-
return
|
|
9
|
+
function rt(l) {
|
|
10
|
+
const t = l.length;
|
|
11
|
+
return v(t) + l.reduce((e, s) => e + I(s), 0);
|
|
12
12
|
}
|
|
13
|
-
const
|
|
13
|
+
const d = c.allocUnsafe(0), F = [], k = c.from(
|
|
14
14
|
"0000000000000000000000000000000000000000000000000000000000000000",
|
|
15
15
|
"hex"
|
|
16
|
-
),
|
|
16
|
+
), T = c.from(
|
|
17
17
|
"0000000000000000000000000000000000000000000000000000000000000001",
|
|
18
18
|
"hex"
|
|
19
|
-
), nt =
|
|
20
|
-
script:
|
|
19
|
+
), nt = c.from("ffffffffffffffff", "hex"), ot = {
|
|
20
|
+
script: d,
|
|
21
21
|
valueBuffer: nt
|
|
22
22
|
};
|
|
23
|
-
function ht(
|
|
24
|
-
return
|
|
23
|
+
function ht(l) {
|
|
24
|
+
return "value" in l;
|
|
25
25
|
}
|
|
26
26
|
class o {
|
|
27
27
|
constructor() {
|
|
@@ -70,28 +70,28 @@ class o {
|
|
|
70
70
|
const s = new z(t), i = new o();
|
|
71
71
|
i.version = s.readInt32();
|
|
72
72
|
const n = s.readUInt8(), r = s.readUInt8();
|
|
73
|
-
let
|
|
74
|
-
n === o.ADVANCED_TRANSACTION_MARKER && r === o.ADVANCED_TRANSACTION_FLAG ?
|
|
75
|
-
const
|
|
76
|
-
for (let
|
|
77
|
-
const
|
|
73
|
+
let f = !1;
|
|
74
|
+
n === o.ADVANCED_TRANSACTION_MARKER && r === o.ADVANCED_TRANSACTION_FLAG ? f = !0 : s.offset -= 2;
|
|
75
|
+
const u = s.readVarInt();
|
|
76
|
+
for (let S = 0; S < u; ++S) {
|
|
77
|
+
const m = s.readSlice(32), E = s.readUInt32(), y = s.readVarSlice(), L = s.readUInt32();
|
|
78
78
|
i.ins.push({
|
|
79
|
-
hash:
|
|
80
|
-
index:
|
|
81
|
-
script:
|
|
79
|
+
hash: m,
|
|
80
|
+
index: E,
|
|
81
|
+
script: y,
|
|
82
82
|
sequence: L,
|
|
83
|
-
witness:
|
|
83
|
+
witness: F
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
|
-
const
|
|
87
|
-
for (let
|
|
86
|
+
const g = s.readVarInt();
|
|
87
|
+
for (let S = 0; S < g; ++S)
|
|
88
88
|
i.outs.push({
|
|
89
89
|
value: s.readUInt64(),
|
|
90
90
|
script: s.readVarSlice()
|
|
91
91
|
});
|
|
92
|
-
if (
|
|
93
|
-
for (let
|
|
94
|
-
i.ins[
|
|
92
|
+
if (f) {
|
|
93
|
+
for (let S = 0; S < u; ++S)
|
|
94
|
+
i.ins[S].witness = s.readVector();
|
|
95
95
|
if (!i.hasWitnesses()) throw new Error("Transaction has superfluous witness data");
|
|
96
96
|
}
|
|
97
97
|
if (i.locktime = s.readUInt32(), e) return i;
|
|
@@ -100,10 +100,10 @@ class o {
|
|
|
100
100
|
return i;
|
|
101
101
|
}
|
|
102
102
|
static fromHex(t) {
|
|
103
|
-
return o.fromBuffer(
|
|
103
|
+
return o.fromBuffer(c.from(t, "hex"), !1);
|
|
104
104
|
}
|
|
105
105
|
static isCoinbaseHash(t) {
|
|
106
|
-
|
|
106
|
+
p(D, t);
|
|
107
107
|
for (let e = 0; e < 32; ++e)
|
|
108
108
|
if (t[e] !== 0) return !1;
|
|
109
109
|
return !0;
|
|
@@ -112,24 +112,24 @@ class o {
|
|
|
112
112
|
return this.ins.length === 1 && o.isCoinbaseHash(this.ins[0].hash);
|
|
113
113
|
}
|
|
114
114
|
addInput(t, e, s, i) {
|
|
115
|
-
return
|
|
115
|
+
return p(
|
|
116
116
|
C(
|
|
117
117
|
D,
|
|
118
118
|
b,
|
|
119
119
|
P(b),
|
|
120
120
|
P(_)
|
|
121
121
|
),
|
|
122
|
-
|
|
123
|
-
),
|
|
122
|
+
[t, e, s, i]
|
|
123
|
+
), Q(s) && (s = o.DEFAULT_SEQUENCE), this.ins.push({
|
|
124
124
|
hash: t,
|
|
125
125
|
index: e,
|
|
126
|
-
script: i ||
|
|
126
|
+
script: i || d,
|
|
127
127
|
sequence: s,
|
|
128
|
-
witness:
|
|
128
|
+
witness: F
|
|
129
129
|
}) - 1;
|
|
130
130
|
}
|
|
131
131
|
addOutput(t, e) {
|
|
132
|
-
return
|
|
132
|
+
return p(C(_, W), [t, e]), this.outs.push({
|
|
133
133
|
script: t,
|
|
134
134
|
value: e
|
|
135
135
|
}) - 1;
|
|
@@ -146,7 +146,7 @@ class o {
|
|
|
146
146
|
}
|
|
147
147
|
byteLength(t = !0) {
|
|
148
148
|
const e = t && this.hasWitnesses();
|
|
149
|
-
return (e ? 10 : 8) +
|
|
149
|
+
return (e ? 10 : 8) + v(this.ins.length) + v(this.outs.length) + this.ins.reduce((s, i) => s + 40 + I(i.script), 0) + this.outs.reduce((s, i) => s + 8 + I(i.script), 0) + (e ? this.ins.reduce((s, i) => s + rt(i.witness), 0) : 0);
|
|
150
150
|
}
|
|
151
151
|
clone() {
|
|
152
152
|
const t = new o();
|
|
@@ -170,108 +170,116 @@ class o {
|
|
|
170
170
|
* This hash can then be used to sign the provided transaction input.
|
|
171
171
|
*/
|
|
172
172
|
hashForSignature(t, e, s) {
|
|
173
|
-
if (
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
)
|
|
173
|
+
if (p(C(
|
|
174
|
+
b,
|
|
175
|
+
_,
|
|
176
|
+
/* types.UInt8 */
|
|
177
|
+
V
|
|
178
|
+
), [
|
|
179
|
+
t,
|
|
180
|
+
e,
|
|
181
|
+
s
|
|
182
|
+
]), t >= this.ins.length) return T;
|
|
183
|
+
const i = et(e);
|
|
184
|
+
if (!i) throw new Error("Could not decompile prevOutScript");
|
|
185
|
+
const n = st(
|
|
186
|
+
i.filter((u) => u !== it.OP_CODESEPARATOR)
|
|
187
|
+
), r = this.clone();
|
|
185
188
|
if ((s & 31) === o.SIGHASH_NONE)
|
|
186
|
-
|
|
187
|
-
g !== t && (
|
|
189
|
+
r.outs = [], r.ins.forEach((u, g) => {
|
|
190
|
+
g !== t && (u.sequence = 0);
|
|
188
191
|
});
|
|
189
192
|
else if ((s & 31) === o.SIGHASH_SINGLE) {
|
|
190
|
-
if (t >= this.outs.length) return
|
|
191
|
-
|
|
192
|
-
for (let
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
g !== t && (
|
|
193
|
+
if (t >= this.outs.length) return T;
|
|
194
|
+
r.outs.length = t + 1;
|
|
195
|
+
for (let u = 0; u < t; u++)
|
|
196
|
+
r.outs[u] = ot;
|
|
197
|
+
r.ins.forEach((u, g) => {
|
|
198
|
+
g !== t && (u.sequence = 0);
|
|
196
199
|
});
|
|
197
200
|
}
|
|
198
|
-
s & o.SIGHASH_ANYONECANPAY ? (
|
|
199
|
-
|
|
200
|
-
}),
|
|
201
|
-
const
|
|
202
|
-
return
|
|
201
|
+
s & o.SIGHASH_ANYONECANPAY ? (r.ins = [r.ins[t]], r.ins[0].script = n) : (r.ins.forEach((u) => {
|
|
202
|
+
u.script = d;
|
|
203
|
+
}), r.ins[t].script = n);
|
|
204
|
+
const f = c.allocUnsafe(r.byteLength(!1) + 4);
|
|
205
|
+
return f.writeInt32LE(s, f.length - 4), r.__toBuffer(f, 0, !1), U(f);
|
|
203
206
|
}
|
|
204
207
|
hashForWitnessV1(t, e, s, i, n, r) {
|
|
205
|
-
if (
|
|
208
|
+
if (p(
|
|
206
209
|
C(
|
|
207
210
|
b,
|
|
208
|
-
|
|
209
|
-
|
|
211
|
+
p.arrayOf(_),
|
|
212
|
+
p.arrayOf(W),
|
|
210
213
|
b
|
|
211
214
|
),
|
|
212
|
-
|
|
215
|
+
[t, e, s, i]
|
|
213
216
|
), s.length !== this.ins.length || e.length !== this.ins.length)
|
|
214
217
|
throw new Error("Must supply prevout script and value for all inputs");
|
|
215
|
-
const
|
|
216
|
-
let
|
|
217
|
-
if (!
|
|
218
|
-
let
|
|
219
|
-
this.ins.forEach((
|
|
220
|
-
|
|
221
|
-
}),
|
|
222
|
-
e.map(
|
|
223
|
-
), e.forEach((
|
|
218
|
+
const f = i === o.SIGHASH_DEFAULT ? o.SIGHASH_ALL : i & o.SIGHASH_OUTPUT_MASK, g = (i & o.SIGHASH_INPUT_MASK) === o.SIGHASH_ANYONECANPAY, S = f === o.SIGHASH_NONE, m = f === o.SIGHASH_SINGLE;
|
|
219
|
+
let E = d, y = d, L = d, O = d, G = d;
|
|
220
|
+
if (!g) {
|
|
221
|
+
let h = A.withCapacity(36 * this.ins.length);
|
|
222
|
+
this.ins.forEach((w) => {
|
|
223
|
+
h.writeSlice(w.hash), h.writeUInt32(w.index);
|
|
224
|
+
}), E = N(h.end()), h = A.withCapacity(8 * this.ins.length), s.forEach((w) => h.writeUInt64(w)), y = N(h.end()), h = A.withCapacity(
|
|
225
|
+
e.map(I).reduce((w, H) => w + H)
|
|
226
|
+
), e.forEach((w) => h.writeVarSlice(w)), L = N(h.end()), h = A.withCapacity(4 * this.ins.length), this.ins.forEach((w) => h.writeUInt32(w.sequence)), O = N(h.end());
|
|
224
227
|
}
|
|
225
|
-
if (
|
|
226
|
-
if (
|
|
227
|
-
const
|
|
228
|
-
|
|
228
|
+
if (S || m) {
|
|
229
|
+
if (m && t < this.outs.length) {
|
|
230
|
+
const h = this.outs[t], w = A.withCapacity(8 + I(h.script));
|
|
231
|
+
w.writeUInt64(h.value), w.writeVarSlice(h.script), G = N(w.end());
|
|
229
232
|
}
|
|
230
233
|
} else {
|
|
231
234
|
if (!this.outs.length)
|
|
232
235
|
throw new Error("Add outputs to the transaction before signing.");
|
|
233
|
-
const
|
|
234
|
-
this.outs.forEach((
|
|
235
|
-
|
|
236
|
-
}), G = N(
|
|
236
|
+
const h = this.outs.map((H) => 8 + I(H.script)).reduce((H, Z) => H + Z), w = A.withCapacity(h);
|
|
237
|
+
this.outs.forEach((H) => {
|
|
238
|
+
w.writeUInt64(H.value), w.writeVarSlice(H.script);
|
|
239
|
+
}), G = N(w.end());
|
|
237
240
|
}
|
|
238
|
-
const j = (n ? 2 : 0) + (r ? 1 : 0),
|
|
239
|
-
if (
|
|
240
|
-
const
|
|
241
|
-
|
|
241
|
+
const j = (n ? 2 : 0) + (r ? 1 : 0), X = 174 - (g ? 49 : 0) - (S ? 32 : 0) + (r ? 32 : 0) + (n ? 37 : 0), a = A.withCapacity(X);
|
|
242
|
+
if (a.writeUInt8(i), a.writeInt32(this.version), a.writeUInt32(this.locktime), a.writeSlice(E), a.writeSlice(y), a.writeSlice(L), a.writeSlice(O), S || m || a.writeSlice(G), a.writeUInt8(j), g) {
|
|
243
|
+
const h = this.ins[t];
|
|
244
|
+
a.writeSlice(h.hash), a.writeUInt32(h.index), a.writeUInt64(s[t]), a.writeVarSlice(e[t]), a.writeUInt32(h.sequence);
|
|
242
245
|
} else
|
|
243
|
-
|
|
246
|
+
a.writeUInt32(t);
|
|
244
247
|
if (r) {
|
|
245
|
-
const
|
|
246
|
-
|
|
248
|
+
const h = A.withCapacity(I(r));
|
|
249
|
+
h.writeVarSlice(r), a.writeSlice(N(h.end()));
|
|
247
250
|
}
|
|
248
|
-
return
|
|
251
|
+
return m && a.writeSlice(G), n && (a.writeSlice(n), a.writeUInt8(0), a.writeUInt32(4294967295)), $(
|
|
249
252
|
"TapSighash",
|
|
250
|
-
|
|
253
|
+
c.concat([c.from([0]), a.end()])
|
|
251
254
|
);
|
|
252
255
|
}
|
|
253
256
|
hashForWitnessV0(t, e, s, i) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
257
|
+
p(C(b, _, W, b), [
|
|
258
|
+
t,
|
|
259
|
+
e,
|
|
260
|
+
s,
|
|
261
|
+
i
|
|
262
|
+
]);
|
|
263
|
+
let n = c.from([]), r, f = k, u = k, g = k;
|
|
264
|
+
if (i & o.SIGHASH_ANYONECANPAY || (n = c.allocUnsafe(36 * this.ins.length), r = new A(n, 0), this.ins.forEach((m) => {
|
|
265
|
+
r.writeSlice(m.hash), r.writeUInt32(m.index);
|
|
266
|
+
}), u = U(n)), !(i & o.SIGHASH_ANYONECANPAY) && (i & 31) !== o.SIGHASH_SINGLE && (i & 31) !== o.SIGHASH_NONE && (n = c.allocUnsafe(4 * this.ins.length), r = new A(n, 0), this.ins.forEach((m) => {
|
|
267
|
+
r.writeUInt32(m.sequence);
|
|
268
|
+
}), g = U(n)), (i & 31) !== o.SIGHASH_SINGLE && (i & 31) !== o.SIGHASH_NONE) {
|
|
269
|
+
const m = this.outs.reduce((E, y) => E + 8 + I(y.script), 0);
|
|
270
|
+
n = c.allocUnsafe(m), r = new A(n, 0), this.outs.forEach((E) => {
|
|
271
|
+
r.writeUInt64(E.value), r.writeVarSlice(E.script);
|
|
272
|
+
}), f = U(n);
|
|
265
273
|
} else if ((i & 31) === o.SIGHASH_SINGLE && t < this.outs.length) {
|
|
266
|
-
const
|
|
267
|
-
n =
|
|
274
|
+
const m = this.outs[t];
|
|
275
|
+
n = c.allocUnsafe(8 + I(m.script)), r = new A(n, 0), r.writeUInt64(m.value), r.writeVarSlice(m.script), f = U(n);
|
|
268
276
|
}
|
|
269
|
-
n =
|
|
270
|
-
const
|
|
271
|
-
return r.writeInt32(this.version), r.writeSlice(
|
|
277
|
+
n = c.allocUnsafe(156 + I(e)), r = new A(n, 0);
|
|
278
|
+
const S = this.ins[t];
|
|
279
|
+
return r.writeInt32(this.version), r.writeSlice(u), r.writeSlice(g), r.writeSlice(S.hash), r.writeUInt32(S.index), r.writeVarSlice(e), r.writeUInt64(s), r.writeUInt32(S.sequence), r.writeSlice(f), r.writeUInt32(this.locktime), r.writeUInt32(i), U(n);
|
|
272
280
|
}
|
|
273
281
|
getHash(t) {
|
|
274
|
-
return t && this.isCoinbase() ?
|
|
282
|
+
return t && this.isCoinbase() ? c.alloc(32, 0) : U(this.__toBuffer(void 0, void 0, t));
|
|
275
283
|
}
|
|
276
284
|
getId() {
|
|
277
285
|
return M(this.getHash(!1)).toString("hex");
|
|
@@ -283,14 +291,14 @@ class o {
|
|
|
283
291
|
return this.toBuffer(void 0, void 0).toString("hex");
|
|
284
292
|
}
|
|
285
293
|
setInputScript(t, e) {
|
|
286
|
-
|
|
294
|
+
p(C(V, _), [t, e]), this.ins[t].script = e;
|
|
287
295
|
}
|
|
288
296
|
setWitness(t, e) {
|
|
289
|
-
|
|
297
|
+
p(C(V, [_]), [t, e]), this.ins[t].witness = e;
|
|
290
298
|
}
|
|
291
299
|
__toBuffer(t, e, s = !1) {
|
|
292
|
-
t || (t =
|
|
293
|
-
const i = new
|
|
300
|
+
t || (t = c.allocUnsafe(this.byteLength(s)));
|
|
301
|
+
const i = new A(t, e || 0);
|
|
294
302
|
i.writeInt32(this.version);
|
|
295
303
|
const n = s && this.hasWitnesses();
|
|
296
304
|
return n && (i.writeUInt8(o.ADVANCED_TRANSACTION_MARKER), i.writeUInt8(o.ADVANCED_TRANSACTION_FLAG)), i.writeVarInt(this.ins.length), this.ins.forEach((r) => {
|
|
@@ -299,57 +307,60 @@ class o {
|
|
|
299
307
|
ht(r) ? i.writeUInt64(r.value) : i.writeSlice(r.valueBuffer), i.writeVarSlice(r.script);
|
|
300
308
|
}), n && this.ins.forEach((r) => {
|
|
301
309
|
i.writeVector(r.witness);
|
|
302
|
-
}), i.writeUInt32(this.locktime), e !== void 0 ? t.
|
|
310
|
+
}), i.writeUInt32(this.locktime), e !== void 0 ? t.subarray(e, i.offset) : t;
|
|
303
311
|
}
|
|
304
312
|
}
|
|
305
313
|
const wt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
306
314
|
__proto__: null,
|
|
307
315
|
Transaction: o
|
|
308
|
-
}, Symbol.toStringTag, { value: "Module" })), { typeforce: ct } = K, B = new TypeError("Cannot compute merkle root for zero transactions"),
|
|
309
|
-
class
|
|
316
|
+
}, Symbol.toStringTag, { value: "Module" })), { typeforce: ct } = K, B = new TypeError("Cannot compute merkle root for zero transactions"), Y = new TypeError("Cannot compute witness commit for non-segwit block");
|
|
317
|
+
class R {
|
|
310
318
|
constructor() {
|
|
311
319
|
this.version = 1, this.prevHash = void 0, this.merkleRoot = void 0, this.timestamp = 0, this.witnessCommit = void 0, this.bits = 0, this.nonce = 0, this.transactions = void 0;
|
|
312
320
|
}
|
|
313
321
|
static fromBuffer(t) {
|
|
314
322
|
if (t.length < 80) throw new Error("Buffer too small (< 80 bytes)");
|
|
315
|
-
const e = new z(t), s = new
|
|
323
|
+
const e = new z(t), s = new R();
|
|
316
324
|
if (s.version = e.readInt32(), s.prevHash = e.readSlice(32), s.merkleRoot = e.readSlice(32), s.timestamp = e.readUInt32(), s.bits = e.readUInt32(), s.nonce = e.readUInt32(), t.length === 80) return s;
|
|
317
325
|
const i = () => {
|
|
318
|
-
const
|
|
319
|
-
|
|
326
|
+
const f = o.fromBuffer(
|
|
327
|
+
e.buffer.subarray(e.offset),
|
|
328
|
+
!0
|
|
329
|
+
);
|
|
330
|
+
return e.offset += f.byteLength(), f;
|
|
320
331
|
}, n = e.readVarInt();
|
|
321
332
|
s.transactions = [];
|
|
322
|
-
for (let
|
|
323
|
-
const
|
|
324
|
-
s.transactions.push(
|
|
333
|
+
for (let f = 0; f < n; ++f) {
|
|
334
|
+
const u = i();
|
|
335
|
+
s.transactions.push(u);
|
|
325
336
|
}
|
|
326
337
|
const r = s.getWitnessCommit();
|
|
327
338
|
return r && (s.witnessCommit = r), s;
|
|
328
339
|
}
|
|
329
340
|
static fromHex(t) {
|
|
330
|
-
return
|
|
341
|
+
return R.fromBuffer(c.from(t, "hex"));
|
|
331
342
|
}
|
|
332
343
|
static calculateTarget(t) {
|
|
333
|
-
const e = ((t & 4278190080) >> 24) - 3, s = t & 8388607, i =
|
|
344
|
+
const e = ((t & 4278190080) >> 24) - 3, s = t & 8388607, i = c.alloc(32, 0);
|
|
334
345
|
return i.writeUIntBE(s, 29 - e, 3), i;
|
|
335
346
|
}
|
|
336
347
|
static calculateMerkleRoot(t, e) {
|
|
337
|
-
if (ct([{ getHash:
|
|
338
|
-
if (e && !
|
|
339
|
-
const s = t.map((n) => n.getHash(e)), i =
|
|
340
|
-
return e ?
|
|
348
|
+
if (ct([{ getHash: J }], t), t.length === 0) throw B;
|
|
349
|
+
if (e && !q(t)) throw Y;
|
|
350
|
+
const s = t.map((n) => n.getHash(e)), i = x(s, U);
|
|
351
|
+
return e ? U(c.concat([i, t[0].ins[0].witness[0]])) : i;
|
|
341
352
|
}
|
|
342
353
|
getWitnessCommit() {
|
|
343
|
-
if (!
|
|
354
|
+
if (!q(this.transactions)) return null;
|
|
344
355
|
const t = this.transactions[0].outs.filter(
|
|
345
|
-
(s) => s.script.
|
|
346
|
-
).map((s) => s.script.
|
|
356
|
+
(s) => s.script.subarray(0, 6).equals(c.from("6a24aa21a9ed", "hex"))
|
|
357
|
+
).map((s) => s.script.subarray(6, 38));
|
|
347
358
|
if (t.length === 0) return null;
|
|
348
359
|
const e = t[t.length - 1];
|
|
349
|
-
return e instanceof
|
|
360
|
+
return e instanceof c && e.length === 32 ? e : null;
|
|
350
361
|
}
|
|
351
362
|
hasWitnessCommit() {
|
|
352
|
-
return this.witnessCommit instanceof
|
|
363
|
+
return this.witnessCommit instanceof c && this.witnessCommit.length === 32 || this.getWitnessCommit() !== null;
|
|
353
364
|
}
|
|
354
365
|
hasWitness() {
|
|
355
366
|
return at(this.transactions);
|
|
@@ -359,10 +370,10 @@ class y {
|
|
|
359
370
|
return t * 3 + e;
|
|
360
371
|
}
|
|
361
372
|
byteLength(t, e = !0) {
|
|
362
|
-
return t || !this.transactions ? 80 : 80 +
|
|
373
|
+
return t || !this.transactions ? 80 : 80 + v(this.transactions.length) + this.transactions.reduce((s, i) => s + i.byteLength(e), 0);
|
|
363
374
|
}
|
|
364
375
|
getHash() {
|
|
365
|
-
return
|
|
376
|
+
return U(this.toBuffer(!0));
|
|
366
377
|
}
|
|
367
378
|
getId() {
|
|
368
379
|
return M(this.getHash()).toString("hex");
|
|
@@ -373,7 +384,7 @@ class y {
|
|
|
373
384
|
}
|
|
374
385
|
// TODO: buffer, offset compatibility
|
|
375
386
|
toBuffer(t) {
|
|
376
|
-
const e =
|
|
387
|
+
const e = c.allocUnsafe(this.byteLength(t)), s = new A(e);
|
|
377
388
|
if (s.writeInt32(this.version), s.writeSlice(this.prevHash), s.writeSlice(this.merkleRoot), s.writeUInt32(this.timestamp), s.writeUInt32(this.bits), s.writeUInt32(this.nonce), t || !this.transactions) return e;
|
|
378
389
|
const i = tt(this.transactions.length, e, s.offset);
|
|
379
390
|
return s.offset += i.bytes, this.transactions.forEach((n) => {
|
|
@@ -389,33 +400,33 @@ class y {
|
|
|
389
400
|
return !t && this.hasWitness() ? !1 : this.__checkMerkleRoot() && (t ? this.__checkWitnessCommit() : !0);
|
|
390
401
|
}
|
|
391
402
|
checkProofOfWork() {
|
|
392
|
-
const t = M(this.getHash()), e =
|
|
403
|
+
const t = M(this.getHash()), e = R.calculateTarget(this.bits);
|
|
393
404
|
return t.compare(e) <= 0;
|
|
394
405
|
}
|
|
395
406
|
__checkMerkleRoot() {
|
|
396
407
|
if (!this.transactions) throw B;
|
|
397
|
-
const t =
|
|
408
|
+
const t = R.calculateMerkleRoot(this.transactions);
|
|
398
409
|
return this.merkleRoot.compare(t) === 0;
|
|
399
410
|
}
|
|
400
411
|
__checkWitnessCommit() {
|
|
401
412
|
if (!this.transactions) throw B;
|
|
402
|
-
if (!this.hasWitnessCommit()) throw
|
|
403
|
-
const t =
|
|
413
|
+
if (!this.hasWitnessCommit()) throw Y;
|
|
414
|
+
const t = R.calculateMerkleRoot(this.transactions, !0);
|
|
404
415
|
return this.witnessCommit.compare(t) === 0;
|
|
405
416
|
}
|
|
406
417
|
}
|
|
407
|
-
function
|
|
408
|
-
return
|
|
418
|
+
function q(l) {
|
|
419
|
+
return l instanceof Array && l[0] && l[0].ins && l[0].ins instanceof Array && l[0].ins[0] && l[0].ins[0].witness && l[0].ins[0].witness instanceof Array && l[0].ins[0].witness.length > 0;
|
|
409
420
|
}
|
|
410
|
-
function at(
|
|
411
|
-
return
|
|
421
|
+
function at(l) {
|
|
422
|
+
return l instanceof Array && l.some(
|
|
412
423
|
(t) => typeof t == "object" && t.ins instanceof Array && t.ins.some(
|
|
413
424
|
(e) => typeof e == "object" && e.witness instanceof Array && e.witness.length > 0
|
|
414
425
|
)
|
|
415
426
|
);
|
|
416
427
|
}
|
|
417
428
|
export {
|
|
418
|
-
|
|
429
|
+
R as B,
|
|
419
430
|
o as T,
|
|
420
431
|
wt as a
|
|
421
432
|
};
|