@btc-vision/bitcoin 6.3.0 → 6.3.2

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 (260) hide show
  1. package/.babelrc +4 -0
  2. package/.gitattributes +2 -0
  3. package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  4. package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.prettierrc.json +12 -0
  7. package/CHANGELOG.md +403 -0
  8. package/CONTRIBUTING.md +83 -0
  9. package/browser/address.d.ts +16 -0
  10. package/{src → browser}/bip66.d.ts +6 -7
  11. package/{src → browser}/block.d.ts +29 -30
  12. package/{src → browser}/bufferutils.d.ts +34 -54
  13. package/browser/crypto/crypto.d.ts +1 -0
  14. package/{src → browser}/crypto.d.ts +13 -18
  15. package/browser/ecc_lib.d.ts +3 -0
  16. package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
  17. package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
  18. package/browser/hooks/SignatureManager.d.ts +13 -0
  19. package/browser/index.d.ts +58 -0
  20. package/browser/index.js +2 -0
  21. package/browser/index.js.LICENSE.txt +14 -0
  22. package/browser/merkle.d.ts +1 -0
  23. package/browser/networks.d.ts +23 -0
  24. package/{src → browser}/ops.d.ts +126 -126
  25. package/browser/payments/bip341.d.ts +23 -0
  26. package/browser/payments/embed.d.ts +2 -0
  27. package/browser/payments/index.d.ts +41 -0
  28. package/{src → browser}/payments/lazy.d.ts +2 -2
  29. package/browser/payments/p2ms.d.ts +2 -0
  30. package/browser/payments/p2pk.d.ts +2 -0
  31. package/browser/payments/p2pkh.d.ts +2 -0
  32. package/browser/payments/p2sh.d.ts +2 -0
  33. package/browser/payments/p2tr.d.ts +2 -0
  34. package/browser/payments/p2wpkh.d.ts +2 -0
  35. package/browser/payments/p2wsh.d.ts +2 -0
  36. package/browser/psbt/bip371.d.ts +16 -0
  37. package/browser/psbt/psbtutils.d.ts +26 -0
  38. package/{src → browser}/psbt.d.ts +167 -235
  39. package/browser/push_data.d.ts +7 -0
  40. package/browser/script.d.ts +17 -0
  41. package/browser/script_number.d.ts +2 -0
  42. package/browser/script_signature.d.ts +7 -0
  43. package/{src → browser}/transaction.d.ts +48 -60
  44. package/{src → browser}/types.d.ts +37 -54
  45. package/build/address.d.ts +16 -0
  46. package/build/address.js +148 -0
  47. package/build/bip66.d.ts +6 -0
  48. package/build/bip66.js +99 -0
  49. package/build/block.d.ts +29 -0
  50. package/build/block.js +181 -0
  51. package/build/bufferutils.d.ts +34 -0
  52. package/build/bufferutils.js +141 -0
  53. package/build/crypto/crypto.d.ts +1 -0
  54. package/build/crypto/crypto.js +1 -0
  55. package/build/crypto.d.ts +13 -0
  56. package/build/crypto.js +87 -0
  57. package/build/ecc_lib.d.ts +3 -0
  58. package/build/ecc_lib.js +61 -0
  59. package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
  60. package/build/hooks/AdvancedSignatureManager.js +52 -0
  61. package/build/hooks/HookedSigner.d.ts +4 -0
  62. package/build/hooks/HookedSigner.js +64 -0
  63. package/build/hooks/SignatureManager.d.ts +13 -0
  64. package/build/hooks/SignatureManager.js +45 -0
  65. package/build/index.d.ts +58 -0
  66. package/build/index.js +32 -0
  67. package/build/merkle.d.ts +1 -0
  68. package/build/merkle.js +19 -0
  69. package/build/networks.d.ts +23 -0
  70. package/build/networks.js +121 -0
  71. package/build/ops.d.ts +126 -0
  72. package/{src → build}/ops.js +127 -131
  73. package/build/payments/bip341.d.ts +23 -0
  74. package/build/payments/bip341.js +82 -0
  75. package/build/payments/embed.d.ts +2 -0
  76. package/build/payments/embed.js +39 -0
  77. package/build/payments/index.d.ts +41 -0
  78. package/build/payments/index.js +10 -0
  79. package/build/payments/lazy.d.ts +2 -0
  80. package/{src → build}/payments/lazy.js +28 -32
  81. package/build/payments/p2ms.d.ts +2 -0
  82. package/{src → build}/payments/p2ms.js +128 -158
  83. package/build/payments/p2pk.d.ts +2 -0
  84. package/build/payments/p2pk.js +68 -0
  85. package/build/payments/p2pkh.d.ts +2 -0
  86. package/build/payments/p2pkh.js +135 -0
  87. package/build/payments/p2sh.d.ts +2 -0
  88. package/build/payments/p2sh.js +175 -0
  89. package/build/payments/p2tr.d.ts +2 -0
  90. package/build/payments/p2tr.js +254 -0
  91. package/build/payments/p2wpkh.d.ts +2 -0
  92. package/build/payments/p2wpkh.js +130 -0
  93. package/build/payments/p2wsh.d.ts +2 -0
  94. package/build/payments/p2wsh.js +180 -0
  95. package/build/psbt/bip371.d.ts +16 -0
  96. package/build/psbt/bip371.js +246 -0
  97. package/build/psbt/psbtutils.d.ts +26 -0
  98. package/build/psbt/psbtutils.js +170 -0
  99. package/build/psbt.d.ts +167 -0
  100. package/build/psbt.js +1305 -0
  101. package/build/push_data.d.ts +7 -0
  102. package/build/push_data.js +57 -0
  103. package/build/script.d.ts +17 -0
  104. package/build/script.js +167 -0
  105. package/build/script_number.d.ts +2 -0
  106. package/build/script_number.js +49 -0
  107. package/build/script_signature.d.ts +7 -0
  108. package/build/script_signature.js +49 -0
  109. package/build/transaction.d.ts +48 -0
  110. package/build/transaction.js +445 -0
  111. package/build/types.d.ts +37 -0
  112. package/build/types.js +73 -0
  113. package/cjs/package.json +3 -0
  114. package/eslint.config.js +56 -0
  115. package/gulpfile.js +42 -0
  116. package/package.json +105 -50
  117. package/src/{address.js → address.ts} +93 -73
  118. package/src/{bip66.js → bip66.ts} +23 -19
  119. package/src/{block.js → block.ts} +114 -105
  120. package/src/{bufferutils.js → bufferutils.ts} +65 -67
  121. package/src/crypto/crypto-browser.js +75 -0
  122. package/src/crypto/crypto.ts +1 -0
  123. package/src/crypto.ts +108 -0
  124. package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
  125. package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
  126. package/src/hooks/HookedSigner.ts +108 -0
  127. package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
  128. package/src/index.ts +86 -0
  129. package/src/{merkle.js → merkle.ts} +8 -7
  130. package/src/networks.ts +235 -0
  131. package/src/ops.ts +282 -0
  132. package/src/payments/bip341.ts +140 -0
  133. package/src/payments/embed.ts +55 -0
  134. package/src/payments/{index.d.ts → index.ts} +20 -10
  135. package/src/payments/lazy.ts +28 -0
  136. package/src/payments/p2ms.ts +150 -0
  137. package/src/payments/{p2pk.js → p2pk.ts} +32 -29
  138. package/src/payments/{p2pkh.js → p2pkh.ts} +53 -47
  139. package/src/payments/{p2sh.js → p2sh.ts} +72 -71
  140. package/src/payments/{p2tr.js → p2tr.ts} +114 -125
  141. package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
  142. package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
  143. package/src/psbt/{bip371.js → bip371.ts} +195 -178
  144. package/src/psbt/psbtutils.ts +299 -0
  145. package/src/{psbt.js → psbt.ts} +1048 -699
  146. package/src/{push_data.js → push_data.ts} +35 -21
  147. package/src/{script.js → script.ts} +93 -77
  148. package/src/{script_number.js → script_number.ts} +15 -21
  149. package/src/{script_signature.js → script_signature.ts} +26 -14
  150. package/src/{transaction.js → transaction.ts} +247 -167
  151. package/src/types.ts +122 -0
  152. package/test/address.spec.js +124 -0
  153. package/test/address.spec.ts +177 -0
  154. package/test/bitcoin.core.spec.js +170 -0
  155. package/test/bitcoin.core.spec.ts +234 -0
  156. package/test/block.spec.js +141 -0
  157. package/test/block.spec.ts +194 -0
  158. package/test/bufferutils.spec.js +427 -0
  159. package/test/bufferutils.spec.ts +513 -0
  160. package/test/crypto.spec.js +41 -0
  161. package/test/crypto.spec.ts +55 -0
  162. package/test/fixtures/address.json +329 -0
  163. package/test/fixtures/block.json +148 -0
  164. package/test/fixtures/bufferutils.json +102 -0
  165. package/test/fixtures/core/README.md +26 -0
  166. package/test/fixtures/core/base58_encode_decode.json +50 -0
  167. package/test/fixtures/core/base58_keys_invalid.json +152 -0
  168. package/test/fixtures/core/base58_keys_valid.json +452 -0
  169. package/test/fixtures/core/blocks.json +27 -0
  170. package/test/fixtures/core/sig_canonical.json +7 -0
  171. package/test/fixtures/core/sig_noncanonical.json +33 -0
  172. package/test/fixtures/core/sighash.json +3505 -0
  173. package/test/fixtures/core/tx_valid.json +2023 -0
  174. package/test/fixtures/crypto.json +43 -0
  175. package/test/fixtures/ecdsa.json +217 -0
  176. package/test/fixtures/ecpair.json +141 -0
  177. package/test/fixtures/embed.json +108 -0
  178. package/test/fixtures/p2ms.json +434 -0
  179. package/test/fixtures/p2pk.json +179 -0
  180. package/test/fixtures/p2pkh.json +276 -0
  181. package/test/fixtures/p2sh.json +508 -0
  182. package/test/fixtures/p2tr.json +1198 -0
  183. package/test/fixtures/p2wpkh.json +290 -0
  184. package/test/fixtures/p2wsh.json +489 -0
  185. package/test/fixtures/psbt.json +924 -0
  186. package/test/fixtures/script.json +465 -0
  187. package/test/fixtures/script_number.json +225 -0
  188. package/test/fixtures/signature.json +140 -0
  189. package/test/fixtures/transaction.json +916 -0
  190. package/test/integration/_regtest.js +7 -0
  191. package/test/integration/_regtest.ts +6 -0
  192. package/test/integration/addresses.spec.js +116 -0
  193. package/test/integration/addresses.spec.ts +154 -0
  194. package/test/integration/bip32.spec.js +85 -0
  195. package/test/integration/bip32.spec.ts +151 -0
  196. package/test/integration/blocks.spec.js +26 -0
  197. package/test/integration/blocks.spec.ts +28 -0
  198. package/test/integration/cltv.spec.js +199 -0
  199. package/test/integration/cltv.spec.ts +283 -0
  200. package/test/integration/csv.spec.js +362 -0
  201. package/test/integration/csv.spec.ts +527 -0
  202. package/test/integration/payments.spec.js +98 -0
  203. package/test/integration/payments.spec.ts +135 -0
  204. package/test/integration/taproot.spec.js +532 -0
  205. package/test/integration/taproot.spec.ts +707 -0
  206. package/test/integration/transactions.spec.js +561 -0
  207. package/test/integration/transactions.spec.ts +769 -0
  208. package/test/payments.spec.js +97 -0
  209. package/test/payments.spec.ts +125 -0
  210. package/test/payments.utils.js +190 -0
  211. package/test/payments.utils.ts +208 -0
  212. package/test/psbt.spec.js +1044 -0
  213. package/test/psbt.spec.ts +1414 -0
  214. package/test/script.spec.js +151 -0
  215. package/test/script.spec.ts +210 -0
  216. package/test/script_number.spec.js +24 -0
  217. package/test/script_number.spec.ts +29 -0
  218. package/test/script_signature.spec.js +52 -0
  219. package/test/script_signature.spec.ts +66 -0
  220. package/test/transaction.spec.js +269 -0
  221. package/test/transaction.spec.ts +387 -0
  222. package/test/ts-node-register.js +5 -0
  223. package/test/tsconfig.json +45 -0
  224. package/test/types.spec.js +46 -0
  225. package/test/types.spec.ts +58 -0
  226. package/tsconfig.base.json +27 -0
  227. package/tsconfig.json +19 -0
  228. package/tsconfig.webpack.json +18 -0
  229. package/webpack.config.js +79 -0
  230. package/src/address.d.ts +0 -42
  231. package/src/crypto.js +0 -128
  232. package/src/ecc_lib.d.ts +0 -17
  233. package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
  234. package/src/hooks/HookedSigner.js +0 -90
  235. package/src/hooks/SignatureManager.d.ts +0 -35
  236. package/src/index.d.ts +0 -42
  237. package/src/index.js +0 -87
  238. package/src/merkle.d.ts +0 -10
  239. package/src/networks.d.ts +0 -29
  240. package/src/networks.js +0 -71
  241. package/src/payments/bip341.d.ts +0 -49
  242. package/src/payments/bip341.js +0 -124
  243. package/src/payments/embed.d.ts +0 -9
  244. package/src/payments/embed.js +0 -54
  245. package/src/payments/index.js +0 -69
  246. package/src/payments/p2ms.d.ts +0 -9
  247. package/src/payments/p2pk.d.ts +0 -10
  248. package/src/payments/p2pkh.d.ts +0 -10
  249. package/src/payments/p2sh.d.ts +0 -10
  250. package/src/payments/p2tr.d.ts +0 -10
  251. package/src/payments/p2wpkh.d.ts +0 -10
  252. package/src/payments/p2wsh.d.ts +0 -10
  253. package/src/psbt/bip371.d.ts +0 -42
  254. package/src/psbt/psbtutils.d.ts +0 -64
  255. package/src/psbt/psbtutils.js +0 -191
  256. package/src/push_data.d.ts +0 -29
  257. package/src/script.d.ts +0 -42
  258. package/src/script_number.d.ts +0 -19
  259. package/src/script_signature.d.ts +0 -21
  260. package/src/types.js +0 -106
@@ -1,54 +1,37 @@
1
- /// <reference types="node" />
2
- export declare const typeforce: any;
3
- /**
4
- * Checks if two arrays of Buffers are equal.
5
- * @param a - The first array of Buffers.
6
- * @param b - The second array of Buffers.
7
- * @returns True if the arrays are equal, false otherwise.
8
- */
9
- export declare function stacksEqual(a: Buffer[], b: Buffer[]): boolean;
10
- /**
11
- * Checks if the given value is a valid elliptic curve point.
12
- * @param p - The value to check.
13
- * @returns True if the value is a valid elliptic curve point, false otherwise.
14
- */
15
- export declare function isPoint(p: Buffer | number | undefined | null): boolean;
16
- export declare function Satoshi(value: number): boolean;
17
- export interface XOnlyPointAddTweakResult {
18
- parity: 1 | 0;
19
- xOnlyPubkey: Uint8Array;
20
- }
21
- export interface Tapleaf {
22
- output: Buffer;
23
- version?: number;
24
- }
25
- export declare const TAPLEAF_VERSION_MASK = 254;
26
- export declare function isTapleaf(o: any): o is Tapleaf;
27
- /**
28
- * Binary tree repsenting script path spends for a Taproot input.
29
- * Each node is either a single Tapleaf, or a pair of Tapleaf | Taptree.
30
- * The tree has no balancing requirements.
31
- */
32
- export type Taptree = [Taptree | Tapleaf, Taptree | Tapleaf] | Tapleaf;
33
- export declare function isTaptree(scriptTree: any): scriptTree is Taptree;
34
- export interface TinySecp256k1Interface {
35
- isXOnlyPoint(p: Uint8Array): boolean;
36
- xOnlyPointAddTweak(p: Uint8Array, tweak: Uint8Array): XOnlyPointAddTweakResult | null;
37
- }
38
- export declare const Buffer256bit: any;
39
- export declare const Hash160bit: any;
40
- export declare const Hash256bit: any;
41
- export declare const Number: any;
42
- export declare const Array: any;
43
- export declare const Boolean: any;
44
- export declare const String: any;
45
- export declare const Buffer: any;
46
- export declare const Hex: any;
47
- export declare const maybe: any;
48
- export declare const tuple: any;
49
- export declare const UInt8: any;
50
- export declare const UInt32: any;
51
- export declare const Function: any;
52
- export declare const BufferN: any;
53
- export declare const Null: any;
54
- export declare const oneOf: any;
1
+ export declare const typeforce: any;
2
+ export declare function stacksEqual(a: Buffer[], b: Buffer[]): boolean;
3
+ export declare function isPoint(p: Buffer | number | undefined | null): boolean;
4
+ export declare function Satoshi(value: number): boolean;
5
+ export interface XOnlyPointAddTweakResult {
6
+ parity: 1 | 0;
7
+ xOnlyPubkey: Uint8Array;
8
+ }
9
+ export interface Tapleaf {
10
+ output: Buffer;
11
+ version?: number;
12
+ }
13
+ export declare const TAPLEAF_VERSION_MASK = 254;
14
+ export declare function isTapleaf(o: any): o is Tapleaf;
15
+ export type Taptree = [Taptree | Tapleaf, Taptree | Tapleaf] | Tapleaf;
16
+ export declare function isTaptree(scriptTree: any): scriptTree is Taptree;
17
+ export interface TinySecp256k1Interface {
18
+ isXOnlyPoint(p: Uint8Array): boolean;
19
+ xOnlyPointAddTweak(p: Uint8Array, tweak: Uint8Array): XOnlyPointAddTweakResult | null;
20
+ }
21
+ export declare const Buffer256bit: any;
22
+ export declare const Hash160bit: any;
23
+ export declare const Hash256bit: any;
24
+ export declare const Number: any;
25
+ export declare const Array: any;
26
+ export declare const Boolean: any;
27
+ export declare const String: any;
28
+ export declare const Buffer: any;
29
+ export declare const Hex: any;
30
+ export declare const maybe: any;
31
+ export declare const tuple: any;
32
+ export declare const UInt8: any;
33
+ export declare const UInt32: any;
34
+ export declare const Function: any;
35
+ export declare const BufferN: any;
36
+ export declare const Null: any;
37
+ export declare const oneOf: any;
@@ -0,0 +1,16 @@
1
+ import { Network } from './networks.js';
2
+ export interface Base58CheckResult {
3
+ hash: Buffer;
4
+ version: number;
5
+ }
6
+ export interface Bech32Result {
7
+ version: number;
8
+ prefix: string;
9
+ data: Buffer;
10
+ }
11
+ export declare function fromBase58Check(address: string): Base58CheckResult;
12
+ export declare function fromBech32(address: string): Bech32Result;
13
+ export declare function toBase58Check(hash: Buffer, version: number): string;
14
+ export declare function toBech32(data: Buffer, version: number, prefix: string): string;
15
+ export declare function fromOutputScript(output: Buffer, network?: Network): string;
16
+ export declare function toOutputScript(address: string, network?: Network): Buffer;
@@ -0,0 +1,148 @@
1
+ import { bech32, bech32m } from 'bech32';
2
+ import * as bs58check from 'bs58check';
3
+ import { payments } from './index.js';
4
+ import * as networks from './networks.js';
5
+ import * as bscript from './script.js';
6
+ import { Hash160bit, tuple, typeforce, UInt8 } from './types.js';
7
+ const FUTURE_SEGWIT_MAX_SIZE = 40;
8
+ const FUTURE_SEGWIT_MIN_SIZE = 2;
9
+ const FUTURE_SEGWIT_MAX_VERSION = 16;
10
+ const FUTURE_SEGWIT_MIN_VERSION = 2;
11
+ const FUTURE_SEGWIT_VERSION_DIFF = 0x50;
12
+ const FUTURE_SEGWIT_VERSION_WARNING = 'WARNING: Sending to a future segwit version address can lead to loss of funds. ' +
13
+ 'End users MUST be warned carefully in the GUI and asked if they wish to proceed ' +
14
+ 'with caution. Wallets should verify the segwit version from the output of fromBech32, ' +
15
+ 'then decide when it is safe to use which version of segwit.';
16
+ function _toFutureSegwitAddress(output, network) {
17
+ const data = output.slice(2);
18
+ if (data.length < FUTURE_SEGWIT_MIN_SIZE || data.length > FUTURE_SEGWIT_MAX_SIZE)
19
+ throw new TypeError('Invalid program length for segwit address');
20
+ const version = output[0] - FUTURE_SEGWIT_VERSION_DIFF;
21
+ if (version < FUTURE_SEGWIT_MIN_VERSION || version > FUTURE_SEGWIT_MAX_VERSION)
22
+ throw new TypeError('Invalid version for segwit address');
23
+ if (output[1] !== data.length)
24
+ throw new TypeError('Invalid script for segwit address');
25
+ console.warn(FUTURE_SEGWIT_VERSION_WARNING);
26
+ return toBech32(data, version, network.bech32);
27
+ }
28
+ export function fromBase58Check(address) {
29
+ const payload = Buffer.from(bs58check.default.decode(address));
30
+ if (payload.length < 21)
31
+ throw new TypeError(address + ' is too short');
32
+ if (payload.length > 21)
33
+ throw new TypeError(address + ' is too long');
34
+ const version = payload.readUInt8(0);
35
+ const hash = payload.slice(1);
36
+ return { version, hash };
37
+ }
38
+ export function fromBech32(address) {
39
+ let result;
40
+ let version;
41
+ try {
42
+ result = bech32.decode(address);
43
+ }
44
+ catch (e) { }
45
+ if (result) {
46
+ version = result.words[0];
47
+ if (version !== 0)
48
+ throw new TypeError(address + ' uses wrong encoding');
49
+ }
50
+ else {
51
+ result = bech32m.decode(address);
52
+ version = result.words[0];
53
+ if (version === 0)
54
+ throw new TypeError(address + ' uses wrong encoding');
55
+ }
56
+ const data = bech32.fromWords(result.words.slice(1));
57
+ return {
58
+ version,
59
+ prefix: result.prefix,
60
+ data: Buffer.from(data),
61
+ };
62
+ }
63
+ export function toBase58Check(hash, version) {
64
+ typeforce(tuple(Hash160bit, UInt8), arguments);
65
+ const payload = Buffer.allocUnsafe(21);
66
+ payload.writeUInt8(version, 0);
67
+ hash.copy(payload, 1);
68
+ return bs58check.default.encode(payload);
69
+ }
70
+ export function toBech32(data, version, prefix) {
71
+ const words = bech32.toWords(data);
72
+ words.unshift(version);
73
+ return version === 0 ? bech32.encode(prefix, words) : bech32m.encode(prefix, words);
74
+ }
75
+ export function fromOutputScript(output, network) {
76
+ network = network || networks.bitcoin;
77
+ try {
78
+ return payments.p2pkh({ output, network }).address;
79
+ }
80
+ catch (e) { }
81
+ try {
82
+ return payments.p2sh({ output, network }).address;
83
+ }
84
+ catch (e) { }
85
+ try {
86
+ return payments.p2wpkh({ output, network }).address;
87
+ }
88
+ catch (e) { }
89
+ try {
90
+ return payments.p2wsh({ output, network }).address;
91
+ }
92
+ catch (e) { }
93
+ try {
94
+ return payments.p2tr({ output, network }).address;
95
+ }
96
+ catch (e) { }
97
+ try {
98
+ return _toFutureSegwitAddress(output, network);
99
+ }
100
+ catch (e) { }
101
+ throw new Error(bscript.toASM(output) + ' has no matching Address');
102
+ }
103
+ export function toOutputScript(address, network) {
104
+ network = network || networks.bitcoin;
105
+ let decodeBase58;
106
+ let decodeBech32;
107
+ try {
108
+ decodeBase58 = fromBase58Check(address);
109
+ }
110
+ catch (e) { }
111
+ if (decodeBase58) {
112
+ if (decodeBase58.version === network.pubKeyHash)
113
+ return payments.p2pkh({ hash: decodeBase58.hash }).output;
114
+ if (decodeBase58.version === network.scriptHash)
115
+ return payments.p2sh({ hash: decodeBase58.hash }).output;
116
+ }
117
+ else {
118
+ try {
119
+ decodeBech32 = fromBech32(address);
120
+ }
121
+ catch (e) { }
122
+ if (decodeBech32) {
123
+ if (decodeBech32.prefix !== network.bech32)
124
+ throw new Error(address + ' has an invalid prefix');
125
+ if (decodeBech32.version === 0) {
126
+ if (decodeBech32.data.length === 20)
127
+ return payments.p2wpkh({ hash: decodeBech32.data }).output;
128
+ if (decodeBech32.data.length === 32)
129
+ return payments.p2wsh({ hash: decodeBech32.data }).output;
130
+ }
131
+ else if (decodeBech32.version === 1) {
132
+ if (decodeBech32.data.length === 32)
133
+ return payments.p2tr({ pubkey: decodeBech32.data }).output;
134
+ }
135
+ else if (decodeBech32.version >= FUTURE_SEGWIT_MIN_VERSION &&
136
+ decodeBech32.version <= FUTURE_SEGWIT_MAX_VERSION &&
137
+ decodeBech32.data.length >= FUTURE_SEGWIT_MIN_SIZE &&
138
+ decodeBech32.data.length <= FUTURE_SEGWIT_MAX_SIZE) {
139
+ console.warn(FUTURE_SEGWIT_VERSION_WARNING);
140
+ return bscript.compile([
141
+ decodeBech32.version + FUTURE_SEGWIT_VERSION_DIFF,
142
+ decodeBech32.data,
143
+ ]);
144
+ }
145
+ }
146
+ }
147
+ return Buffer.from(address, 'hex');
148
+ }
@@ -0,0 +1,6 @@
1
+ export declare function check(buffer: Buffer): boolean;
2
+ export declare function decode(buffer: Buffer): {
3
+ r: Buffer;
4
+ s: Buffer;
5
+ };
6
+ export declare function encode(r: Buffer, s: Buffer): Buffer;
package/build/bip66.js ADDED
@@ -0,0 +1,99 @@
1
+ export function check(buffer) {
2
+ if (buffer.length < 8)
3
+ return false;
4
+ if (buffer.length > 72)
5
+ return false;
6
+ if (buffer[0] !== 0x30)
7
+ return false;
8
+ if (buffer[1] !== buffer.length - 2)
9
+ return false;
10
+ if (buffer[2] !== 0x02)
11
+ return false;
12
+ const lenR = buffer[3];
13
+ if (lenR === 0)
14
+ return false;
15
+ if (5 + lenR >= buffer.length)
16
+ return false;
17
+ if (buffer[4 + lenR] !== 0x02)
18
+ return false;
19
+ const lenS = buffer[5 + lenR];
20
+ if (lenS === 0)
21
+ return false;
22
+ if (6 + lenR + lenS !== buffer.length)
23
+ return false;
24
+ if (buffer[4] & 0x80)
25
+ return false;
26
+ if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80))
27
+ return false;
28
+ if (buffer[lenR + 6] & 0x80)
29
+ return false;
30
+ if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80))
31
+ return false;
32
+ return true;
33
+ }
34
+ export function decode(buffer) {
35
+ if (buffer.length < 8)
36
+ throw new Error('DER sequence length is too short');
37
+ if (buffer.length > 72)
38
+ throw new Error('DER sequence length is too long');
39
+ if (buffer[0] !== 0x30)
40
+ throw new Error('Expected DER sequence');
41
+ if (buffer[1] !== buffer.length - 2)
42
+ throw new Error('DER sequence length is invalid');
43
+ if (buffer[2] !== 0x02)
44
+ throw new Error('Expected DER integer');
45
+ const lenR = buffer[3];
46
+ if (lenR === 0)
47
+ throw new Error('R length is zero');
48
+ if (5 + lenR >= buffer.length)
49
+ throw new Error('R length is too long');
50
+ if (buffer[4 + lenR] !== 0x02)
51
+ throw new Error('Expected DER integer (2)');
52
+ const lenS = buffer[5 + lenR];
53
+ if (lenS === 0)
54
+ throw new Error('S length is zero');
55
+ if (6 + lenR + lenS !== buffer.length)
56
+ throw new Error('S length is invalid');
57
+ if (buffer[4] & 0x80)
58
+ throw new Error('R value is negative');
59
+ if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80))
60
+ throw new Error('R value excessively padded');
61
+ if (buffer[lenR + 6] & 0x80)
62
+ throw new Error('S value is negative');
63
+ if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80))
64
+ throw new Error('S value excessively padded');
65
+ return {
66
+ r: buffer.slice(4, 4 + lenR),
67
+ s: buffer.slice(6 + lenR),
68
+ };
69
+ }
70
+ export function encode(r, s) {
71
+ const lenR = r.length;
72
+ const lenS = s.length;
73
+ if (lenR === 0)
74
+ throw new Error('R length is zero');
75
+ if (lenS === 0)
76
+ throw new Error('S length is zero');
77
+ if (lenR > 33)
78
+ throw new Error('R length is too long');
79
+ if (lenS > 33)
80
+ throw new Error('S length is too long');
81
+ if (r[0] & 0x80)
82
+ throw new Error('R value is negative');
83
+ if (s[0] & 0x80)
84
+ throw new Error('S value is negative');
85
+ if (lenR > 1 && r[0] === 0x00 && !(r[1] & 0x80))
86
+ throw new Error('R value excessively padded');
87
+ if (lenS > 1 && s[0] === 0x00 && !(s[1] & 0x80))
88
+ throw new Error('S value excessively padded');
89
+ const signature = Buffer.allocUnsafe(6 + lenR + lenS);
90
+ signature[0] = 0x30;
91
+ signature[1] = signature.length - 2;
92
+ signature[2] = 0x02;
93
+ signature[3] = r.length;
94
+ r.copy(signature, 4);
95
+ signature[4 + lenR] = 0x02;
96
+ signature[5 + lenR] = s.length;
97
+ s.copy(signature, 6 + lenR);
98
+ return signature;
99
+ }
@@ -0,0 +1,29 @@
1
+ import { Transaction } from './transaction.js';
2
+ export declare class Block {
3
+ version: number;
4
+ prevHash?: Buffer;
5
+ merkleRoot?: Buffer;
6
+ timestamp: number;
7
+ witnessCommit?: Buffer;
8
+ bits: number;
9
+ nonce: number;
10
+ transactions?: Transaction[];
11
+ static fromBuffer(buffer: Buffer): Block;
12
+ static fromHex(hex: string): Block;
13
+ static calculateTarget(bits: number): Buffer;
14
+ static calculateMerkleRoot(transactions: Transaction[], forWitness?: boolean): Buffer;
15
+ getWitnessCommit(): Buffer | null;
16
+ hasWitnessCommit(): boolean;
17
+ hasWitness(): boolean;
18
+ weight(): number;
19
+ byteLength(headersOnly?: boolean, allowWitness?: boolean): number;
20
+ getHash(): Buffer;
21
+ getId(): string;
22
+ getUTCDate(): Date;
23
+ toBuffer(headersOnly?: boolean): Buffer;
24
+ toHex(headersOnly?: boolean): string;
25
+ checkTxRoots(): boolean;
26
+ checkProofOfWork(): boolean;
27
+ private __checkMerkleRoot;
28
+ private __checkWitnessCommit;
29
+ }
package/build/block.js ADDED
@@ -0,0 +1,181 @@
1
+ import { BufferReader, BufferWriter, reverseBuffer, varuint } from './bufferutils.js';
2
+ import * as bcrypto from './crypto.js';
3
+ import { fastMerkleRoot } from './merkle.js';
4
+ import { Transaction } from './transaction.js';
5
+ import * as types from './types.js';
6
+ const { typeforce } = types;
7
+ const errorMerkleNoTxes = new TypeError('Cannot compute merkle root for zero transactions');
8
+ const errorWitnessNotSegwit = new TypeError('Cannot compute witness commit for non-segwit block');
9
+ export class Block {
10
+ constructor() {
11
+ this.version = 1;
12
+ this.prevHash = undefined;
13
+ this.merkleRoot = undefined;
14
+ this.timestamp = 0;
15
+ this.witnessCommit = undefined;
16
+ this.bits = 0;
17
+ this.nonce = 0;
18
+ this.transactions = undefined;
19
+ }
20
+ static fromBuffer(buffer) {
21
+ if (buffer.length < 80)
22
+ throw new Error('Buffer too small (< 80 bytes)');
23
+ const bufferReader = new BufferReader(buffer);
24
+ const block = new Block();
25
+ block.version = bufferReader.readInt32();
26
+ block.prevHash = bufferReader.readSlice(32);
27
+ block.merkleRoot = bufferReader.readSlice(32);
28
+ block.timestamp = bufferReader.readUInt32();
29
+ block.bits = bufferReader.readUInt32();
30
+ block.nonce = bufferReader.readUInt32();
31
+ if (buffer.length === 80)
32
+ return block;
33
+ const readTransaction = () => {
34
+ const tx = Transaction.fromBuffer(bufferReader.buffer.slice(bufferReader.offset), true);
35
+ bufferReader.offset += tx.byteLength();
36
+ return tx;
37
+ };
38
+ const nTransactions = bufferReader.readVarInt();
39
+ block.transactions = [];
40
+ for (let i = 0; i < nTransactions; ++i) {
41
+ const tx = readTransaction();
42
+ block.transactions.push(tx);
43
+ }
44
+ const witnessCommit = block.getWitnessCommit();
45
+ if (witnessCommit)
46
+ block.witnessCommit = witnessCommit;
47
+ return block;
48
+ }
49
+ static fromHex(hex) {
50
+ return Block.fromBuffer(Buffer.from(hex, 'hex'));
51
+ }
52
+ static calculateTarget(bits) {
53
+ const exponent = ((bits & 0xff000000) >> 24) - 3;
54
+ const mantissa = bits & 0x007fffff;
55
+ const target = Buffer.alloc(32, 0);
56
+ target.writeUIntBE(mantissa, 29 - exponent, 3);
57
+ return target;
58
+ }
59
+ static calculateMerkleRoot(transactions, forWitness) {
60
+ typeforce([{ getHash: types.Function }], transactions);
61
+ if (transactions.length === 0)
62
+ throw errorMerkleNoTxes;
63
+ if (forWitness && !txesHaveWitnessCommit(transactions))
64
+ throw errorWitnessNotSegwit;
65
+ const hashes = transactions.map((transaction) => transaction.getHash(forWitness));
66
+ const rootHash = fastMerkleRoot(hashes, bcrypto.hash256);
67
+ return forWitness
68
+ ? bcrypto.hash256(Buffer.concat([rootHash, transactions[0].ins[0].witness[0]]))
69
+ : rootHash;
70
+ }
71
+ getWitnessCommit() {
72
+ if (!txesHaveWitnessCommit(this.transactions))
73
+ return null;
74
+ const witnessCommits = this.transactions[0].outs.filter((out) => out.script.slice(0, 6).equals(Buffer.from('6a24aa21a9ed', 'hex'))).map((out) => out.script.slice(6, 38));
75
+ if (witnessCommits.length === 0)
76
+ return null;
77
+ const result = witnessCommits[witnessCommits.length - 1];
78
+ if (!(result instanceof Buffer && result.length === 32))
79
+ return null;
80
+ return result;
81
+ }
82
+ hasWitnessCommit() {
83
+ if (this.witnessCommit instanceof Buffer && this.witnessCommit.length === 32)
84
+ return true;
85
+ if (this.getWitnessCommit() !== null)
86
+ return true;
87
+ return false;
88
+ }
89
+ hasWitness() {
90
+ return anyTxHasWitness(this.transactions);
91
+ }
92
+ weight() {
93
+ const base = this.byteLength(false, false);
94
+ const total = this.byteLength(false, true);
95
+ return base * 3 + total;
96
+ }
97
+ byteLength(headersOnly, allowWitness = true) {
98
+ if (headersOnly || !this.transactions)
99
+ return 80;
100
+ return (80 +
101
+ varuint.encodingLength(this.transactions.length) +
102
+ this.transactions.reduce((a, x) => a + x.byteLength(allowWitness), 0));
103
+ }
104
+ getHash() {
105
+ return bcrypto.hash256(this.toBuffer(true));
106
+ }
107
+ getId() {
108
+ return reverseBuffer(this.getHash()).toString('hex');
109
+ }
110
+ getUTCDate() {
111
+ const date = new Date(0);
112
+ date.setUTCSeconds(this.timestamp);
113
+ return date;
114
+ }
115
+ toBuffer(headersOnly) {
116
+ const buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
117
+ const bufferWriter = new BufferWriter(buffer);
118
+ bufferWriter.writeInt32(this.version);
119
+ bufferWriter.writeSlice(this.prevHash);
120
+ bufferWriter.writeSlice(this.merkleRoot);
121
+ bufferWriter.writeUInt32(this.timestamp);
122
+ bufferWriter.writeUInt32(this.bits);
123
+ bufferWriter.writeUInt32(this.nonce);
124
+ if (headersOnly || !this.transactions)
125
+ return buffer;
126
+ varuint.encode(this.transactions.length, buffer, bufferWriter.offset);
127
+ bufferWriter.offset += varuint.encode.bytes;
128
+ this.transactions.forEach((tx) => {
129
+ const txSize = tx.byteLength();
130
+ tx.toBuffer(buffer, bufferWriter.offset);
131
+ bufferWriter.offset += txSize;
132
+ });
133
+ return buffer;
134
+ }
135
+ toHex(headersOnly) {
136
+ return this.toBuffer(headersOnly).toString('hex');
137
+ }
138
+ checkTxRoots() {
139
+ const hasWitnessCommit = this.hasWitnessCommit();
140
+ if (!hasWitnessCommit && this.hasWitness())
141
+ return false;
142
+ return this.__checkMerkleRoot() && (hasWitnessCommit ? this.__checkWitnessCommit() : true);
143
+ }
144
+ checkProofOfWork() {
145
+ const hash = reverseBuffer(this.getHash());
146
+ const target = Block.calculateTarget(this.bits);
147
+ return hash.compare(target) <= 0;
148
+ }
149
+ __checkMerkleRoot() {
150
+ if (!this.transactions)
151
+ throw errorMerkleNoTxes;
152
+ const actualMerkleRoot = Block.calculateMerkleRoot(this.transactions);
153
+ return this.merkleRoot.compare(actualMerkleRoot) === 0;
154
+ }
155
+ __checkWitnessCommit() {
156
+ if (!this.transactions)
157
+ throw errorMerkleNoTxes;
158
+ if (!this.hasWitnessCommit())
159
+ throw errorWitnessNotSegwit;
160
+ const actualWitnessCommit = Block.calculateMerkleRoot(this.transactions, true);
161
+ return this.witnessCommit.compare(actualWitnessCommit) === 0;
162
+ }
163
+ }
164
+ function txesHaveWitnessCommit(transactions) {
165
+ return (transactions instanceof Array &&
166
+ transactions[0] &&
167
+ transactions[0].ins &&
168
+ transactions[0].ins instanceof Array &&
169
+ transactions[0].ins[0] &&
170
+ transactions[0].ins[0].witness &&
171
+ transactions[0].ins[0].witness instanceof Array &&
172
+ transactions[0].ins[0].witness.length > 0);
173
+ }
174
+ function anyTxHasWitness(transactions) {
175
+ return (transactions instanceof Array &&
176
+ transactions.some((tx) => typeof tx === 'object' &&
177
+ tx.ins instanceof Array &&
178
+ tx.ins.some((input) => typeof input === 'object' &&
179
+ input.witness instanceof Array &&
180
+ input.witness.length > 0)));
181
+ }
@@ -0,0 +1,34 @@
1
+ import * as varuint from 'varuint-bitcoin';
2
+ export { varuint };
3
+ export declare function readUInt64LE(buffer: Buffer, offset: number): number;
4
+ export declare function writeUInt64LE(buffer: Buffer, value: number, offset: number): number;
5
+ export declare function reverseBuffer(buffer: Buffer): Buffer;
6
+ export declare function cloneBuffer(buffer: Buffer): Buffer;
7
+ export declare class BufferWriter {
8
+ buffer: Buffer;
9
+ offset: number;
10
+ constructor(buffer: Buffer, offset?: number);
11
+ static withCapacity(size: number): BufferWriter;
12
+ writeUInt8(i: number): void;
13
+ writeInt32(i: number): void;
14
+ writeUInt32(i: number): void;
15
+ writeUInt64(i: number): void;
16
+ writeVarInt(i: number): void;
17
+ writeSlice(slice: Buffer): void;
18
+ writeVarSlice(slice: Buffer): void;
19
+ writeVector(vector: Buffer[]): void;
20
+ end(): Buffer;
21
+ }
22
+ export declare class BufferReader {
23
+ buffer: Buffer;
24
+ offset: number;
25
+ constructor(buffer: Buffer, offset?: number);
26
+ readUInt8(): number;
27
+ readInt32(): number;
28
+ readUInt32(): number;
29
+ readUInt64(): number;
30
+ readVarInt(): number;
31
+ readSlice(n: number): Buffer;
32
+ readVarSlice(): Buffer;
33
+ readVector(): Buffer[];
34
+ }