@vbyte/btc-dev 1.0.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 +121 -0
- package/README.md +5 -0
- package/dist/class/index.d.ts +5 -0
- package/dist/class/index.js +5 -0
- package/dist/class/signer.d.ts +18 -0
- package/dist/class/signer.js +32 -0
- package/dist/class/tx.d.ts +38 -0
- package/dist/class/tx.js +73 -0
- package/dist/class/txin.d.ts +29 -0
- package/dist/class/txin.js +68 -0
- package/dist/class/txout.d.ts +18 -0
- package/dist/class/txout.js +38 -0
- package/dist/class/witness.d.ts +20 -0
- package/dist/class/witness.js +57 -0
- package/dist/const.d.ts +22 -0
- package/dist/const.js +36 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +10 -0
- package/dist/lib/address/encode.d.ts +3 -0
- package/dist/lib/address/encode.js +79 -0
- package/dist/lib/address/index.d.ts +20 -0
- package/dist/lib/address/index.js +21 -0
- package/dist/lib/address/p2pkh.d.ts +10 -0
- package/dist/lib/address/p2pkh.js +33 -0
- package/dist/lib/address/p2sh.d.ts +10 -0
- package/dist/lib/address/p2sh.js +33 -0
- package/dist/lib/address/p2tr.d.ts +8 -0
- package/dist/lib/address/p2tr.js +26 -0
- package/dist/lib/address/p2wpkh.d.ts +10 -0
- package/dist/lib/address/p2wpkh.js +34 -0
- package/dist/lib/address/p2wsh.d.ts +10 -0
- package/dist/lib/address/p2wsh.js +33 -0
- package/dist/lib/address/script.d.ts +5 -0
- package/dist/lib/address/script.js +46 -0
- package/dist/lib/address/util.d.ts +4 -0
- package/dist/lib/address/util.js +57 -0
- package/dist/lib/meta/index.d.ts +2 -0
- package/dist/lib/meta/index.js +2 -0
- package/dist/lib/meta/pointer.d.ts +42 -0
- package/dist/lib/meta/pointer.js +69 -0
- package/dist/lib/meta/scribe.d.ts +7 -0
- package/dist/lib/meta/scribe.js +192 -0
- package/dist/lib/psbt/encoder.d.ts +5 -0
- package/dist/lib/psbt/encoder.js +21 -0
- package/dist/lib/psbt/index.d.ts +4 -0
- package/dist/lib/psbt/index.js +4 -0
- package/dist/lib/psbt/meta.d.ts +3 -0
- package/dist/lib/psbt/meta.js +11 -0
- package/dist/lib/psbt/util.d.ts +5 -0
- package/dist/lib/psbt/util.js +44 -0
- package/dist/lib/psbt/validate.d.ts +2 -0
- package/dist/lib/psbt/validate.js +11 -0
- package/dist/lib/script/decode.d.ts +2 -0
- package/dist/lib/script/decode.js +55 -0
- package/dist/lib/script/encode.d.ts +6 -0
- package/dist/lib/script/encode.js +80 -0
- package/dist/lib/script/index.d.ts +126 -0
- package/dist/lib/script/index.js +17 -0
- package/dist/lib/script/util.d.ts +2 -0
- package/dist/lib/script/util.js +10 -0
- package/dist/lib/script/words.d.ts +116 -0
- package/dist/lib/script/words.js +164 -0
- package/dist/lib/sighash/index.d.ts +5 -0
- package/dist/lib/sighash/index.js +5 -0
- package/dist/lib/sighash/segwit.d.ts +3 -0
- package/dist/lib/sighash/segwit.js +89 -0
- package/dist/lib/sighash/sign.d.ts +3 -0
- package/dist/lib/sighash/sign.js +20 -0
- package/dist/lib/sighash/taproot.d.ts +9 -0
- package/dist/lib/sighash/taproot.js +124 -0
- package/dist/lib/sighash/util.d.ts +3 -0
- package/dist/lib/sighash/util.js +16 -0
- package/dist/lib/sighash/verify.d.ts +1 -0
- package/dist/lib/sighash/verify.js +1 -0
- package/dist/lib/taproot/cblock.d.ts +3 -0
- package/dist/lib/taproot/cblock.js +55 -0
- package/dist/lib/taproot/encode.d.ts +6 -0
- package/dist/lib/taproot/encode.js +26 -0
- package/dist/lib/taproot/index.d.ts +4 -0
- package/dist/lib/taproot/index.js +4 -0
- package/dist/lib/taproot/parse.d.ts +11 -0
- package/dist/lib/taproot/parse.js +47 -0
- package/dist/lib/taproot/tree.d.ts +3 -0
- package/dist/lib/taproot/tree.js +49 -0
- package/dist/lib/tx/create.d.ts +6 -0
- package/dist/lib/tx/create.js +54 -0
- package/dist/lib/tx/decode.d.ts +9 -0
- package/dist/lib/tx/decode.js +109 -0
- package/dist/lib/tx/encode.d.ts +15 -0
- package/dist/lib/tx/encode.js +94 -0
- package/dist/lib/tx/index.d.ts +10 -0
- package/dist/lib/tx/index.js +10 -0
- package/dist/lib/tx/locktime.d.ts +7 -0
- package/dist/lib/tx/locktime.js +37 -0
- package/dist/lib/tx/meta.d.ts +8 -0
- package/dist/lib/tx/meta.js +48 -0
- package/dist/lib/tx/parse.d.ts +2 -0
- package/dist/lib/tx/parse.js +12 -0
- package/dist/lib/tx/sequence.d.ts +7 -0
- package/dist/lib/tx/sequence.js +65 -0
- package/dist/lib/tx/size.d.ts +10 -0
- package/dist/lib/tx/size.js +48 -0
- package/dist/lib/tx/validate.d.ts +7 -0
- package/dist/lib/tx/validate.js +21 -0
- package/dist/lib/tx/witness.d.ts +3 -0
- package/dist/lib/tx/witness.js +85 -0
- package/dist/main.cjs +14625 -0
- package/dist/main.cjs.map +1 -0
- package/dist/module.mjs +14610 -0
- package/dist/module.mjs.map +1 -0
- package/dist/package.json +106 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/taproot.d.ts +18 -0
- package/dist/schema/taproot.js +9 -0
- package/dist/schema/tx.d.ts +278 -0
- package/dist/schema/tx.js +35 -0
- package/dist/script.js +15 -0
- package/dist/script.js.map +1 -0
- package/dist/types/address.d.ts +34 -0
- package/dist/types/address.js +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +9 -0
- package/dist/types/meta.d.ts +10 -0
- package/dist/types/meta.js +1 -0
- package/dist/types/psbt.d.ts +9 -0
- package/dist/types/psbt.js +1 -0
- package/dist/types/sighash.d.ts +14 -0
- package/dist/types/sighash.js +1 -0
- package/dist/types/taproot.d.ts +35 -0
- package/dist/types/taproot.js +1 -0
- package/dist/types/transaction.d.ts +81 -0
- package/dist/types/transaction.js +1 -0
- package/dist/types/txdata.d.ts +45 -0
- package/dist/types/txdata.js +1 -0
- package/dist/types/txmeta.d.ts +19 -0
- package/dist/types/txmeta.js +1 -0
- package/dist/types/witness.d.ts +30 -0
- package/dist/types/witness.js +1 -0
- package/package.json +106 -0
- package/src/class/index.ts +5 -0
- package/src/class/signer.ts +47 -0
- package/src/class/tx.ts +118 -0
- package/src/class/txin.ts +95 -0
- package/src/class/txout.ts +57 -0
- package/src/class/witness.ts +85 -0
- package/src/const.ts +43 -0
- package/src/index.ts +14 -0
- package/src/lib/address/encode.ts +183 -0
- package/src/lib/address/index.ts +24 -0
- package/src/lib/address/p2pkh.ts +65 -0
- package/src/lib/address/p2sh.ts +65 -0
- package/src/lib/address/p2tr.ts +51 -0
- package/src/lib/address/p2wpkh.ts +67 -0
- package/src/lib/address/p2wsh.ts +65 -0
- package/src/lib/address/script.ts +63 -0
- package/src/lib/address/util.ts +102 -0
- package/src/lib/meta/index.ts +2 -0
- package/src/lib/meta/pointer.ts +107 -0
- package/src/lib/meta/scribe.ts +251 -0
- package/src/lib/psbt/encoder.ts +24 -0
- package/src/lib/psbt/index.ts +4 -0
- package/src/lib/psbt/meta.ts +15 -0
- package/src/lib/psbt/util.ts +62 -0
- package/src/lib/psbt/validate.ts +18 -0
- package/src/lib/script/decode.ts +75 -0
- package/src/lib/script/encode.ts +130 -0
- package/src/lib/script/index.ts +26 -0
- package/src/lib/script/util.ts +78 -0
- package/src/lib/script/words.ts +182 -0
- package/src/lib/sighash/index.ts +5 -0
- package/src/lib/sighash/segwit.ts +152 -0
- package/src/lib/sighash/sign.ts +35 -0
- package/src/lib/sighash/taproot.ts +236 -0
- package/src/lib/sighash/util.ts +29 -0
- package/src/lib/sighash/verify.ts +83 -0
- package/src/lib/taproot/cblock.ts +95 -0
- package/src/lib/taproot/encode.ts +49 -0
- package/src/lib/taproot/index.ts +4 -0
- package/src/lib/taproot/parse.ts +65 -0
- package/src/lib/taproot/tree.ts +94 -0
- package/src/lib/tx/create.ts +82 -0
- package/src/lib/tx/decode.ts +145 -0
- package/src/lib/tx/encode.ts +154 -0
- package/src/lib/tx/index.ts +10 -0
- package/src/lib/tx/locktime.ts +57 -0
- package/src/lib/tx/meta.ts +73 -0
- package/src/lib/tx/parse.ts +16 -0
- package/src/lib/tx/sequence.ts +146 -0
- package/src/lib/tx/size.ts +77 -0
- package/src/lib/tx/validate.ts +36 -0
- package/src/lib/tx/witness.ts +122 -0
- package/src/schema/index.ts +2 -0
- package/src/schema/taproot.ts +12 -0
- package/src/schema/tx.ts +42 -0
- package/src/types/address.ts +39 -0
- package/src/types/index.ts +9 -0
- package/src/types/meta.ts +10 -0
- package/src/types/psbt.ts +15 -0
- package/src/types/sighash.ts +16 -0
- package/src/types/taproot.ts +40 -0
- package/src/types/transaction.ts +98 -0
- package/src/types/txdata.ts +53 -0
- package/src/types/txmeta.ts +25 -0
- package/src/types/witness.ts +36 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Buff } from '@vbyte/buff';
|
|
2
|
+
import { parse_tx_data } from './parse.js';
|
|
3
|
+
import { encode_tx_data, encode_tx_inputs, encode_tx_outputs, encode_tx_vout, encode_vin, encode_vin_witness } from './encode.js';
|
|
4
|
+
const WIT_FLAG_BYTES = 2;
|
|
5
|
+
const WIT_LENGTH_BYTE = 1;
|
|
6
|
+
export function get_vsize(bytes) {
|
|
7
|
+
const weight = Buff.bytes(bytes).length;
|
|
8
|
+
const remain = (weight % 4 > 0) ? 1 : 0;
|
|
9
|
+
return Math.floor(weight / 4) + remain;
|
|
10
|
+
}
|
|
11
|
+
export function get_txsize(txdata) {
|
|
12
|
+
const json = parse_tx_data(txdata);
|
|
13
|
+
const base = encode_tx_data(json, false).length;
|
|
14
|
+
const size = encode_tx_data(json, true).length;
|
|
15
|
+
const weight = base * 3 + size;
|
|
16
|
+
const remain = (weight % 4 > 0) ? 1 : 0;
|
|
17
|
+
const vsize = Math.floor(weight / 4) + remain;
|
|
18
|
+
return { base, real: size, vsize, weight };
|
|
19
|
+
}
|
|
20
|
+
export function get_vin_size(vin) {
|
|
21
|
+
const bytes = encode_tx_inputs(vin);
|
|
22
|
+
return bytes.length;
|
|
23
|
+
}
|
|
24
|
+
export function get_vout_size(vout) {
|
|
25
|
+
const bytes = encode_tx_outputs(vout);
|
|
26
|
+
return bytes.length;
|
|
27
|
+
}
|
|
28
|
+
export function get_segwit_size(txinputs) {
|
|
29
|
+
const segwit_data = txinputs
|
|
30
|
+
.filter(e => e.witness.length > 0)
|
|
31
|
+
.map(e => e.witness);
|
|
32
|
+
return WIT_FLAG_BYTES + segwit_data
|
|
33
|
+
.reduce((acc, e) => acc + encode_vin_witness(e).length, 0);
|
|
34
|
+
}
|
|
35
|
+
export function get_txin_size(txinput) {
|
|
36
|
+
const bytes = encode_vin(txinput);
|
|
37
|
+
return bytes.length;
|
|
38
|
+
}
|
|
39
|
+
export function get_txout_size(txoutput) {
|
|
40
|
+
const bytes = encode_tx_vout(txoutput);
|
|
41
|
+
return bytes.length;
|
|
42
|
+
}
|
|
43
|
+
export function get_witness_size(witness) {
|
|
44
|
+
const stack = witness.map(e => Buff.bytes(e));
|
|
45
|
+
const size = stack.reduce((prev, next) => prev + next.length, 0);
|
|
46
|
+
const vsize = Math.ceil(WIT_LENGTH_BYTE + size / 4);
|
|
47
|
+
return { size, vsize };
|
|
48
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SpendInput, TxData, TxInput, TxInputTemplate, TxOutput, TxTemplate } from '../../types/index.js';
|
|
2
|
+
export declare function assert_tx_template(txdata: unknown): asserts txdata is TxTemplate;
|
|
3
|
+
export declare function assert_has_prevouts(vin: TxInput[]): asserts vin is SpendInput[];
|
|
4
|
+
export declare function assert_tx_data(txdata: unknown): asserts txdata is TxData;
|
|
5
|
+
export declare function assert_tx_input(tx_input: unknown): asserts tx_input is TxInput;
|
|
6
|
+
export declare function assert_tx_output(tx_output: unknown): asserts tx_output is TxOutput;
|
|
7
|
+
export declare function assert_vin_template(vin_template: unknown): asserts vin_template is TxInputTemplate;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as Schema from '../../schema/index.js';
|
|
2
|
+
export function assert_tx_template(txdata) {
|
|
3
|
+
Schema.tx.tx_template.parse(txdata);
|
|
4
|
+
}
|
|
5
|
+
export function assert_has_prevouts(vin) {
|
|
6
|
+
if (vin.some(txin => txin.prevout === null)) {
|
|
7
|
+
throw new Error('transaction missing prevouts');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function assert_tx_data(txdata) {
|
|
11
|
+
Schema.tx.tx_data.parse(txdata);
|
|
12
|
+
}
|
|
13
|
+
export function assert_tx_input(tx_input) {
|
|
14
|
+
Schema.tx.tx_input.parse(tx_input);
|
|
15
|
+
}
|
|
16
|
+
export function assert_tx_output(tx_output) {
|
|
17
|
+
Schema.tx.tx_output.parse(tx_output);
|
|
18
|
+
}
|
|
19
|
+
export function assert_vin_template(vin_template) {
|
|
20
|
+
Schema.tx.vin_template.parse(vin_template);
|
|
21
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Buff } from '@vbyte/buff';
|
|
2
|
+
import { is_valid_script } from '../../lib/script/decode.js';
|
|
3
|
+
import { TAPLEAF_VERSIONS } from '../../const.js';
|
|
4
|
+
export function parse_witness_data(witness) {
|
|
5
|
+
const elems = witness.map(e => Buff.bytes(e));
|
|
6
|
+
const annex = parse_annex_data(elems);
|
|
7
|
+
if (annex !== null)
|
|
8
|
+
elems.pop();
|
|
9
|
+
const cblock = parse_cblock_data(elems);
|
|
10
|
+
if (cblock !== null)
|
|
11
|
+
elems.pop();
|
|
12
|
+
const type = parse_witness_type(elems, cblock);
|
|
13
|
+
const version = parse_witness_version(type);
|
|
14
|
+
const script = parse_witness_script(elems, type);
|
|
15
|
+
if (script !== null)
|
|
16
|
+
elems.pop();
|
|
17
|
+
const params = elems.map(e => e.hex);
|
|
18
|
+
return { annex, cblock, params, script, type, version };
|
|
19
|
+
}
|
|
20
|
+
function parse_annex_data(data) {
|
|
21
|
+
let elem = data.at(-1);
|
|
22
|
+
if (data.length > 1 &&
|
|
23
|
+
elem instanceof Uint8Array &&
|
|
24
|
+
elem[0] === 0x50) {
|
|
25
|
+
return new Buff(elem).hex;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function parse_cblock_data(data) {
|
|
32
|
+
let elem = data.at(-1);
|
|
33
|
+
if (data.length > 1 &&
|
|
34
|
+
elem instanceof Uint8Array &&
|
|
35
|
+
elem.length > 32 &&
|
|
36
|
+
TAPLEAF_VERSIONS.includes(elem[0] & 0xfe)) {
|
|
37
|
+
return new Buff(elem).hex;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function parse_witness_script(elems, type) {
|
|
44
|
+
let script;
|
|
45
|
+
switch (type) {
|
|
46
|
+
case 'p2tr-ts':
|
|
47
|
+
script = elems.at(-1);
|
|
48
|
+
case 'p2w-sh':
|
|
49
|
+
script = elems.at(-1);
|
|
50
|
+
}
|
|
51
|
+
return (script !== undefined) ? new Buff(script).hex : null;
|
|
52
|
+
}
|
|
53
|
+
function parse_witness_type(elems, cblock) {
|
|
54
|
+
let param_0 = elems.at(0), param_1 = elems.at(1), param_x = elems.at(-1);
|
|
55
|
+
if (cblock !== null && param_x !== undefined) {
|
|
56
|
+
return 'p2tr-ts';
|
|
57
|
+
}
|
|
58
|
+
else if (elems.length === 2 &&
|
|
59
|
+
param_0 !== undefined &&
|
|
60
|
+
param_1 !== undefined &&
|
|
61
|
+
param_0.length >= 64 &&
|
|
62
|
+
param_1.length === 33) {
|
|
63
|
+
return 'p2w-pkh';
|
|
64
|
+
}
|
|
65
|
+
else if (elems.length === 1 &&
|
|
66
|
+
param_0 !== undefined &&
|
|
67
|
+
param_0.length === 64) {
|
|
68
|
+
return 'p2tr-pk';
|
|
69
|
+
}
|
|
70
|
+
else if (elems.length > 1 &&
|
|
71
|
+
param_x !== undefined &&
|
|
72
|
+
is_valid_script(param_x)) {
|
|
73
|
+
return 'p2w-sh';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return 'unknown';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function parse_witness_version(type) {
|
|
80
|
+
if (type.startsWith('p2tr'))
|
|
81
|
+
return 1;
|
|
82
|
+
if (type.startsWith('p2w'))
|
|
83
|
+
return 0;
|
|
84
|
+
return null;
|
|
85
|
+
}
|