xpi-ts 0.2.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.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -0
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +8 -0
  6. package/dist/lib/bitcore/address.d.ts +66 -0
  7. package/dist/lib/bitcore/address.d.ts.map +1 -0
  8. package/dist/lib/bitcore/address.js +407 -0
  9. package/dist/lib/bitcore/block/block.d.ts +57 -0
  10. package/dist/lib/bitcore/block/block.d.ts.map +1 -0
  11. package/dist/lib/bitcore/block/block.js +233 -0
  12. package/dist/lib/bitcore/block/blockheader.d.ts +82 -0
  13. package/dist/lib/bitcore/block/blockheader.d.ts.map +1 -0
  14. package/dist/lib/bitcore/block/blockheader.js +323 -0
  15. package/dist/lib/bitcore/block/index.d.ts +5 -0
  16. package/dist/lib/bitcore/block/index.d.ts.map +1 -0
  17. package/dist/lib/bitcore/block/index.js +2 -0
  18. package/dist/lib/bitcore/chunk.d.ts +22 -0
  19. package/dist/lib/bitcore/chunk.d.ts.map +1 -0
  20. package/dist/lib/bitcore/chunk.js +46 -0
  21. package/dist/lib/bitcore/crypto/bn.d.ts +53 -0
  22. package/dist/lib/bitcore/crypto/bn.d.ts.map +1 -0
  23. package/dist/lib/bitcore/crypto/bn.js +238 -0
  24. package/dist/lib/bitcore/crypto/ecdsa.d.ts +46 -0
  25. package/dist/lib/bitcore/crypto/ecdsa.d.ts.map +1 -0
  26. package/dist/lib/bitcore/crypto/ecdsa.js +247 -0
  27. package/dist/lib/bitcore/crypto/hash.d.ts +16 -0
  28. package/dist/lib/bitcore/crypto/hash.d.ts.map +1 -0
  29. package/dist/lib/bitcore/crypto/hash.js +87 -0
  30. package/dist/lib/bitcore/crypto/index.d.ts +9 -0
  31. package/dist/lib/bitcore/crypto/index.d.ts.map +1 -0
  32. package/dist/lib/bitcore/crypto/index.js +8 -0
  33. package/dist/lib/bitcore/crypto/musig2.d.ts +40 -0
  34. package/dist/lib/bitcore/crypto/musig2.d.ts.map +1 -0
  35. package/dist/lib/bitcore/crypto/musig2.js +236 -0
  36. package/dist/lib/bitcore/crypto/point.d.ts +20 -0
  37. package/dist/lib/bitcore/crypto/point.d.ts.map +1 -0
  38. package/dist/lib/bitcore/crypto/point.js +133 -0
  39. package/dist/lib/bitcore/crypto/random.d.ts +7 -0
  40. package/dist/lib/bitcore/crypto/random.d.ts.map +1 -0
  41. package/dist/lib/bitcore/crypto/random.js +30 -0
  42. package/dist/lib/bitcore/crypto/schnorr.d.ts +40 -0
  43. package/dist/lib/bitcore/crypto/schnorr.d.ts.map +1 -0
  44. package/dist/lib/bitcore/crypto/schnorr.js +185 -0
  45. package/dist/lib/bitcore/crypto/signature.d.ts +53 -0
  46. package/dist/lib/bitcore/crypto/signature.d.ts.map +1 -0
  47. package/dist/lib/bitcore/crypto/signature.js +300 -0
  48. package/dist/lib/bitcore/crypto/sigtype.d.ts +5 -0
  49. package/dist/lib/bitcore/crypto/sigtype.d.ts.map +1 -0
  50. package/dist/lib/bitcore/crypto/sigtype.js +18 -0
  51. package/dist/lib/bitcore/encoding/base58.d.ts +16 -0
  52. package/dist/lib/bitcore/encoding/base58.d.ts.map +1 -0
  53. package/dist/lib/bitcore/encoding/base58.js +55 -0
  54. package/dist/lib/bitcore/encoding/base58check.d.ts +9 -0
  55. package/dist/lib/bitcore/encoding/base58check.d.ts.map +1 -0
  56. package/dist/lib/bitcore/encoding/base58check.js +82 -0
  57. package/dist/lib/bitcore/encoding/bufferreader.d.ts +34 -0
  58. package/dist/lib/bitcore/encoding/bufferreader.d.ts.map +1 -0
  59. package/dist/lib/bitcore/encoding/bufferreader.js +198 -0
  60. package/dist/lib/bitcore/encoding/bufferwriter.d.ts +36 -0
  61. package/dist/lib/bitcore/encoding/bufferwriter.d.ts.map +1 -0
  62. package/dist/lib/bitcore/encoding/bufferwriter.js +189 -0
  63. package/dist/lib/bitcore/encoding/varint.d.ts +20 -0
  64. package/dist/lib/bitcore/encoding/varint.d.ts.map +1 -0
  65. package/dist/lib/bitcore/encoding/varint.js +61 -0
  66. package/dist/lib/bitcore/errors.d.ts +28 -0
  67. package/dist/lib/bitcore/errors.d.ts.map +1 -0
  68. package/dist/lib/bitcore/errors.js +325 -0
  69. package/dist/lib/bitcore/hdprivatekey.d.ts +78 -0
  70. package/dist/lib/bitcore/hdprivatekey.d.ts.map +1 -0
  71. package/dist/lib/bitcore/hdprivatekey.js +381 -0
  72. package/dist/lib/bitcore/hdpublickey.d.ts +98 -0
  73. package/dist/lib/bitcore/hdpublickey.d.ts.map +1 -0
  74. package/dist/lib/bitcore/hdpublickey.js +416 -0
  75. package/dist/lib/bitcore/index.d.ts +60 -0
  76. package/dist/lib/bitcore/index.d.ts.map +1 -0
  77. package/dist/lib/bitcore/index.js +44 -0
  78. package/dist/lib/bitcore/message.d.ts +23 -0
  79. package/dist/lib/bitcore/message.d.ts.map +1 -0
  80. package/dist/lib/bitcore/message.js +112 -0
  81. package/dist/lib/bitcore/mnemonic/errors.d.ts +7 -0
  82. package/dist/lib/bitcore/mnemonic/errors.d.ts.map +1 -0
  83. package/dist/lib/bitcore/mnemonic/errors.js +20 -0
  84. package/dist/lib/bitcore/mnemonic/index.d.ts +5 -0
  85. package/dist/lib/bitcore/mnemonic/index.d.ts.map +1 -0
  86. package/dist/lib/bitcore/mnemonic/index.js +4 -0
  87. package/dist/lib/bitcore/mnemonic/mnemonic.d.ts +23 -0
  88. package/dist/lib/bitcore/mnemonic/mnemonic.d.ts.map +1 -0
  89. package/dist/lib/bitcore/mnemonic/mnemonic.js +164 -0
  90. package/dist/lib/bitcore/mnemonic/pbkdf2.d.ts +2 -0
  91. package/dist/lib/bitcore/mnemonic/pbkdf2.d.ts.map +1 -0
  92. package/dist/lib/bitcore/mnemonic/pbkdf2.js +25 -0
  93. package/dist/lib/bitcore/mnemonic/words/english.d.ts +2 -0
  94. package/dist/lib/bitcore/mnemonic/words/english.d.ts.map +1 -0
  95. package/dist/lib/bitcore/mnemonic/words/english.js +2050 -0
  96. package/dist/lib/bitcore/mnemonic/words/index.d.ts +4 -0
  97. package/dist/lib/bitcore/mnemonic/words/index.d.ts.map +1 -0
  98. package/dist/lib/bitcore/mnemonic/words/index.js +4 -0
  99. package/dist/lib/bitcore/musig2/index.d.ts +3 -0
  100. package/dist/lib/bitcore/musig2/index.d.ts.map +1 -0
  101. package/dist/lib/bitcore/musig2/index.js +2 -0
  102. package/dist/lib/bitcore/musig2/session.d.ts +79 -0
  103. package/dist/lib/bitcore/musig2/session.d.ts.map +1 -0
  104. package/dist/lib/bitcore/musig2/session.js +346 -0
  105. package/dist/lib/bitcore/musig2/signer.d.ts +61 -0
  106. package/dist/lib/bitcore/musig2/signer.d.ts.map +1 -0
  107. package/dist/lib/bitcore/musig2/signer.js +146 -0
  108. package/dist/lib/bitcore/networks.d.ts +53 -0
  109. package/dist/lib/bitcore/networks.d.ts.map +1 -0
  110. package/dist/lib/bitcore/networks.js +150 -0
  111. package/dist/lib/bitcore/opcode.d.ts +250 -0
  112. package/dist/lib/bitcore/opcode.d.ts.map +1 -0
  113. package/dist/lib/bitcore/opcode.js +270 -0
  114. package/dist/lib/bitcore/privatekey.d.ts +56 -0
  115. package/dist/lib/bitcore/privatekey.d.ts.map +1 -0
  116. package/dist/lib/bitcore/privatekey.js +237 -0
  117. package/dist/lib/bitcore/publickey.d.ts +59 -0
  118. package/dist/lib/bitcore/publickey.d.ts.map +1 -0
  119. package/dist/lib/bitcore/publickey.js +263 -0
  120. package/dist/lib/bitcore/script/interpreter.d.ts +98 -0
  121. package/dist/lib/bitcore/script/interpreter.d.ts.map +1 -0
  122. package/dist/lib/bitcore/script/interpreter.js +1704 -0
  123. package/dist/lib/bitcore/script.d.ts +111 -0
  124. package/dist/lib/bitcore/script.d.ts.map +1 -0
  125. package/dist/lib/bitcore/script.js +1112 -0
  126. package/dist/lib/bitcore/taproot/musig2.d.ts +29 -0
  127. package/dist/lib/bitcore/taproot/musig2.d.ts.map +1 -0
  128. package/dist/lib/bitcore/taproot/musig2.js +104 -0
  129. package/dist/lib/bitcore/taproot/nft.d.ts +164 -0
  130. package/dist/lib/bitcore/taproot/nft.d.ts.map +1 -0
  131. package/dist/lib/bitcore/taproot/nft.js +407 -0
  132. package/dist/lib/bitcore/taproot.d.ts +65 -0
  133. package/dist/lib/bitcore/taproot.d.ts.map +1 -0
  134. package/dist/lib/bitcore/taproot.js +288 -0
  135. package/dist/lib/bitcore/transaction/index.d.ts +12 -0
  136. package/dist/lib/bitcore/transaction/index.d.ts.map +1 -0
  137. package/dist/lib/bitcore/transaction/index.js +6 -0
  138. package/dist/lib/bitcore/transaction/input.d.ts +202 -0
  139. package/dist/lib/bitcore/transaction/input.d.ts.map +1 -0
  140. package/dist/lib/bitcore/transaction/input.js +911 -0
  141. package/dist/lib/bitcore/transaction/output.d.ts +48 -0
  142. package/dist/lib/bitcore/transaction/output.d.ts.map +1 -0
  143. package/dist/lib/bitcore/transaction/output.js +231 -0
  144. package/dist/lib/bitcore/transaction/sighash.d.ts +32 -0
  145. package/dist/lib/bitcore/transaction/sighash.d.ts.map +1 -0
  146. package/dist/lib/bitcore/transaction/sighash.js +335 -0
  147. package/dist/lib/bitcore/transaction/signature.d.ts +36 -0
  148. package/dist/lib/bitcore/transaction/signature.d.ts.map +1 -0
  149. package/dist/lib/bitcore/transaction/signature.js +130 -0
  150. package/dist/lib/bitcore/transaction/transaction.d.ts +164 -0
  151. package/dist/lib/bitcore/transaction/transaction.d.ts.map +1 -0
  152. package/dist/lib/bitcore/transaction/transaction.js +1016 -0
  153. package/dist/lib/bitcore/transaction/unspentoutput.d.ts +58 -0
  154. package/dist/lib/bitcore/transaction/unspentoutput.d.ts.map +1 -0
  155. package/dist/lib/bitcore/transaction/unspentoutput.js +167 -0
  156. package/dist/lib/bitcore/unit.d.ts +44 -0
  157. package/dist/lib/bitcore/unit.d.ts.map +1 -0
  158. package/dist/lib/bitcore/unit.js +106 -0
  159. package/dist/lib/bitcore/uri.d.ts +29 -0
  160. package/dist/lib/bitcore/uri.d.ts.map +1 -0
  161. package/dist/lib/bitcore/uri.js +163 -0
  162. package/dist/lib/bitcore/util/base32.d.ts +5 -0
  163. package/dist/lib/bitcore/util/base32.d.ts.map +1 -0
  164. package/dist/lib/bitcore/util/base32.js +58 -0
  165. package/dist/lib/bitcore/util/buffer.d.ts +18 -0
  166. package/dist/lib/bitcore/util/buffer.d.ts.map +1 -0
  167. package/dist/lib/bitcore/util/buffer.js +76 -0
  168. package/dist/lib/bitcore/util/convertBits.d.ts +2 -0
  169. package/dist/lib/bitcore/util/convertBits.d.ts.map +1 -0
  170. package/dist/lib/bitcore/util/convertBits.js +26 -0
  171. package/dist/lib/bitcore/util/js.d.ts +9 -0
  172. package/dist/lib/bitcore/util/js.d.ts.map +1 -0
  173. package/dist/lib/bitcore/util/js.js +45 -0
  174. package/dist/lib/bitcore/util/preconditions.d.ts +6 -0
  175. package/dist/lib/bitcore/util/preconditions.d.ts.map +1 -0
  176. package/dist/lib/bitcore/util/preconditions.js +31 -0
  177. package/dist/lib/bitcore/util.d.ts +14 -0
  178. package/dist/lib/bitcore/util.d.ts.map +1 -0
  179. package/dist/lib/bitcore/util.js +13 -0
  180. package/dist/lib/bitcore/xaddress.d.ts +45 -0
  181. package/dist/lib/bitcore/xaddress.d.ts.map +1 -0
  182. package/dist/lib/bitcore/xaddress.js +279 -0
  183. package/dist/lib/rank/api.d.ts +75 -0
  184. package/dist/lib/rank/api.d.ts.map +1 -0
  185. package/dist/lib/rank/api.js +4 -0
  186. package/dist/lib/rank/index.d.ts +127 -0
  187. package/dist/lib/rank/index.d.ts.map +1 -0
  188. package/dist/lib/rank/index.js +421 -0
  189. package/dist/lib/rank/opcode.d.ts +23 -0
  190. package/dist/lib/rank/opcode.d.ts.map +1 -0
  191. package/dist/lib/rank/opcode.js +23 -0
  192. package/dist/lib/rank/script.d.ts +2 -0
  193. package/dist/lib/rank/script.d.ts.map +1 -0
  194. package/dist/lib/rank/script.js +7 -0
  195. package/dist/lib/rank/transaction.d.ts +3 -0
  196. package/dist/lib/rank/transaction.d.ts.map +1 -0
  197. package/dist/lib/rank/transaction.js +12 -0
  198. package/dist/lib/rpc.d.ts +136 -0
  199. package/dist/lib/rpc.d.ts.map +1 -0
  200. package/dist/lib/rpc.js +62 -0
  201. package/dist/utils/constants.d.ts +18 -0
  202. package/dist/utils/constants.d.ts.map +1 -0
  203. package/dist/utils/constants.js +20 -0
  204. package/dist/utils/env.d.ts +3 -0
  205. package/dist/utils/env.d.ts.map +1 -0
  206. package/dist/utils/env.js +8 -0
  207. package/dist/utils/string.d.ts +11 -0
  208. package/dist/utils/string.d.ts.map +1 -0
  209. package/dist/utils/string.js +47 -0
  210. package/dist/utils/types.d.ts +2 -0
  211. package/dist/utils/types.d.ts.map +1 -0
  212. package/dist/utils/types.js +1 -0
  213. package/dist/utils/wallet.d.ts +12 -0
  214. package/dist/utils/wallet.d.ts.map +1 -0
  215. package/dist/utils/wallet.js +28 -0
  216. package/package.json +91 -0
@@ -0,0 +1,48 @@
1
+ import { BufferWriter } from '../encoding/bufferwriter.js';
2
+ import { BufferReader } from '../encoding/bufferreader.js';
3
+ import { Script } from '../script.js';
4
+ import { BN } from '../crypto/bn.js';
5
+ export interface OutputData {
6
+ satoshis?: number | bigint | BN | string;
7
+ script?: Script | Buffer | string;
8
+ scriptBuffer?: Buffer;
9
+ }
10
+ export interface OutputObject {
11
+ satoshis: number;
12
+ script: string;
13
+ asm: string;
14
+ }
15
+ export declare class Output {
16
+ satoshis: number;
17
+ private _satoshisBN;
18
+ private _scriptBuffer;
19
+ private _script?;
20
+ constructor(args: OutputData);
21
+ static create(args: OutputData): Output;
22
+ private _parseSatoshis;
23
+ get satoshisBN(): BN;
24
+ set satoshisBN(value: BN);
25
+ get script(): Script;
26
+ get scriptBuffer(): Buffer;
27
+ setScriptFromBuffer(buffer: Buffer): void;
28
+ setScript(script: Script | Buffer | string): Output;
29
+ getXPI(): number;
30
+ setXPI(xpi: number): Output;
31
+ isValid(): boolean;
32
+ isDust(dustThreshold?: number): boolean;
33
+ invalidSatoshis(): string | false;
34
+ isOpReturn(): boolean;
35
+ toObject(): OutputObject;
36
+ toJSON: () => OutputObject;
37
+ inspect(): string;
38
+ static fromBufferReader(br: BufferReader): Output;
39
+ toBuffer(): Buffer;
40
+ toBufferWriter(writer?: BufferWriter): BufferWriter;
41
+ getSize(): number;
42
+ clone(): Output;
43
+ static fromObject(data: OutputData): Output;
44
+ isPayToPublicKeyHash(): boolean;
45
+ isPayToScriptHash(): boolean;
46
+ getAddress(): string | null;
47
+ }
48
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../lib/bitcore/transaction/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAIpC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ;AAKD,qBAAa,MAAM;IAEjB,QAAQ,EAAG,MAAM,CAAA;IACjB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAQ;gBAEZ,IAAI,EAAE,UAAU;IA0B5B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAOvC,OAAO,CAAC,cAAc;IAiCtB,IAAI,UAAU,IAAI,EAAE,CAEnB;IAKD,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,EAOvB;IAKD,IAAI,MAAM,IAAI,MAAM,CAOnB;IAKD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAKD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBzC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;IAoBnD,MAAM,IAAI,MAAM;IAOhB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAS3B,OAAO,IAAI,OAAO;IAWlB,MAAM,CAAC,aAAa,GAAE,MAAY,GAAG,OAAO;IAO5C,eAAe,IAAI,MAAM,GAAG,KAAK;IAgBjC,UAAU,IAAI,OAAO;IAerB,QAAQ,IAAI,YAAY;IAWxB,MAAM,QAXM,YAAY,CAWF;IAKtB,OAAO,IAAI,MAAM;IAajB,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM;IAejD,QAAQ,IAAI,MAAM;IAWlB,cAAc,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY;IAcnD,OAAO,IAAI,MAAM;IAWjB,KAAK,IAAI,MAAM;IAUf,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAO3C,oBAAoB,IAAI,OAAO;IAO/B,iBAAiB,IAAI,OAAO;IAO5B,UAAU,IAAI,MAAM,GAAG,IAAI;CAQ5B"}
@@ -0,0 +1,231 @@
1
+ import { Preconditions } from '../util/preconditions.js';
2
+ import { BitcoreError } from '../errors.js';
3
+ import { BufferWriter } from '../encoding/bufferwriter.js';
4
+ import { JSUtil } from '../util/js.js';
5
+ import { Script } from '../script.js';
6
+ import { BN } from '../crypto/bn.js';
7
+ const MAX_SAFE_INTEGER = 0x1fffffffffffff;
8
+ export class Output {
9
+ satoshis;
10
+ _satoshisBN;
11
+ _scriptBuffer;
12
+ _script;
13
+ constructor(args) {
14
+ if (typeof args === 'object' && args !== null) {
15
+ if (args.satoshis !== undefined) {
16
+ this.satoshis = this._parseSatoshis(args.satoshis);
17
+ }
18
+ else {
19
+ this.satoshis = 0;
20
+ this._satoshisBN = new BN(0);
21
+ }
22
+ if (Buffer.isBuffer(args.script)) {
23
+ this._scriptBuffer = args.script;
24
+ }
25
+ else if (args.scriptBuffer !== undefined) {
26
+ this._scriptBuffer = args.scriptBuffer;
27
+ }
28
+ else if (args.script !== undefined) {
29
+ this.setScript(args.script);
30
+ }
31
+ else {
32
+ this._scriptBuffer = Buffer.alloc(0);
33
+ }
34
+ }
35
+ else {
36
+ throw new TypeError('Unrecognized argument for Output');
37
+ }
38
+ }
39
+ static create(args) {
40
+ return new Output(args);
41
+ }
42
+ _parseSatoshis(value) {
43
+ if (value instanceof BN) {
44
+ this._satoshisBN = value;
45
+ return value.toNumber();
46
+ }
47
+ else if (typeof value === 'string') {
48
+ const num = parseInt(value);
49
+ Preconditions.checkArgument(JSUtil.isNaturalNumber(num), 'Output satoshis is not a natural number');
50
+ this._satoshisBN = new BN(num);
51
+ return num;
52
+ }
53
+ else if (typeof value === 'bigint') {
54
+ const num = Number(value);
55
+ Preconditions.checkArgument(JSUtil.isNaturalNumber(num), 'Output satoshis is not a natural number');
56
+ this._satoshisBN = new BN(num);
57
+ return num;
58
+ }
59
+ else {
60
+ Preconditions.checkArgument(JSUtil.isNaturalNumber(value), 'Output satoshis is not a natural number');
61
+ this._satoshisBN = new BN(value);
62
+ return value;
63
+ }
64
+ }
65
+ get satoshisBN() {
66
+ return this._satoshisBN;
67
+ }
68
+ set satoshisBN(value) {
69
+ this._satoshisBN = value;
70
+ this.satoshis = value.toNumber();
71
+ Preconditions.checkState(JSUtil.isNaturalNumber(this.satoshis), 'Output satoshis is not a natural number');
72
+ }
73
+ get script() {
74
+ if (this._script) {
75
+ return this._script;
76
+ }
77
+ else {
78
+ this.setScriptFromBuffer(this._scriptBuffer);
79
+ return this._script;
80
+ }
81
+ }
82
+ get scriptBuffer() {
83
+ return this._scriptBuffer;
84
+ }
85
+ setScriptFromBuffer(buffer) {
86
+ this._scriptBuffer = buffer;
87
+ try {
88
+ this._script = Script.fromBuffer(this._scriptBuffer);
89
+ this._script._isOutput = true;
90
+ }
91
+ catch (e) {
92
+ if (e instanceof BitcoreError.Script.InvalidBuffer) {
93
+ this._script = undefined;
94
+ }
95
+ else {
96
+ throw e;
97
+ }
98
+ }
99
+ }
100
+ setScript(script) {
101
+ if (script instanceof Script) {
102
+ this._scriptBuffer = script.toBuffer();
103
+ this._script = script;
104
+ this._script._isOutput = true;
105
+ }
106
+ else if (typeof script === 'string') {
107
+ this._script = Script.fromString(script);
108
+ this._scriptBuffer = this._script.toBuffer();
109
+ this._script._isOutput = true;
110
+ }
111
+ else if (Buffer.isBuffer(script)) {
112
+ this.setScriptFromBuffer(script);
113
+ }
114
+ else {
115
+ throw new TypeError('Invalid argument type: script');
116
+ }
117
+ return this;
118
+ }
119
+ getXPI() {
120
+ return this.satoshis / 1000000;
121
+ }
122
+ setXPI(xpi) {
123
+ this.satoshis = Math.round(xpi * 1000000);
124
+ this._satoshisBN = new BN(this.satoshis);
125
+ return this;
126
+ }
127
+ isValid() {
128
+ return (this.satoshis >= 0 &&
129
+ this.satoshis <= 21000000 * 1000000 &&
130
+ this._scriptBuffer.length > 0);
131
+ }
132
+ isDust(dustThreshold = 546) {
133
+ return this.satoshis < dustThreshold;
134
+ }
135
+ invalidSatoshis() {
136
+ if (this.satoshis > MAX_SAFE_INTEGER) {
137
+ return 'transaction txout satoshis greater than max safe integer';
138
+ }
139
+ if (this.satoshis !== this._satoshisBN.toNumber()) {
140
+ return 'transaction txout satoshis has corrupted value';
141
+ }
142
+ if (this.satoshis < 0) {
143
+ return 'transaction txout negative';
144
+ }
145
+ return false;
146
+ }
147
+ isOpReturn() {
148
+ if (!this._script) {
149
+ this.setScriptFromBuffer(this._scriptBuffer);
150
+ }
151
+ return !!(this._script &&
152
+ this._script.chunks.length > 0 &&
153
+ this._script.chunks[0].opcodenum === 0x6a);
154
+ }
155
+ toObject() {
156
+ return {
157
+ satoshis: this.satoshis,
158
+ script: this._scriptBuffer.toString('hex'),
159
+ asm: this.script.toASM(),
160
+ };
161
+ }
162
+ toJSON = this.toObject;
163
+ inspect() {
164
+ let scriptStr;
165
+ if (this.script) {
166
+ scriptStr = this.script.inspect();
167
+ }
168
+ else {
169
+ scriptStr = this._scriptBuffer.toString('hex');
170
+ }
171
+ return '<Output (' + this.satoshis + ' sats) ' + scriptStr + '>';
172
+ }
173
+ static fromBufferReader(br) {
174
+ const obj = {};
175
+ obj.satoshis = br.readUInt64LEBN();
176
+ const size = br.readVarintNum();
177
+ if (size !== 0) {
178
+ obj.script = br.read(size);
179
+ }
180
+ else {
181
+ obj.script = Buffer.from([]);
182
+ }
183
+ return new Output(obj);
184
+ }
185
+ toBuffer() {
186
+ const bw = new BufferWriter();
187
+ bw.writeUInt64LEBN(this._satoshisBN);
188
+ bw.writeVarintNum(this._scriptBuffer.length);
189
+ bw.write(this._scriptBuffer);
190
+ return bw.concat();
191
+ }
192
+ toBufferWriter(writer) {
193
+ if (!writer) {
194
+ writer = new BufferWriter();
195
+ }
196
+ writer.writeUInt64LEBN(this._satoshisBN);
197
+ const script = this._scriptBuffer;
198
+ writer.writeVarintNum(script.length);
199
+ writer.write(script);
200
+ return writer;
201
+ }
202
+ getSize() {
203
+ return (8 +
204
+ BufferWriter.varintBufNum(this._scriptBuffer.length).length +
205
+ this._scriptBuffer.length);
206
+ }
207
+ clone() {
208
+ return new Output({
209
+ satoshis: this.satoshis,
210
+ script: this.script.clone(),
211
+ });
212
+ }
213
+ static fromObject(data) {
214
+ return new Output(data);
215
+ }
216
+ isPayToPublicKeyHash() {
217
+ return this.script.isPayToPublicKeyHash();
218
+ }
219
+ isPayToScriptHash() {
220
+ return this.script.isPayToScriptHash();
221
+ }
222
+ getAddress() {
223
+ try {
224
+ const addressInfo = this.script.getAddressInfo();
225
+ return addressInfo ? addressInfo.toString() : null;
226
+ }
227
+ catch (e) {
228
+ return null;
229
+ }
230
+ }
231
+ }
@@ -0,0 +1,32 @@
1
+ import { Signature } from '../crypto/signature.js';
2
+ import { Script } from '../script.js';
3
+ import { Output } from './output.js';
4
+ import { BufferWriter } from '../encoding/bufferwriter.js';
5
+ import { BN } from '../crypto/bn.js';
6
+ import { PrivateKey } from '../privatekey.js';
7
+ import { PublicKey } from '../publickey.js';
8
+ export interface TransactionLike {
9
+ inputs: Array<{
10
+ prevTxId: Buffer;
11
+ outputIndex: number;
12
+ sequenceNumber: number;
13
+ script?: Script | null;
14
+ }>;
15
+ outputs: Array<{
16
+ satoshis: number;
17
+ script?: Script;
18
+ toBufferWriter(writer: BufferWriter): void;
19
+ }>;
20
+ spentOutputs?: Output[];
21
+ toBuffer(): Buffer;
22
+ version?: number;
23
+ nLockTime?: number;
24
+ }
25
+ declare function sighash(transaction: TransactionLike, sighashType: number, inputNumber: number, subscript: Script, satoshisBN?: BN, flags?: number): Buffer;
26
+ declare function sign(transaction: TransactionLike, privateKey: PrivateKey, sighashType: number, inputIndex: number, subscript: Script, satoshisBN?: BN, flags?: number, signingMethod?: 'ecdsa' | 'schnorr'): Signature;
27
+ declare function verify(transaction: TransactionLike, signature: Signature, publicKey: PublicKey, inputIndex: number, subscript: Script, satoshisBN?: BN, flags?: number, signingMethod?: 'ecdsa' | 'schnorr'): boolean;
28
+ export declare const DEFAULT_SIGN_FLAGS: number;
29
+ export declare const SIGHASH_SINGLE_BUG = "0000000000000000000000000000000000000000000000000000000000000001";
30
+ export declare const BITS_64_ON = "ffffffffffffffff";
31
+ export { sighash, sign, verify };
32
+ //# sourceMappingURL=sighash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sighash.d.ts","sourceRoot":"","sources":["../../../../lib/bitcore/transaction/sighash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAS,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAOpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,WAAW,eAAe;IAE9B,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,MAAM,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACvB,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;KAC3C,CAAC,CAAA;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,IAAI,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAsZD,iBAAS,OAAO,CACd,WAAW,EAAE,eAAe,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CA6HR;AAwBD,iBAAS,IAAI,CACX,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,SAAS,CAwBX;AAoBD,iBAAS,MAAM,CACb,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,OAAO,CA8BT;AA4DD,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAK1D,eAAO,MAAM,kBAAkB,qEAA2B,CAAA;AAC1D,eAAO,MAAM,UAAU,qBAAmB,CAAA;AAK1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,335 @@
1
+ import { Signature } from '../crypto/signature.js';
2
+ import { Script, empty } from '../script.js';
3
+ import { Output } from './output.js';
4
+ import { BufferReader } from '../encoding/bufferreader.js';
5
+ import { BufferWriter } from '../encoding/bufferwriter.js';
6
+ import { BN } from '../crypto/bn.js';
7
+ import { Hash } from '../crypto/hash.js';
8
+ import { ECDSA } from '../crypto/ecdsa.js';
9
+ import { Schnorr } from '../crypto/schnorr.js';
10
+ import { Preconditions } from '../util/preconditions.js';
11
+ import { BufferUtil } from '../util/buffer.js';
12
+ import { Interpreter } from '../script/interpreter.js';
13
+ import { Transaction } from './transaction.js';
14
+ import { Input } from './input.js';
15
+ const SIGHASH_SINGLE_BUG_CONST = '0000000000000000000000000000000000000000000000000000000000000001';
16
+ const BITS_64_ON_CONST = 'ffffffffffffffff';
17
+ const NULL_HASH = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex');
18
+ const SIGHASH_ALGORITHM_MASK = 0x60;
19
+ const DEFAULT_SIGN_FLAGS_CONST = 1 << 16;
20
+ function GetForkId() {
21
+ return 0;
22
+ }
23
+ function getMerkleRoot(hashes) {
24
+ if (hashes.length === 0) {
25
+ return { root: NULL_HASH, height: 0 };
26
+ }
27
+ let currentHashes = [...hashes];
28
+ let height = 1;
29
+ while (currentHashes.length > 1) {
30
+ height++;
31
+ const newHashes = [];
32
+ for (let i = 0; i < currentHashes.length; i += 2) {
33
+ const left = currentHashes[i];
34
+ const right = i + 1 < currentHashes.length ? currentHashes[i + 1] : NULL_HASH;
35
+ const combined = Buffer.concat([left, right]);
36
+ const pairHash = Hash.sha256sha256(combined);
37
+ newHashes.push(pairHash);
38
+ }
39
+ currentHashes = newHashes;
40
+ }
41
+ return { root: currentHashes[0], height };
42
+ }
43
+ function sighashForLotus(transaction, sighashType, inputNumber, spentOutputs, executedScriptHash, codeseparatorPos = 0xffffffff) {
44
+ Preconditions.checkArgument(spentOutputs.length === transaction.inputs.length, 'Must provide spent output for each input');
45
+ Preconditions.checkArgument(inputNumber < transaction.inputs.length, 'Input index out of range');
46
+ const baseType = sighashType & 0x03;
47
+ const unusedBits = sighashType & 0x1c;
48
+ if (baseType === 0 || unusedBits !== 0) {
49
+ throw new Error('Invalid sighash type for SIGHASH_LOTUS');
50
+ }
51
+ const input = transaction.inputs[inputNumber];
52
+ const writer = new BufferWriter();
53
+ writer.writeUInt32LE(sighashType >>> 0);
54
+ const spendType = executedScriptHash ? 2 : 0;
55
+ const inputHashWriter = new BufferWriter();
56
+ inputHashWriter.writeUInt8(spendType);
57
+ inputHashWriter.writeReverse(input.prevTxId);
58
+ inputHashWriter.writeUInt32LE(input.outputIndex);
59
+ inputHashWriter.writeUInt32LE(input.sequenceNumber);
60
+ const spentOutput = spentOutputs[inputNumber];
61
+ inputHashWriter.writeUInt64LEBN(new BN(spentOutput.satoshis));
62
+ inputHashWriter.writeVarLengthBuffer(spentOutput.scriptBuffer);
63
+ const inputHash = Hash.sha256sha256(inputHashWriter.toBuffer());
64
+ writer.write(inputHash);
65
+ if (executedScriptHash) {
66
+ Preconditions.checkArgument(executedScriptHash.length === 32, 'executed_script_hash must be 32 bytes');
67
+ writer.writeUInt32LE(codeseparatorPos);
68
+ writer.write(executedScriptHash);
69
+ }
70
+ if (!(sighashType & Signature.SIGHASH_ANYONECANPAY)) {
71
+ writer.writeUInt32LE(inputNumber);
72
+ const spentOutputHashes = spentOutputs.map(output => {
73
+ const w = new BufferWriter();
74
+ w.writeUInt64LEBN(new BN(output.satoshis));
75
+ w.writeVarLengthBuffer(output.scriptBuffer);
76
+ return Hash.sha256sha256(w.toBuffer());
77
+ });
78
+ const spentOutputsMerkle = getMerkleRoot(spentOutputHashes);
79
+ writer.write(spentOutputsMerkle.root);
80
+ const totalInputAmount = spentOutputs.reduce((sum, output) => sum + output.satoshis, 0);
81
+ writer.writeUInt64LEBN(new BN(totalInputAmount));
82
+ }
83
+ if (baseType === Signature.SIGHASH_ALL) {
84
+ const totalOutputAmount = transaction.outputs.reduce((sum, output) => sum + output.satoshis, 0);
85
+ writer.writeUInt64LEBN(new BN(totalOutputAmount));
86
+ }
87
+ writer.writeUInt32LE(transaction.version || 2);
88
+ if (!(sighashType & Signature.SIGHASH_ANYONECANPAY)) {
89
+ const inputHashes = transaction.inputs.map(inp => {
90
+ const w = new BufferWriter();
91
+ w.writeReverse(inp.prevTxId);
92
+ w.writeUInt32LE(inp.outputIndex);
93
+ w.writeUInt32LE(inp.sequenceNumber);
94
+ return Hash.sha256sha256(w.toBuffer());
95
+ });
96
+ const inputsMerkle = getMerkleRoot(inputHashes);
97
+ writer.write(inputsMerkle.root);
98
+ writer.writeUInt8(inputsMerkle.height);
99
+ }
100
+ if (baseType === Signature.SIGHASH_SINGLE) {
101
+ if (inputNumber >= transaction.outputs.length) {
102
+ throw new Error('SIGHASH_SINGLE: no corresponding output for input');
103
+ }
104
+ const w = new BufferWriter();
105
+ transaction.outputs[inputNumber].toBufferWriter(w);
106
+ const outputHash = Hash.sha256sha256(w.toBuffer());
107
+ writer.write(outputHash);
108
+ }
109
+ if (baseType === Signature.SIGHASH_ALL) {
110
+ const outputHashes = transaction.outputs.map(output => {
111
+ const w = new BufferWriter();
112
+ output.toBufferWriter(w);
113
+ return Hash.sha256sha256(w.toBuffer());
114
+ });
115
+ const outputsMerkle = getMerkleRoot(outputHashes);
116
+ writer.write(outputsMerkle.root);
117
+ writer.writeUInt8(outputsMerkle.height);
118
+ }
119
+ writer.writeUInt32LE(transaction.nLockTime || 0);
120
+ return Hash.sha256sha256(writer.toBuffer());
121
+ }
122
+ function sighashForForkId(transaction, sighashType, inputNumber, subscript, satoshisBN) {
123
+ const input = transaction.inputs[inputNumber];
124
+ Preconditions.checkArgument(satoshisBN instanceof BN, 'For ForkId=0 signatures, satoshis or complete input must be provided');
125
+ let hashPrevouts = BufferUtil.emptyBuffer(32);
126
+ let hashSequence = BufferUtil.emptyBuffer(32);
127
+ let hashOutputs = BufferUtil.emptyBuffer(32);
128
+ if (!(sighashType & Signature.SIGHASH_ANYONECANPAY)) {
129
+ hashPrevouts = GetPrevoutHash(transaction);
130
+ }
131
+ if (!(sighashType & Signature.SIGHASH_ANYONECANPAY) &&
132
+ (sighashType & 31) !== Signature.SIGHASH_SINGLE &&
133
+ (sighashType & 31) !== Signature.SIGHASH_NONE) {
134
+ hashSequence = GetSequenceHash(transaction);
135
+ }
136
+ if ((sighashType & 31) !== Signature.SIGHASH_SINGLE &&
137
+ (sighashType & 31) !== Signature.SIGHASH_NONE) {
138
+ hashOutputs = GetOutputsHash(transaction);
139
+ }
140
+ else if ((sighashType & 31) === Signature.SIGHASH_SINGLE &&
141
+ inputNumber < transaction.outputs.length) {
142
+ hashOutputs = GetOutputsHash(transaction, inputNumber);
143
+ }
144
+ const writer = new BufferWriter();
145
+ writer.writeUInt32LE(transaction.version || 2);
146
+ writer.write(hashPrevouts);
147
+ writer.write(hashSequence);
148
+ writer.writeReverse(input.prevTxId);
149
+ writer.writeUInt32LE(input.outputIndex);
150
+ writer.writeVarintNum(subscript.toBuffer().length);
151
+ writer.write(subscript.toBuffer());
152
+ writer.writeUInt64LEBN(satoshisBN);
153
+ writer.writeUInt32LENumber(input.sequenceNumber);
154
+ writer.write(hashOutputs);
155
+ writer.writeUInt32LE(transaction.nLockTime || 0);
156
+ writer.writeUInt32LE(sighashType >>> 0);
157
+ const buf = writer.toBuffer();
158
+ const hash = Hash.sha256sha256(buf);
159
+ return new BufferReader(hash).read(32);
160
+ }
161
+ function sighashLegacy(transaction, sighashType, inputNumber, subscript) {
162
+ const input = transaction.inputs[inputNumber];
163
+ function getHash(w) {
164
+ const buf = w.toBuffer();
165
+ return Hash.sha256sha256(buf);
166
+ }
167
+ const writer = new BufferWriter();
168
+ writer.writeUInt32LE(2);
169
+ writer.writeVarintNum(transaction.inputs.length);
170
+ for (let i = 0; i < transaction.inputs.length; i++) {
171
+ const txInput = transaction.inputs[i];
172
+ writer.writeReverse(txInput.prevTxId);
173
+ writer.writeUInt32LE(txInput.outputIndex);
174
+ if (i === inputNumber) {
175
+ writer.writeVarLengthBuffer(subscript.toBuffer());
176
+ }
177
+ else {
178
+ writer.writeVarintNum(0);
179
+ }
180
+ writer.writeUInt32LENumber(txInput.sequenceNumber);
181
+ }
182
+ writer.writeVarintNum(transaction.outputs.length);
183
+ if ((sighashType & 31) !== Signature.SIGHASH_SINGLE &&
184
+ (sighashType & 31) !== Signature.SIGHASH_NONE) {
185
+ for (const output of transaction.outputs) {
186
+ output.toBufferWriter(writer);
187
+ }
188
+ }
189
+ else if ((sighashType & 31) === Signature.SIGHASH_SINGLE &&
190
+ inputNumber < transaction.outputs.length) {
191
+ transaction.outputs[inputNumber].toBufferWriter(writer);
192
+ }
193
+ writer.writeUInt32LE(transaction.nLockTime || 0);
194
+ writer.writeUInt32LE(sighashType);
195
+ return getHash(writer);
196
+ }
197
+ function sighash(transaction, sighashType, inputNumber, subscript, satoshisBN, flags) {
198
+ if (flags === undefined) {
199
+ flags = DEFAULT_SIGN_FLAGS_CONST;
200
+ }
201
+ const txcopy = Transaction.shallowCopy(transaction);
202
+ subscript = new Script(subscript);
203
+ if (flags & Interpreter.SCRIPT_ENABLE_REPLAY_PROTECTION) {
204
+ const forkValue = sighashType >> 8;
205
+ const newForkValue = 0xff0000 | (forkValue ^ 0xdead);
206
+ sighashType = (newForkValue << 8) | (sighashType & 0xff);
207
+ }
208
+ const algorithmBits = sighashType & SIGHASH_ALGORITHM_MASK;
209
+ if (algorithmBits === Signature.SIGHASH_LOTUS &&
210
+ flags & Interpreter.SCRIPT_ENABLE_SIGHASH_FORKID) {
211
+ const spentOutputs = transaction.spentOutputs;
212
+ if (!spentOutputs || spentOutputs.length !== transaction.inputs.length) {
213
+ throw new Error('SIGHASH_LOTUS requires spent outputs for all inputs (ensure all inputs have output information)');
214
+ }
215
+ return sighashForLotus(txcopy, sighashType, inputNumber, spentOutputs);
216
+ }
217
+ if (algorithmBits === Signature.SIGHASH_FORKID &&
218
+ flags & Interpreter.SCRIPT_ENABLE_SIGHASH_FORKID) {
219
+ return sighashForForkId(txcopy, sighashType, inputNumber, subscript, satoshisBN);
220
+ }
221
+ subscript.removeCodeseparators();
222
+ for (let i = 0; i < txcopy.inputs.length; i++) {
223
+ txcopy.inputs[i] = new Input({
224
+ prevTxId: txcopy.inputs[i].prevTxId,
225
+ outputIndex: txcopy.inputs[i].outputIndex,
226
+ sequenceNumber: txcopy.inputs[i].sequenceNumber,
227
+ script: empty(),
228
+ });
229
+ }
230
+ txcopy.inputs[inputNumber] = new Input({
231
+ prevTxId: txcopy.inputs[inputNumber].prevTxId,
232
+ outputIndex: txcopy.inputs[inputNumber].outputIndex,
233
+ sequenceNumber: txcopy.inputs[inputNumber].sequenceNumber,
234
+ script: subscript,
235
+ });
236
+ if ((sighashType & 31) === Signature.SIGHASH_NONE ||
237
+ (sighashType & 31) === Signature.SIGHASH_SINGLE) {
238
+ for (let i = 0; i < txcopy.inputs.length; i++) {
239
+ if (i !== inputNumber) {
240
+ txcopy.inputs[i].sequenceNumber = 0;
241
+ }
242
+ }
243
+ }
244
+ if ((sighashType & 31) === Signature.SIGHASH_NONE) {
245
+ txcopy.outputs = [];
246
+ }
247
+ else if ((sighashType & 31) === Signature.SIGHASH_SINGLE) {
248
+ if (inputNumber >= txcopy.outputs.length) {
249
+ return Buffer.from(SIGHASH_SINGLE_BUG_CONST, 'hex');
250
+ }
251
+ txcopy.outputs.length = inputNumber + 1;
252
+ for (let i = 0; i < inputNumber; i++) {
253
+ txcopy.outputs[i] = new Output({
254
+ satoshis: BN.fromBuffer(Buffer.from(BITS_64_ON_CONST, 'hex')),
255
+ script: empty(),
256
+ });
257
+ }
258
+ }
259
+ if (sighashType & Signature.SIGHASH_ANYONECANPAY) {
260
+ txcopy.inputs = [txcopy.inputs[inputNumber]];
261
+ }
262
+ const buf = new BufferWriter()
263
+ .write(txcopy.toBuffer())
264
+ .writeInt32LE(sighashType >>> 0)
265
+ .toBuffer();
266
+ const hash = Hash.sha256sha256(buf);
267
+ return new BufferReader(hash).readReverse(32);
268
+ }
269
+ function sign(transaction, privateKey, sighashType, inputIndex, subscript, satoshisBN, flags, signingMethod) {
270
+ const hashbuf = sighash(transaction, sighashType, inputIndex, subscript, satoshisBN, flags);
271
+ signingMethod = signingMethod || 'ecdsa';
272
+ let sig;
273
+ if (signingMethod === 'schnorr') {
274
+ sig = Schnorr.sign(hashbuf, privateKey, 'big');
275
+ sig.nhashtype = sighashType;
276
+ return sig;
277
+ }
278
+ else if (signingMethod === 'ecdsa') {
279
+ sig = ECDSA.sign(hashbuf, privateKey, 'big');
280
+ sig.nhashtype = sighashType;
281
+ return sig;
282
+ }
283
+ else {
284
+ throw new Error('Invalid signing method. Must be "ecdsa" or "schnorr"');
285
+ }
286
+ }
287
+ function verify(transaction, signature, publicKey, inputIndex, subscript, satoshisBN, flags, signingMethod) {
288
+ Preconditions.checkArgument(transaction !== undefined, 'Transaction is required');
289
+ Preconditions.checkArgument(signature !== undefined && signature.nhashtype !== undefined, 'Signature with nhashtype is required');
290
+ const hashbuf = sighash(transaction, signature.nhashtype, inputIndex, subscript, satoshisBN, flags);
291
+ signingMethod = signingMethod || 'ecdsa';
292
+ if (signingMethod === 'schnorr') {
293
+ return Schnorr.verify(hashbuf, signature, publicKey, 'big');
294
+ }
295
+ else if (signingMethod === 'ecdsa') {
296
+ return ECDSA.verify(hashbuf, signature, publicKey, 'big');
297
+ }
298
+ else {
299
+ throw new Error('Invalid signing method. Must be "ecdsa" or "schnorr"');
300
+ }
301
+ }
302
+ function GetPrevoutHash(tx) {
303
+ const writer = new BufferWriter();
304
+ for (const input of tx.inputs) {
305
+ writer.writeReverse(input.prevTxId);
306
+ writer.writeUInt32LE(input.outputIndex);
307
+ }
308
+ const buf = writer.toBuffer();
309
+ return Hash.sha256sha256(buf);
310
+ }
311
+ function GetSequenceHash(tx) {
312
+ const writer = new BufferWriter();
313
+ for (const input of tx.inputs) {
314
+ writer.writeUInt32LENumber(input.sequenceNumber);
315
+ }
316
+ const buf = writer.toBuffer();
317
+ return Hash.sha256sha256(buf);
318
+ }
319
+ function GetOutputsHash(tx, n) {
320
+ const writer = new BufferWriter();
321
+ if (n === undefined) {
322
+ for (const output of tx.outputs) {
323
+ output.toBufferWriter(writer);
324
+ }
325
+ }
326
+ else {
327
+ tx.outputs[n].toBufferWriter(writer);
328
+ }
329
+ const buf = writer.toBuffer();
330
+ return Hash.sha256sha256(buf);
331
+ }
332
+ export const DEFAULT_SIGN_FLAGS = DEFAULT_SIGN_FLAGS_CONST;
333
+ export const SIGHASH_SINGLE_BUG = SIGHASH_SINGLE_BUG_CONST;
334
+ export const BITS_64_ON = BITS_64_ON_CONST;
335
+ export { sighash, sign, verify };