@btc-vision/bitcoin 6.3.6 → 6.4.1

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 (71) hide show
  1. package/.mocharc.json +13 -0
  2. package/browser/address.d.ts +1 -1
  3. package/browser/index.js +1 -1
  4. package/browser/index.js.LICENSE.txt +3 -3
  5. package/browser/networks.d.ts +1 -0
  6. package/build/address.d.ts +2 -1
  7. package/build/address.js +68 -13
  8. package/build/block.js +2 -2
  9. package/build/bufferutils.js +5 -5
  10. package/build/networks.d.ts +1 -0
  11. package/build/networks.js +11 -0
  12. package/build/psbt/psbtutils.js +2 -2
  13. package/build/psbt.js +3 -7
  14. package/package.json +26 -26
  15. package/src/address.ts +91 -15
  16. package/src/block.ts +2 -2
  17. package/src/bufferutils.ts +15 -7
  18. package/src/index.ts +86 -86
  19. package/src/networks.ts +12 -0
  20. package/src/psbt/bip371.ts +441 -441
  21. package/src/psbt/psbtutils.ts +320 -319
  22. package/src/psbt.ts +8 -8
  23. package/test/address.spec.ts +55 -77
  24. package/test/bitcoin.core.spec.ts +47 -69
  25. package/test/block.spec.ts +23 -46
  26. package/test/bufferutils.spec.ts +32 -95
  27. package/test/crypto.spec.ts +9 -15
  28. package/test/fixtures/address.json +3 -3
  29. package/test/integration/addresses.spec.ts +12 -24
  30. package/test/integration/bip32.spec.ts +10 -31
  31. package/test/integration/blocks.spec.ts +2 -2
  32. package/test/integration/cltv.spec.ts +21 -63
  33. package/test/integration/csv.spec.ts +30 -105
  34. package/test/integration/payments.spec.ts +16 -41
  35. package/test/integration/taproot.spec.ts +31 -75
  36. package/test/integration/transactions.spec.ts +37 -138
  37. package/test/payments.spec.ts +95 -106
  38. package/test/payments.utils.ts +20 -63
  39. package/test/psbt.spec.ts +100 -229
  40. package/test/script.spec.ts +26 -50
  41. package/test/script_number.spec.ts +6 -9
  42. package/test/script_signature.spec.ts +7 -7
  43. package/test/transaction.spec.ts +46 -96
  44. package/test/ts-node-register.js +3 -1
  45. package/test/tsconfig.json +4 -1
  46. package/test/types.spec.ts +7 -12
  47. package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +0 -1
  48. package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +0 -1
  49. package/.nyc_output/processinfo/index.json +0 -1
  50. package/test/address.spec.js +0 -124
  51. package/test/bitcoin.core.spec.js +0 -170
  52. package/test/block.spec.js +0 -141
  53. package/test/bufferutils.spec.js +0 -427
  54. package/test/crypto.spec.js +0 -41
  55. package/test/integration/_regtest.js +0 -7
  56. package/test/integration/addresses.spec.js +0 -116
  57. package/test/integration/bip32.spec.js +0 -85
  58. package/test/integration/blocks.spec.js +0 -26
  59. package/test/integration/cltv.spec.js +0 -199
  60. package/test/integration/csv.spec.js +0 -362
  61. package/test/integration/payments.spec.js +0 -98
  62. package/test/integration/taproot.spec.js +0 -532
  63. package/test/integration/transactions.spec.js +0 -561
  64. package/test/payments.spec.js +0 -97
  65. package/test/payments.utils.js +0 -190
  66. package/test/psbt.spec.js +0 -1044
  67. package/test/script.spec.js +0 -151
  68. package/test/script_number.spec.js +0 -24
  69. package/test/script_signature.spec.js +0 -52
  70. package/test/transaction.spec.js +0 -269
  71. package/test/types.spec.js +0 -46
@@ -1,125 +1,114 @@
1
- import * as assert from 'assert';
1
+ import assert from 'assert';
2
2
  import * as ecc from 'tiny-secp256k1';
3
3
  import { describe, it } from 'mocha';
4
- import { PaymentCreator } from '../src/payments';
5
- import * as u from './payments.utils';
6
- import { initEccLib } from '../src';
7
-
8
- ['embed', 'p2ms', 'p2pk', 'p2pkh', 'p2sh', 'p2wpkh', 'p2wsh', 'p2tr'].forEach(
9
- p => {
10
- describe(p, () => {
11
- beforeEach(() => {
12
- initEccLib(p === 'p2tr' ? ecc : undefined);
13
- });
14
- let fn: PaymentCreator;
15
- const payment = require('../src/payments/' + p);
16
- if (p === 'embed') {
17
- fn = payment.p2data;
18
- } else {
19
- fn = payment[p];
20
- }
4
+ import { initEccLib, PaymentCreator } from '../src/index.js';
5
+ import * as u from './payments.utils.js';
6
+ import fs from 'node:fs';
7
+ import { p2pk, p2wsh } from '../src/payments/index.js';
21
8
 
22
- const fixtures = require('./fixtures/' + p);
9
+ const require = async (name: string) => {
10
+ const mod = await import(name);
23
11
 
24
- fixtures.valid.forEach((f: any) => {
25
- it(f.description + ' as expected', () => {
26
- const args = u.preform(f.arguments);
27
- const actual = fn(args, f.options);
12
+ return mod.default || mod;
13
+ };
28
14
 
29
- u.equate(actual, f.expected, f.arguments);
30
- });
15
+ ['embed', 'p2ms', 'p2pk', 'p2pkh', 'p2sh', 'p2wpkh', 'p2wsh', 'p2tr'].forEach((p) => {
16
+ describe(p, async () => {
17
+ beforeEach(() => {
18
+ initEccLib(p === 'p2tr' ? ecc : undefined);
19
+ });
20
+ let fn: PaymentCreator;
21
+ const payment = await require('../src/payments/' + p);
22
+ if (p === 'embed') {
23
+ fn = payment.p2data;
24
+ } else {
25
+ fn = payment[p];
26
+ }
31
27
 
32
- it(f.description + ' as expected (no validation)', () => {
33
- const args = u.preform(f.arguments);
34
- const actual = fn(
35
- args,
36
- Object.assign({}, f.options, {
37
- validate: false,
38
- }),
39
- );
28
+ const fixtures = JSON.parse(fs.readFileSync('test/fixtures/' + p + '.json', 'utf8'));
29
+ fixtures.valid.forEach((f: any) => {
30
+ it(f.description + ' as expected', () => {
31
+ const args = u.preform(f.arguments);
32
+ const actual = fn(args, f.options);
40
33
 
41
- u.equate(actual, f.expected, f.arguments);
42
- });
34
+ u.equate(actual, f.expected, f.arguments);
43
35
  });
44
36
 
45
- fixtures.invalid.forEach((f: any) => {
46
- it(
47
- 'throws ' +
48
- f.exception +
49
- (f.description ? 'for ' + f.description : ''),
50
- () => {
51
- const args = u.preform(f.arguments);
52
-
53
- assert.throws(() => {
54
- fn(args, f.options);
55
- }, new RegExp(f.exception));
56
- },
37
+ it(f.description + ' as expected (no validation)', () => {
38
+ const args = u.preform(f.arguments);
39
+ const actual = fn(
40
+ args,
41
+ Object.assign({}, f.options, {
42
+ validate: false,
43
+ }),
57
44
  );
45
+
46
+ u.equate(actual, f.expected, f.arguments);
47
+ });
48
+ });
49
+
50
+ fixtures.invalid.forEach((f: any) => {
51
+ it('throws ' + f.exception + (f.description ? 'for ' + f.description : ''), () => {
52
+ const args = u.preform(f.arguments);
53
+
54
+ assert.throws(() => {
55
+ fn(args, f.options);
56
+ }, new RegExp(f.exception));
58
57
  });
58
+ });
59
59
 
60
- if (p === 'p2sh') {
61
- const p2wsh = require('../src/payments/p2wsh').p2wsh;
62
- const p2pk = require('../src/payments/p2pk').p2pk;
63
- it('properly assembles nested p2wsh with names', () => {
64
- const actual = fn({
65
- redeem: p2wsh({
66
- redeem: p2pk({
67
- pubkey: Buffer.from(
68
- '03e15819590382a9dd878f01e2f0cbce541564eb415e43b440472d883ecd283058',
69
- 'hex',
70
- ),
71
- }),
60
+ if (p === 'p2sh') {
61
+ it('properly assembles nested p2wsh with names', () => {
62
+ const actual = fn({
63
+ redeem: p2wsh({
64
+ redeem: p2pk({
65
+ pubkey: Buffer.from(
66
+ '03e15819590382a9dd878f01e2f0cbce541564eb415e43b440472d883ecd283058',
67
+ 'hex',
68
+ ),
72
69
  }),
73
- });
74
- assert.strictEqual(
75
- actual.address,
76
- '3MGbrbye4ttNUXM8WAvBFRKry4fkS9fjuw',
77
- );
78
- assert.strictEqual(actual.name, 'p2sh-p2wsh-p2pk');
79
- assert.strictEqual(actual.redeem!.name, 'p2wsh-p2pk');
80
- assert.strictEqual(actual.redeem!.redeem!.name, 'p2pk');
70
+ }),
81
71
  });
82
- }
72
+ assert.strictEqual(actual.address, '3MGbrbye4ttNUXM8WAvBFRKry4fkS9fjuw');
73
+ assert.strictEqual(actual.name, 'p2sh-p2wsh-p2pk');
74
+ assert.strictEqual(actual.redeem!.name, 'p2wsh-p2pk');
75
+ assert.strictEqual(actual.redeem!.redeem!.name, 'p2pk');
76
+ });
77
+ }
83
78
 
84
- // cross-verify dynamically too
85
- if (!fixtures.dynamic) return;
86
- const { depends, details } = fixtures.dynamic;
79
+ // cross-verify dynamically too
80
+ if (!fixtures.dynamic) return;
81
+ const { depends, details } = fixtures.dynamic;
87
82
 
88
- details.forEach((f: any) => {
89
- const detail = u.preform(f);
90
- const disabled: any = {};
91
- if (f.disabled)
92
- f.disabled.forEach((k: string) => {
93
- disabled[k] = true;
94
- });
83
+ details.forEach((f: any) => {
84
+ const detail = u.preform(f);
85
+ const disabled: any = {};
86
+ if (f.disabled)
87
+ f.disabled.forEach((k: string) => {
88
+ disabled[k] = true;
89
+ });
90
+
91
+ for (const key in depends) {
92
+ if (key in disabled) continue;
93
+ const dependencies = depends[key];
95
94
 
96
- for (const key in depends) {
97
- if (key in disabled) continue;
98
- const dependencies = depends[key];
99
-
100
- dependencies.forEach((dependency: any) => {
101
- if (!Array.isArray(dependency))
102
- dependency = [dependency];
103
-
104
- const args = {};
105
- dependency.forEach((d: any) => {
106
- u.from(d, detail, args);
107
- });
108
- const expected = u.from(key, detail);
109
-
110
- it(
111
- f.description +
112
- ', ' +
113
- key +
114
- ' derives from ' +
115
- JSON.stringify(dependency),
116
- () => {
117
- u.equate(fn(args), expected);
118
- },
119
- );
95
+ dependencies.forEach((dependency: any) => {
96
+ if (!Array.isArray(dependency)) dependency = [dependency];
97
+
98
+ const args = {};
99
+ dependency.forEach((d: any) => {
100
+ u.from(d, detail, args);
120
101
  });
121
- }
122
- });
102
+ const expected = u.from(key, detail);
103
+
104
+ it(
105
+ f.description + ', ' + key + ' derives from ' + JSON.stringify(dependency),
106
+ () => {
107
+ u.equate(fn(args), expected);
108
+ },
109
+ );
110
+ });
111
+ }
123
112
  });
124
- },
125
- );
113
+ });
114
+ });
@@ -1,6 +1,6 @@
1
1
  import * as t from 'assert';
2
- import * as BNETWORKS from '../src/networks';
3
- import * as bscript from '../src/script';
2
+ import * as BNETWORKS from '../src/networks.js';
3
+ import * as bscript from '../src/script.js';
4
4
 
5
5
  function tryHex(x: Buffer | Buffer[]): string | string[] {
6
6
  if (Buffer.isBuffer(x)) return x.toString('hex');
@@ -42,29 +42,12 @@ function carryOver(a: any, b: any): void {
42
42
 
43
43
  function equateBase(a: any, b: any, context: string): void {
44
44
  if ('output' in b)
45
- t.strictEqual(
46
- tryASM(a.output),
47
- tryASM(b.output),
48
- `Inequal ${context}output`,
49
- );
50
- if ('input' in b)
51
- t.strictEqual(
52
- tryASM(a.input),
53
- tryASM(b.input),
54
- `Inequal ${context}input`,
55
- );
45
+ t.strictEqual(tryASM(a.output), tryASM(b.output), `Inequal ${context}output`);
46
+ if ('input' in b) t.strictEqual(tryASM(a.input), tryASM(b.input), `Inequal ${context}input`);
56
47
  if ('witness' in b)
57
- t.deepStrictEqual(
58
- tryHex(a.witness),
59
- tryHex(b.witness),
60
- `Inequal ${context}witness`,
61
- );
48
+ t.deepStrictEqual(tryHex(a.witness), tryHex(b.witness), `Inequal ${context}witness`);
62
49
  if ('redeemVersion' in b)
63
- t.strictEqual(
64
- a.redeemVersion,
65
- b.redeemVersion,
66
- `Inequal ${context}redeemVersion`,
67
- );
50
+ t.strictEqual(a.redeemVersion, b.redeemVersion, `Inequal ${context}redeemVersion`);
68
51
  }
69
52
 
70
53
  export function equate(a: any, b: any, args?: any): void {
@@ -85,23 +68,15 @@ export function equate(a: any, b: any, args?: any): void {
85
68
 
86
69
  equateBase(a, b, '');
87
70
  if (b.redeem) equateBase(a.redeem, b.redeem, 'redeem.');
88
- if (b.network)
89
- t.deepStrictEqual(
90
- a.network,
91
- (BNETWORKS as any)[b.network],
92
- 'Inequal *.network',
93
- );
71
+ if (b.network) t.deepStrictEqual(a.network, (BNETWORKS as any)[b.network], 'Inequal *.network');
94
72
 
95
73
  // contextual
96
74
  if (b.signature === null) b.signature = undefined;
97
75
  if (b.signatures === null) b.signatures = undefined;
98
- if ('address' in b)
99
- t.strictEqual(a.address, b.address, 'Inequal *.address');
76
+ if ('address' in b) t.strictEqual(a.address, b.address, 'Inequal *.address');
100
77
  if ('name' in b) t.strictEqual(a.name, b.name, 'Inequal *.name');
101
- if ('hash' in b)
102
- t.strictEqual(tryHex(a.hash), tryHex(b.hash), 'Inequal *.hash');
103
- if ('pubkey' in b)
104
- t.strictEqual(tryHex(a.pubkey), tryHex(b.pubkey), 'Inequal *.pubkey');
78
+ if ('hash' in b) t.strictEqual(tryHex(a.hash), tryHex(b.hash), 'Inequal *.hash');
79
+ if ('pubkey' in b) t.strictEqual(tryHex(a.pubkey), tryHex(b.pubkey), 'Inequal *.pubkey');
105
80
  if ('internalPubkey' in b)
106
81
  t.strictEqual(
107
82
  tryHex(a.internalPubkey),
@@ -109,27 +84,14 @@ export function equate(a: any, b: any, args?: any): void {
109
84
  'Inequal *.internalPubkey',
110
85
  );
111
86
  if ('signature' in b)
112
- t.strictEqual(
113
- tryHex(a.signature),
114
- tryHex(b.signature),
115
- 'Inequal signature',
116
- );
87
+ t.strictEqual(tryHex(a.signature), tryHex(b.signature), 'Inequal signature');
117
88
  if ('m' in b) t.strictEqual(a.m, b.m, 'Inequal *.m');
118
89
  if ('n' in b) t.strictEqual(a.n, b.n, 'Inequal *.n');
119
90
  if ('pubkeys' in b)
120
- t.deepStrictEqual(
121
- tryHex(a.pubkeys),
122
- tryHex(b.pubkeys),
123
- 'Inequal *.pubkeys',
124
- );
91
+ t.deepStrictEqual(tryHex(a.pubkeys), tryHex(b.pubkeys), 'Inequal *.pubkeys');
125
92
  if ('signatures' in b)
126
- t.deepStrictEqual(
127
- tryHex(a.signatures),
128
- tryHex(b.signatures),
129
- 'Inequal *.signatures',
130
- );
131
- if ('data' in b)
132
- t.deepStrictEqual(tryHex(a.data), tryHex(b.data), 'Inequal *.data');
93
+ t.deepStrictEqual(tryHex(a.signatures), tryHex(b.signatures), 'Inequal *.signatures');
94
+ if ('data' in b) t.deepStrictEqual(tryHex(a.data), tryHex(b.data), 'Inequal *.data');
133
95
  }
134
96
 
135
97
  export function preform(x: any): any {
@@ -151,8 +113,7 @@ export function preform(x: any): any {
151
113
  if (x.data) x.data = x.data.map(fromHex);
152
114
  if (x.hash) x.hash = Buffer.from(x.hash, 'hex');
153
115
  if (x.pubkey) x.pubkey = Buffer.from(x.pubkey, 'hex');
154
- if (x.internalPubkey)
155
- x.internalPubkey = Buffer.from(x.internalPubkey, 'hex');
116
+ if (x.internalPubkey) x.internalPubkey = Buffer.from(x.internalPubkey, 'hex');
156
117
  if (x.signature) x.signature = Buffer.from(x.signature, 'hex');
157
118
  if (x.pubkeys) x.pubkeys = x.pubkeys.map(fromHex);
158
119
  if (x.signatures)
@@ -161,14 +122,10 @@ export function preform(x: any): any {
161
122
  });
162
123
  if (x.redeem) {
163
124
  x.redeem = Object.assign({}, x.redeem);
164
- if (typeof x.redeem.input === 'string')
165
- x.redeem.input = asmToBuffer(x.redeem.input);
166
- if (typeof x.redeem.output === 'string')
167
- x.redeem.output = asmToBuffer(x.redeem.output);
168
- if (Array.isArray(x.redeem.witness))
169
- x.redeem.witness = x.redeem.witness.map(fromHex);
170
- if (x.redeem.network)
171
- x.redeem.network = (BNETWORKS as any)[x.redeem.network];
125
+ if (typeof x.redeem.input === 'string') x.redeem.input = asmToBuffer(x.redeem.input);
126
+ if (typeof x.redeem.output === 'string') x.redeem.output = asmToBuffer(x.redeem.output);
127
+ if (Array.isArray(x.redeem.witness)) x.redeem.witness = x.redeem.witness.map(fromHex);
128
+ if (x.redeem.network) x.redeem.network = (BNETWORKS as any)[x.redeem.network];
172
129
  }
173
130
 
174
131
  if (x.scriptTree) x.scriptTree = convertScriptTree(x.scriptTree);
@@ -197,7 +154,7 @@ export function from(path: string, object: any, result?: any): any {
197
154
 
198
155
  export function convertScriptTree(scriptTree: any, leafVersion?: number): any {
199
156
  if (Array.isArray(scriptTree))
200
- return scriptTree.map(tr => convertScriptTree(tr, leafVersion));
157
+ return scriptTree.map((tr) => convertScriptTree(tr, leafVersion));
201
158
 
202
159
  const script = Object.assign({}, scriptTree);
203
160
  if (typeof script.output === 'string') {