@btc-vision/transaction 1.0.85 → 1.0.87

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 (281) hide show
  1. package/.gitattributes +2 -2
  2. package/browser/_version.d.ts +1 -1
  3. package/browser/index.js +1 -1
  4. package/browser/keypair/Wallet.d.ts +3 -0
  5. package/browser/transaction/builders/TapUnwarpTransaction.d.ts +40 -40
  6. package/browser/transaction/builders/UnwarpTransaction.d.ts +34 -34
  7. package/browser/utxo/UTXOManager.d.ts +7 -7
  8. package/build/Utils.d.ts +0 -0
  9. package/build/Utils.js +1 -0
  10. package/build/_version.d.ts +1 -1
  11. package/build/_version.js +1 -1
  12. package/build/consensus/metadata/RoswsellConsensus.d.ts +2 -0
  13. package/build/consensus/metadata/RoswsellConsensus.js +4 -0
  14. package/build/contracts/ContractMetadataManager.d.ts +0 -0
  15. package/build/contracts/ContractMetadataManager.js +1 -0
  16. package/build/generators/OPNetAddressGenerator.d.ts +0 -0
  17. package/build/generators/OPNetAddressGenerator.js +1 -0
  18. package/build/generators/builders/UnwrapGenerator.d.ts +8 -0
  19. package/build/generators/builders/UnwrapGenerator.js +79 -0
  20. package/build/keypair/Wallet.d.ts +3 -0
  21. package/build/keypair/Wallet.js +8 -0
  22. package/build/keypair/interfaces/GeneratedWallet.d.ts +5 -0
  23. package/build/keypair/interfaces/GeneratedWallet.js +1 -0
  24. package/build/metadata/CommonContracts.d.ts +6 -0
  25. package/build/metadata/CommonContracts.js +5 -0
  26. package/build/metadata/ContractMetadataManager.d.ts +1 -0
  27. package/build/metadata/ContractMetadataManager.js +9 -0
  28. package/build/metadata/contracts/ContractBase.d.ts +9 -0
  29. package/build/metadata/contracts/ContractBase.js +13 -0
  30. package/build/metadata/contracts/ContractBaseMetadata.d.ts +9 -0
  31. package/build/metadata/contracts/ContractBaseMetadata.js +13 -0
  32. package/build/metadata/contracts/ContractMetadataManager.d.ts +0 -0
  33. package/build/metadata/contracts/ContractMetadataManager.js +1 -0
  34. package/build/metadata/tokens.js +1 -1
  35. package/build/network/NetworkConverter.d.ts +0 -0
  36. package/build/network/NetworkConverter.js +14 -0
  37. package/build/scripts/Regtest.d.ts +2 -0
  38. package/build/scripts/Regtest.js +15 -0
  39. package/build/scripts/test.d.ts +1 -0
  40. package/build/scripts/test.js +74 -0
  41. package/build/signer/Regtest.d.ts +2 -0
  42. package/build/signer/Regtest.js +15 -0
  43. package/build/tests/Regtest.d.ts +3 -0
  44. package/build/tests/Regtest.js +29 -0
  45. package/build/tests/adaptPSBT.d.ts +1 -0
  46. package/build/tests/adaptPSBT.js +44 -0
  47. package/build/tests/btc/send.d.ts +1 -0
  48. package/build/tests/btc/send.js +35 -0
  49. package/build/tests/btc/transfer.d.ts +1 -0
  50. package/build/tests/btc/transfer.js +35 -0
  51. package/build/tests/createPairReg.d.ts +1 -0
  52. package/build/tests/createPairReg.js +73 -0
  53. package/build/tests/deploy/deployMoto.d.ts +4 -0
  54. package/build/tests/deploy/deployMoto.js +89 -0
  55. package/build/tests/deploy/deployPool.d.ts +1 -0
  56. package/build/tests/deploy/deployPool.js +5 -0
  57. package/build/tests/deploy/deployStep1.d.ts +1 -0
  58. package/build/tests/deploy/deployStep1.js +5 -0
  59. package/build/tests/deploy/deployStep2.d.ts +1 -0
  60. package/build/tests/deploy/deployStep2.js +5 -0
  61. package/build/tests/deploy/deployStep3.d.ts +1 -0
  62. package/build/tests/deploy/deployStep3.js +5 -0
  63. package/build/tests/deploy.d.ts +1 -0
  64. package/build/tests/deploy.js +41 -0
  65. package/build/tests/deployMotoRegStep1.d.ts +1 -0
  66. package/build/tests/deployMotoRegStep1.js +85 -0
  67. package/build/tests/deployReg.d.ts +1 -0
  68. package/build/tests/deployReg.js +85 -0
  69. package/build/tests/factory/createPairReg.d.ts +1 -0
  70. package/build/tests/factory/createPairReg.js +13 -0
  71. package/build/tests/gen.d.ts +1 -0
  72. package/build/tests/gen.js +19 -0
  73. package/build/tests/interaction.d.ts +5 -0
  74. package/build/tests/interaction.js +62 -0
  75. package/build/tests/massWrapReg.d.ts +1 -0
  76. package/build/tests/massWrapReg.js +105 -0
  77. package/build/tests/mineReg.d.ts +1 -0
  78. package/build/tests/mineReg.js +19 -0
  79. package/build/tests/moto/airdropToken.d.ts +1 -0
  80. package/build/tests/moto/airdropToken.js +21 -0
  81. package/build/tests/moto/airdropTokens.d.ts +1 -0
  82. package/build/tests/moto/airdropTokens.js +60 -0
  83. package/build/tests/moto/allowance.d.ts +1 -0
  84. package/build/tests/moto/allowance.js +6 -0
  85. package/build/tests/moto/approve.d.ts +1 -0
  86. package/build/tests/moto/approve.js +10 -0
  87. package/build/tests/moto/approveWBTC.d.ts +1 -0
  88. package/build/tests/moto/approveWBTC.js +12 -0
  89. package/build/tests/moto/balanceOf.d.ts +1 -0
  90. package/build/tests/moto/balanceOf.js +12 -0
  91. package/build/tests/moto/transfer.d.ts +1 -0
  92. package/build/tests/moto/transfer.js +16 -0
  93. package/build/tests/motoswap/airdropToken.d.ts +11 -0
  94. package/build/tests/motoswap/airdropToken.js +36 -0
  95. package/build/tests/motoswap/deployMoto.d.ts +4 -0
  96. package/build/tests/motoswap/deployMoto.js +89 -0
  97. package/build/tests/motoswap/deployMotoRegStep1.d.ts +1 -0
  98. package/build/tests/motoswap/deployMotoRegStep1.js +91 -0
  99. package/build/tests/motoswap/deployMotoRegStep2.d.ts +1 -0
  100. package/build/tests/motoswap/deployMotoRegStep2.js +91 -0
  101. package/build/tests/motoswap/deployPool.d.ts +1 -0
  102. package/build/tests/motoswap/deployPool.js +5 -0
  103. package/build/tests/motoswap/deployStep1.d.ts +1 -0
  104. package/build/tests/motoswap/deployStep1.js +5 -0
  105. package/build/tests/motoswap/deployStep2.d.ts +1 -0
  106. package/build/tests/motoswap/deployStep2.js +5 -0
  107. package/build/tests/motoswap/deployStep3.d.ts +1 -0
  108. package/build/tests/motoswap/deployStep3.js +5 -0
  109. package/build/tests/motoswap/interaction.d.ts +3 -0
  110. package/build/tests/motoswap/interaction.js +63 -0
  111. package/build/tests/motoswap/routerAddLiquidity.d.ts +11 -0
  112. package/build/tests/motoswap/routerAddLiquidity.js +35 -0
  113. package/build/tests/motoswap-router/addLiquidity.d.ts +11 -0
  114. package/build/tests/motoswap-router/addLiquidity.js +36 -0
  115. package/build/tests/motoswap-router/deployMoto.d.ts +4 -0
  116. package/build/tests/motoswap-router/deployMoto.js +89 -0
  117. package/build/tests/motoswap-router/deployPool.d.ts +1 -0
  118. package/build/tests/motoswap-router/deployPool.js +5 -0
  119. package/build/tests/motoswap-router/deployStep1.d.ts +1 -0
  120. package/build/tests/motoswap-router/deployStep1.js +5 -0
  121. package/build/tests/motoswap-router/deployStep2.d.ts +1 -0
  122. package/build/tests/motoswap-router/deployStep2.js +5 -0
  123. package/build/tests/motoswap-router/deployStep3.d.ts +1 -0
  124. package/build/tests/motoswap-router/deployStep3.js +5 -0
  125. package/build/tests/motoswap-router/getAmountsOut.d.ts +5 -0
  126. package/build/tests/motoswap-router/getAmountsOut.js +34 -0
  127. package/build/tests/motoswap-router/routerAddLiquidity.d.ts +11 -0
  128. package/build/tests/motoswap-router/routerAddLiquidity.js +35 -0
  129. package/build/tests/motoswap-router/swap.d.ts +8 -0
  130. package/build/tests/motoswap-router/swap.js +24 -0
  131. package/build/tests/multisign.d.ts +1 -0
  132. package/build/tests/multisign.js +47 -0
  133. package/build/tests/multisign2.d.ts +1 -0
  134. package/build/tests/multisign2.js +27 -0
  135. package/build/tests/pool/DecodePoolAddress.d.ts +6 -0
  136. package/build/tests/pool/DecodePoolAddress.js +12 -0
  137. package/build/tests/pool/decodeReserves.d.ts +5 -0
  138. package/build/tests/pool/decodeReserves.js +13 -0
  139. package/build/tests/pool/reserves.d.ts +1 -0
  140. package/build/tests/pool/reserves.js +18 -0
  141. package/build/tests/shared/Utils.d.ts +2 -0
  142. package/build/tests/shared/Utils.js +14 -0
  143. package/build/tests/shared/interaction.d.ts +7 -0
  144. package/build/tests/shared/interaction.js +85 -0
  145. package/build/tests/shared/tokens.d.ts +6 -0
  146. package/build/tests/shared/tokens.js +5 -0
  147. package/build/tests/stakeReg.d.ts +1 -0
  148. package/build/tests/stakeReg.js +73 -0
  149. package/build/tests/stakedReg.d.ts +1 -0
  150. package/build/tests/stakedReg.js +28 -0
  151. package/build/tests/test.d.ts +1 -0
  152. package/build/tests/test.js +51 -0
  153. package/build/tests/test2.d.ts +1 -0
  154. package/build/tests/test2.js +73 -0
  155. package/build/tests/testReg.d.ts +1 -0
  156. package/build/tests/testReg.js +91 -0
  157. package/build/tests/tokens.d.ts +6 -0
  158. package/build/tests/tokens.js +5 -0
  159. package/build/tests/totalRewardReg.d.ts +1 -0
  160. package/build/tests/totalRewardReg.js +28 -0
  161. package/build/tests/transfer.d.ts +1 -0
  162. package/build/tests/transfer.js +74 -0
  163. package/build/tests/transferReg.d.ts +1 -0
  164. package/build/tests/transferReg.js +74 -0
  165. package/build/tests/unStakeReg.d.ts +1 -0
  166. package/build/tests/unStakeReg.js +72 -0
  167. package/build/tests/unwrapReg.d.ts +1 -0
  168. package/build/tests/unwrapReg.js +61 -0
  169. package/build/tests/unwrapReg2.d.ts +1 -0
  170. package/build/tests/unwrapReg2.js +56 -0
  171. package/build/tests/unwrapRegSegwit.d.ts +1 -0
  172. package/build/tests/unwrapRegSegwit.js +83 -0
  173. package/build/tests/wbtc/approve.d.ts +1 -0
  174. package/build/tests/wbtc/approve.js +6 -0
  175. package/build/tests/wbtc/approveWBTC.d.ts +1 -0
  176. package/build/tests/wbtc/approveWBTC.js +12 -0
  177. package/build/tests/wbtc/massWrapReg.d.ts +1 -0
  178. package/build/tests/wbtc/massWrapReg.js +105 -0
  179. package/build/tests/wbtc/transfer.d.ts +1 -0
  180. package/build/tests/wbtc/transfer.js +16 -0
  181. package/build/tests/wbtc/transferReg.d.ts +1 -0
  182. package/build/tests/wbtc/transferReg.js +16 -0
  183. package/build/tests/wbtc/unStakeReg.d.ts +1 -0
  184. package/build/tests/wbtc/unStakeReg.js +72 -0
  185. package/build/tests/wbtc/unwrapReg.d.ts +1 -0
  186. package/build/tests/wbtc/unwrapReg.js +60 -0
  187. package/build/tests/wbtc/unwrapRegSegwit.d.ts +1 -0
  188. package/build/tests/wbtc/unwrapRegSegwit.js +83 -0
  189. package/build/tests/wbtc/withdrawalRequestReg.d.ts +1 -0
  190. package/build/tests/wbtc/withdrawalRequestReg.js +71 -0
  191. package/build/tests/wbtc/wrapReg.d.ts +1 -0
  192. package/build/tests/wbtc/wrapReg.js +65 -0
  193. package/build/tests/wbtc/wrapTest.d.ts +1 -0
  194. package/build/tests/wbtc/wrapTest.js +66 -0
  195. package/build/tests/withdrawalRequestReg.d.ts +1 -0
  196. package/build/tests/withdrawalRequestReg.js +71 -0
  197. package/build/tests/wrap.d.ts +1 -0
  198. package/build/tests/wrap.js +65 -0
  199. package/build/tests/wrapReg.d.ts +1 -0
  200. package/build/tests/wrapReg.js +68 -0
  201. package/build/tests/wrapTest.d.ts +1 -0
  202. package/build/tests/wrapTest.js +66 -0
  203. package/build/tests/wrapTestg.d.ts +1 -0
  204. package/build/tests/wrapTestg.js +66 -0
  205. package/build/tests/writers/allowance.d.ts +3 -0
  206. package/build/tests/writers/allowance.js +10 -0
  207. package/build/tests/writers/approve.d.ts +4 -0
  208. package/build/tests/writers/approve.js +11 -0
  209. package/build/transaction/TransactionBuilder.d.ts +60 -0
  210. package/build/transaction/TransactionBuilder.js +244 -0
  211. package/build/transaction/TransactionFactory.js +2 -0
  212. package/build/transaction/browser/BrowserSigner.d.ts +11 -0
  213. package/build/transaction/browser/BrowserSigner.js +10 -0
  214. package/build/transaction/browser/extensions/Unisat.d.ts +54 -0
  215. package/build/transaction/browser/extensions/Unisat.js +11 -0
  216. package/build/transaction/builders/GenericTransaction.d.ts +11 -0
  217. package/build/transaction/builders/GenericTransaction.js +23 -0
  218. package/build/transaction/builders/TapUnwarpTransaction.d.ts +37 -0
  219. package/build/transaction/builders/TapUnwarpTransaction.js +201 -0
  220. package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +34 -0
  221. package/build/transaction/builders/UnwarpSegwitTransaction.js +184 -0
  222. package/build/transaction/builders/UnwarpTransaction.d.ts +35 -0
  223. package/build/transaction/builders/UnwarpTransaction.js +199 -0
  224. package/build/transaction/interfaces/ITransactions.d.ts +32 -0
  225. package/build/transaction/interfaces/ITransactions.js +1 -0
  226. package/build/utxo/IUTXO.d.ts +0 -0
  227. package/build/utxo/IUTXO.js +1 -0
  228. package/build/utxo/OPNetUtils.d.ts +7 -0
  229. package/build/utxo/OPNetUtils.js +47 -0
  230. package/build/utxo/UTXOManager.d.ts +7 -0
  231. package/build/utxo/UTXOManager.js +47 -0
  232. package/build/wbtc/BroadcastResponse.d.ts +0 -0
  233. package/build/wbtc/BroadcastResponse.js +1 -0
  234. package/gulpfile.js +152 -152
  235. package/package.json +109 -109
  236. package/src/_version.ts +1 -1
  237. package/src/consensus/Consensus.ts +36 -36
  238. package/src/consensus/ConsensusConfig.ts +39 -39
  239. package/src/crypto/crypto-browser.js +75 -75
  240. package/src/generators/AddressGenerator.ts +24 -24
  241. package/src/generators/Features.ts +5 -5
  242. package/src/generators/Generator.ts +75 -75
  243. package/src/generators/builders/CalldataGenerator.ts +148 -148
  244. package/src/generators/builders/DeploymentGenerator.ts +66 -66
  245. package/src/index.ts +4 -4
  246. package/src/keypair/AddressVerificator.ts +40 -40
  247. package/src/keypair/EcKeyPair.ts +282 -282
  248. package/src/keypair/Wallet.ts +120 -97
  249. package/src/keypair/interfaces/IWallet.ts +19 -19
  250. package/src/metadata/ContractBaseMetadata.ts +23 -23
  251. package/src/metadata/contracts/wBTC.ts +60 -60
  252. package/src/metadata/tokens.ts +1 -1
  253. package/src/network/NetworkInformation.ts +7 -7
  254. package/src/transaction/TransactionFactory.ts +2 -0
  255. package/src/transaction/browser/BrowserSignerBase.ts +37 -37
  256. package/src/transaction/browser/Web3Provider.ts +46 -46
  257. package/src/transaction/browser/extensions/UnisatSigner.ts +218 -218
  258. package/src/transaction/browser/types/Unisat.ts +97 -97
  259. package/src/transaction/builders/FundingTransaction.ts +40 -40
  260. package/src/transaction/builders/InteractionTransaction.ts +38 -38
  261. package/src/transaction/builders/SharedInteractionTransaction.ts +368 -368
  262. package/src/transaction/builders/TransactionBuilder.ts +665 -665
  263. package/src/transaction/builders/UnwrapSegwitTransaction.ts +365 -365
  264. package/src/transaction/builders/UnwrapTransaction.ts +507 -507
  265. package/src/transaction/builders/WrapTransaction.ts +346 -346
  266. package/src/transaction/interfaces/ITransactionParameters.ts +59 -59
  267. package/src/transaction/interfaces/Tap.ts +26 -26
  268. package/src/transaction/psbt/PSBTTypes.ts +3 -3
  269. package/src/transaction/shared/TweakedTransaction.ts +539 -539
  270. package/src/utxo/OPNetLimitedProvider.ts +244 -244
  271. package/src/utxo/interfaces/BroadcastResponse.ts +10 -10
  272. package/src/utxo/interfaces/IUTXO.ts +29 -29
  273. package/src/verification/TapscriptVerificator.ts +89 -89
  274. package/src/wbtc/Generate.ts +40 -40
  275. package/src/wbtc/UnwrapGeneration.ts +13 -13
  276. package/src/wbtc/WrappedGenerationParameters.ts +33 -33
  277. package/webpack.config.js +78 -78
  278. /package/build/generators/builders/{MultiSignGenerator.d.ts → MultisignGenerator.d.ts} +0 -0
  279. /package/build/generators/builders/{MultiSignGenerator.js → MultisignGenerator.js} +0 -0
  280. /package/build/generators/{Features.d.ts → features.d.ts} +0 -0
  281. /package/build/generators/{Features.js → features.js} +0 -0
@@ -1,368 +1,368 @@
1
- import { PsbtInput } from 'bip174/src/lib/interfaces.js';
2
- import { address, Payment, Psbt, Signer } from 'bitcoinjs-lib';
3
- import { Taptree } from 'bitcoinjs-lib/src/types.js';
4
- import { ECPairInterface } from 'ecpair';
5
- import { TransactionBuilder } from './TransactionBuilder.js';
6
- import { TransactionType } from '../enums/TransactionType.js';
7
- import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
8
- import { SharedInteractionParameters } from '../interfaces/ITransactionParameters.js';
9
- import { Compressor } from '../../bytecode/Compressor.js';
10
- import { EcKeyPair } from '../../keypair/EcKeyPair.js';
11
- import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
12
- import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
13
-
14
- /**
15
- * Shared interaction transaction
16
- * @class SharedInteractionTransaction
17
- */
18
- export abstract class SharedInteractionTransaction<
19
- T extends TransactionType,
20
- > extends TransactionBuilder<T> {
21
- /**
22
- * Random salt for the interaction
23
- * @type {Buffer}
24
- */
25
- public readonly randomBytes: Buffer;
26
-
27
- protected targetScriptRedeem: Payment | null = null;
28
- protected leftOverFundsScriptRedeem: Payment | null = null;
29
-
30
- protected abstract readonly compiledTargetScript: Buffer;
31
- protected abstract readonly scriptTree: Taptree;
32
-
33
- protected calldataGenerator: CalldataGenerator;
34
-
35
- /**
36
- * Calldata for the interaction
37
- * @protected
38
- */
39
- protected readonly calldata: Buffer;
40
-
41
- /**
42
- * Contract secret for the interaction
43
- * @protected
44
- */
45
- protected abstract readonly contractSecret: Buffer;
46
-
47
- /**
48
- * Script signer for the interaction
49
- * @protected
50
- */
51
- protected readonly scriptSigner: Signer;
52
-
53
- /**
54
- * Disable auto refund
55
- * @protected
56
- */
57
- protected readonly disableAutoRefund: boolean;
58
-
59
- protected constructor(parameters: SharedInteractionParameters) {
60
- super(parameters);
61
-
62
- if (!parameters.calldata) {
63
- throw new Error('Calldata is required');
64
- }
65
-
66
- this.disableAutoRefund = parameters.disableAutoRefund || false;
67
-
68
- this.calldata = Compressor.compress(parameters.calldata);
69
-
70
- this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
71
- this.scriptSigner = this.generateKeyPairFromSeed();
72
-
73
- this.calldataGenerator = new CalldataGenerator(
74
- this.internalPubKeyToXOnly(),
75
- this.scriptSignerXOnlyPubKey(),
76
- this.network,
77
- );
78
- }
79
-
80
- /**
81
- * Get the contract secret
82
- * @returns {Buffer} The contract secret
83
- */
84
- public getContractSecret(): Buffer {
85
- return this.contractSecret;
86
- }
87
-
88
- /**
89
- * Get the random bytes used for the interaction
90
- * @returns {Buffer} The random bytes
91
- */
92
- public getRndBytes(): Buffer {
93
- return this.randomBytes;
94
- }
95
-
96
- /**
97
- * Generate the secret for the interaction
98
- * @protected
99
- * @returns {Buffer} The secret
100
- * @throws {Error} If the to address is invalid
101
- */
102
- protected generateSecret(): Buffer {
103
- if (!this.to) throw new Error('To address is required');
104
-
105
- return address.fromBech32(this.to).data;
106
- }
107
-
108
- /**
109
- * Get the internal pubkey as an x-only key
110
- * @protected
111
- * @returns {Buffer} The internal pubkey as an x-only key
112
- */
113
- protected scriptSignerXOnlyPubKey(): Buffer {
114
- return toXOnly(this.scriptSigner.publicKey);
115
- }
116
-
117
- /**
118
- * Generate a key pair from the seed
119
- * @protected
120
- *
121
- * @returns {ECPairInterface} The key pair
122
- */
123
- protected generateKeyPairFromSeed(): ECPairInterface {
124
- return EcKeyPair.fromSeedKeyPair(this.randomBytes, this.network);
125
- }
126
-
127
- /**
128
- * Build the transaction
129
- * @protected
130
- *
131
- * @throws {Error} If the left over funds script redeem is required
132
- * @throws {Error} If the left over funds script redeem version is required
133
- * @throws {Error} If the left over funds script redeem output is required
134
- * @throws {Error} If the to address is required
135
- */
136
- protected override async buildTransaction(): Promise<void> {
137
- if (!this.to) throw new Error('To address is required');
138
-
139
- const selectedRedeem = !!this.scriptSigner
140
- ? this.targetScriptRedeem
141
- : this.leftOverFundsScriptRedeem;
142
-
143
- if (!selectedRedeem) {
144
- throw new Error('Left over funds script redeem is required');
145
- }
146
-
147
- if (!selectedRedeem.redeemVersion) {
148
- throw new Error('Left over funds script redeem version is required');
149
- }
150
-
151
- if (!selectedRedeem.output) {
152
- throw new Error('Left over funds script redeem output is required');
153
- }
154
-
155
- this.tapLeafScript = {
156
- leafVersion: selectedRedeem.redeemVersion,
157
- script: selectedRedeem.output,
158
- controlBlock: this.getWitness(),
159
- };
160
-
161
- if (!this.regenerated) {
162
- this.addInputsFromUTXO();
163
- }
164
-
165
- const amountSpent: bigint = this.getTransactionOPNetFee();
166
- this.addOutput({
167
- value: Number(amountSpent),
168
- address: this.to,
169
- });
170
-
171
- if (!this.disableAutoRefund) {
172
- await this.addRefundOutput(amountSpent);
173
- }
174
- }
175
-
176
- /**
177
- * Sign the inputs
178
- * @param {Psbt} transaction The transaction to sign
179
- * @protected
180
- */
181
- protected override async signInputs(transaction: Psbt): Promise<void> {
182
- if (!this.scriptSigner) {
183
- await super.signInputs(transaction);
184
-
185
- return;
186
- }
187
-
188
- for (let i = 0; i < transaction.data.inputs.length; i++) {
189
- let input: PsbtInput = transaction.data.inputs[i];
190
- let finalized: boolean = false;
191
- let signed: boolean = false;
192
-
193
- try {
194
- await this.signInput(transaction, input, i, this.scriptSigner);
195
- signed = true;
196
- } catch (e) {}
197
-
198
- try {
199
- await this.signInput(transaction, input, i);
200
- signed = true;
201
- } catch (e) {}
202
-
203
- try {
204
- transaction.finalizeInput(0, this.customFinalizer);
205
- finalized = true;
206
- } catch (e) {}
207
-
208
- try {
209
- transaction.finalizeInput(i);
210
- finalized = true;
211
- } catch (e) {}
212
-
213
- if (signed || finalized) {
214
- this.log(
215
- `Signed input or finalized input #${i} out of ${transaction.data.inputs.length}! {Signed: ${signed}, Finalized: ${finalized}}`,
216
- );
217
-
218
- continue;
219
- }
220
-
221
- if (this.regenerated || this.ignoreSignatureErrors) {
222
- continue;
223
- }
224
-
225
- throw new Error('Failed to sign input');
226
- }
227
- }
228
-
229
- protected override generateScriptAddress(): Payment {
230
- return {
231
- internalPubkey: this.internalPubKeyToXOnly(),
232
- network: this.network,
233
- scriptTree: this.scriptTree,
234
- };
235
- }
236
-
237
- protected override generateTapData(): Payment {
238
- const selectedRedeem = !!this.scriptSigner
239
- ? this.targetScriptRedeem
240
- : this.leftOverFundsScriptRedeem;
241
-
242
- if (!selectedRedeem) {
243
- throw new Error('Left over funds script redeem is required');
244
- }
245
-
246
- if (!this.scriptTree) {
247
- throw new Error('Script tree is required');
248
- }
249
-
250
- return {
251
- internalPubkey: this.internalPubKeyToXOnly(),
252
- network: this.network,
253
- scriptTree: this.scriptTree,
254
- redeem: selectedRedeem,
255
- };
256
- }
257
-
258
- /**
259
- * Generate the script solution
260
- * @param {PsbtInput} input The input
261
- * @protected
262
- *
263
- * @returns {Buffer[]} The script solution
264
- */
265
- protected getScriptSolution(input: PsbtInput): Buffer[] {
266
- if (!input.tapScriptSig) {
267
- throw new Error('Tap script signature is required');
268
- }
269
-
270
- return [
271
- this.contractSecret,
272
- this.internalPubKeyToXOnly(),
273
- input.tapScriptSig[0].signature,
274
- input.tapScriptSig[1].signature,
275
- ];
276
- }
277
-
278
- /**
279
- * Get the script tree
280
- * @private
281
- *
282
- * @returns {Taptree} The script tree
283
- */
284
- protected getScriptTree(): Taptree {
285
- if (!this.calldata) {
286
- throw new Error('Calldata is required');
287
- }
288
-
289
- this.generateRedeemScripts();
290
-
291
- return [
292
- {
293
- output: this.compiledTargetScript,
294
- version: 192,
295
- },
296
- {
297
- output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
298
- version: 192,
299
- },
300
- ];
301
- }
302
-
303
- /**
304
- * Transaction finalizer
305
- * @param {number} _inputIndex The input index
306
- * @param {PsbtInput} input The input
307
- */
308
- protected customFinalizer = (_inputIndex: number, input: PsbtInput) => {
309
- if (!this.tapLeafScript) {
310
- throw new Error('Tap leaf script is required');
311
- }
312
-
313
- if (!input.tapScriptSig) {
314
- throw new Error('Tap script signature is required');
315
- }
316
-
317
- if (!this.contractSecret) {
318
- throw new Error('Contract secret is required');
319
- }
320
-
321
- const scriptSolution = this.getScriptSolution(input);
322
- const witness = scriptSolution
323
- .concat(this.tapLeafScript.script)
324
- .concat(this.tapLeafScript.controlBlock);
325
-
326
- return {
327
- finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
328
- };
329
- };
330
-
331
- /**
332
- * Get the public keys
333
- * @private
334
- *
335
- * @returns {Buffer[]} The public keys
336
- */
337
- private getPubKeys(): Buffer[] {
338
- const pubkeys = [this.signer.publicKey];
339
-
340
- if (this.scriptSigner) {
341
- pubkeys.push(this.scriptSigner.publicKey);
342
- }
343
-
344
- return pubkeys;
345
- }
346
-
347
- /**
348
- * Generate the redeem scripts
349
- * @private
350
- *
351
- * @throws {Error} If the public keys are required
352
- * @throws {Error} If the leaf script is required
353
- * @throws {Error} If the leaf script version is required
354
- * @throws {Error} If the leaf script output is required
355
- * @throws {Error} If the target script redeem is required
356
- */
357
- private generateRedeemScripts(): void {
358
- this.targetScriptRedeem = {
359
- output: this.compiledTargetScript,
360
- redeemVersion: 192,
361
- };
362
-
363
- this.leftOverFundsScriptRedeem = {
364
- output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
365
- redeemVersion: 192,
366
- };
367
- }
368
- }
1
+ import { PsbtInput } from 'bip174/src/lib/interfaces.js';
2
+ import { address, Payment, Psbt, Signer } from 'bitcoinjs-lib';
3
+ import { Taptree } from 'bitcoinjs-lib/src/types.js';
4
+ import { ECPairInterface } from 'ecpair';
5
+ import { TransactionBuilder } from './TransactionBuilder.js';
6
+ import { TransactionType } from '../enums/TransactionType.js';
7
+ import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
8
+ import { SharedInteractionParameters } from '../interfaces/ITransactionParameters.js';
9
+ import { Compressor } from '../../bytecode/Compressor.js';
10
+ import { EcKeyPair } from '../../keypair/EcKeyPair.js';
11
+ import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
12
+ import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
13
+
14
+ /**
15
+ * Shared interaction transaction
16
+ * @class SharedInteractionTransaction
17
+ */
18
+ export abstract class SharedInteractionTransaction<
19
+ T extends TransactionType,
20
+ > extends TransactionBuilder<T> {
21
+ /**
22
+ * Random salt for the interaction
23
+ * @type {Buffer}
24
+ */
25
+ public readonly randomBytes: Buffer;
26
+
27
+ protected targetScriptRedeem: Payment | null = null;
28
+ protected leftOverFundsScriptRedeem: Payment | null = null;
29
+
30
+ protected abstract readonly compiledTargetScript: Buffer;
31
+ protected abstract readonly scriptTree: Taptree;
32
+
33
+ protected calldataGenerator: CalldataGenerator;
34
+
35
+ /**
36
+ * Calldata for the interaction
37
+ * @protected
38
+ */
39
+ protected readonly calldata: Buffer;
40
+
41
+ /**
42
+ * Contract secret for the interaction
43
+ * @protected
44
+ */
45
+ protected abstract readonly contractSecret: Buffer;
46
+
47
+ /**
48
+ * Script signer for the interaction
49
+ * @protected
50
+ */
51
+ protected readonly scriptSigner: Signer;
52
+
53
+ /**
54
+ * Disable auto refund
55
+ * @protected
56
+ */
57
+ protected readonly disableAutoRefund: boolean;
58
+
59
+ protected constructor(parameters: SharedInteractionParameters) {
60
+ super(parameters);
61
+
62
+ if (!parameters.calldata) {
63
+ throw new Error('Calldata is required');
64
+ }
65
+
66
+ this.disableAutoRefund = parameters.disableAutoRefund || false;
67
+
68
+ this.calldata = Compressor.compress(parameters.calldata);
69
+
70
+ this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
71
+ this.scriptSigner = this.generateKeyPairFromSeed();
72
+
73
+ this.calldataGenerator = new CalldataGenerator(
74
+ this.internalPubKeyToXOnly(),
75
+ this.scriptSignerXOnlyPubKey(),
76
+ this.network,
77
+ );
78
+ }
79
+
80
+ /**
81
+ * Get the contract secret
82
+ * @returns {Buffer} The contract secret
83
+ */
84
+ public getContractSecret(): Buffer {
85
+ return this.contractSecret;
86
+ }
87
+
88
+ /**
89
+ * Get the random bytes used for the interaction
90
+ * @returns {Buffer} The random bytes
91
+ */
92
+ public getRndBytes(): Buffer {
93
+ return this.randomBytes;
94
+ }
95
+
96
+ /**
97
+ * Generate the secret for the interaction
98
+ * @protected
99
+ * @returns {Buffer} The secret
100
+ * @throws {Error} If the to address is invalid
101
+ */
102
+ protected generateSecret(): Buffer {
103
+ if (!this.to) throw new Error('To address is required');
104
+
105
+ return address.fromBech32(this.to).data;
106
+ }
107
+
108
+ /**
109
+ * Get the internal pubkey as an x-only key
110
+ * @protected
111
+ * @returns {Buffer} The internal pubkey as an x-only key
112
+ */
113
+ protected scriptSignerXOnlyPubKey(): Buffer {
114
+ return toXOnly(this.scriptSigner.publicKey);
115
+ }
116
+
117
+ /**
118
+ * Generate a key pair from the seed
119
+ * @protected
120
+ *
121
+ * @returns {ECPairInterface} The key pair
122
+ */
123
+ protected generateKeyPairFromSeed(): ECPairInterface {
124
+ return EcKeyPair.fromSeedKeyPair(this.randomBytes, this.network);
125
+ }
126
+
127
+ /**
128
+ * Build the transaction
129
+ * @protected
130
+ *
131
+ * @throws {Error} If the left over funds script redeem is required
132
+ * @throws {Error} If the left over funds script redeem version is required
133
+ * @throws {Error} If the left over funds script redeem output is required
134
+ * @throws {Error} If the to address is required
135
+ */
136
+ protected override async buildTransaction(): Promise<void> {
137
+ if (!this.to) throw new Error('To address is required');
138
+
139
+ const selectedRedeem = !!this.scriptSigner
140
+ ? this.targetScriptRedeem
141
+ : this.leftOverFundsScriptRedeem;
142
+
143
+ if (!selectedRedeem) {
144
+ throw new Error('Left over funds script redeem is required');
145
+ }
146
+
147
+ if (!selectedRedeem.redeemVersion) {
148
+ throw new Error('Left over funds script redeem version is required');
149
+ }
150
+
151
+ if (!selectedRedeem.output) {
152
+ throw new Error('Left over funds script redeem output is required');
153
+ }
154
+
155
+ this.tapLeafScript = {
156
+ leafVersion: selectedRedeem.redeemVersion,
157
+ script: selectedRedeem.output,
158
+ controlBlock: this.getWitness(),
159
+ };
160
+
161
+ if (!this.regenerated) {
162
+ this.addInputsFromUTXO();
163
+ }
164
+
165
+ const amountSpent: bigint = this.getTransactionOPNetFee();
166
+ this.addOutput({
167
+ value: Number(amountSpent),
168
+ address: this.to,
169
+ });
170
+
171
+ if (!this.disableAutoRefund) {
172
+ await this.addRefundOutput(amountSpent);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Sign the inputs
178
+ * @param {Psbt} transaction The transaction to sign
179
+ * @protected
180
+ */
181
+ protected override async signInputs(transaction: Psbt): Promise<void> {
182
+ if (!this.scriptSigner) {
183
+ await super.signInputs(transaction);
184
+
185
+ return;
186
+ }
187
+
188
+ for (let i = 0; i < transaction.data.inputs.length; i++) {
189
+ let input: PsbtInput = transaction.data.inputs[i];
190
+ let finalized: boolean = false;
191
+ let signed: boolean = false;
192
+
193
+ try {
194
+ await this.signInput(transaction, input, i, this.scriptSigner);
195
+ signed = true;
196
+ } catch (e) {}
197
+
198
+ try {
199
+ await this.signInput(transaction, input, i);
200
+ signed = true;
201
+ } catch (e) {}
202
+
203
+ try {
204
+ transaction.finalizeInput(0, this.customFinalizer);
205
+ finalized = true;
206
+ } catch (e) {}
207
+
208
+ try {
209
+ transaction.finalizeInput(i);
210
+ finalized = true;
211
+ } catch (e) {}
212
+
213
+ if (signed || finalized) {
214
+ this.log(
215
+ `Signed input or finalized input #${i} out of ${transaction.data.inputs.length}! {Signed: ${signed}, Finalized: ${finalized}}`,
216
+ );
217
+
218
+ continue;
219
+ }
220
+
221
+ if (this.regenerated || this.ignoreSignatureErrors) {
222
+ continue;
223
+ }
224
+
225
+ throw new Error('Failed to sign input');
226
+ }
227
+ }
228
+
229
+ protected override generateScriptAddress(): Payment {
230
+ return {
231
+ internalPubkey: this.internalPubKeyToXOnly(),
232
+ network: this.network,
233
+ scriptTree: this.scriptTree,
234
+ };
235
+ }
236
+
237
+ protected override generateTapData(): Payment {
238
+ const selectedRedeem = !!this.scriptSigner
239
+ ? this.targetScriptRedeem
240
+ : this.leftOverFundsScriptRedeem;
241
+
242
+ if (!selectedRedeem) {
243
+ throw new Error('Left over funds script redeem is required');
244
+ }
245
+
246
+ if (!this.scriptTree) {
247
+ throw new Error('Script tree is required');
248
+ }
249
+
250
+ return {
251
+ internalPubkey: this.internalPubKeyToXOnly(),
252
+ network: this.network,
253
+ scriptTree: this.scriptTree,
254
+ redeem: selectedRedeem,
255
+ };
256
+ }
257
+
258
+ /**
259
+ * Generate the script solution
260
+ * @param {PsbtInput} input The input
261
+ * @protected
262
+ *
263
+ * @returns {Buffer[]} The script solution
264
+ */
265
+ protected getScriptSolution(input: PsbtInput): Buffer[] {
266
+ if (!input.tapScriptSig) {
267
+ throw new Error('Tap script signature is required');
268
+ }
269
+
270
+ return [
271
+ this.contractSecret,
272
+ this.internalPubKeyToXOnly(),
273
+ input.tapScriptSig[0].signature,
274
+ input.tapScriptSig[1].signature,
275
+ ];
276
+ }
277
+
278
+ /**
279
+ * Get the script tree
280
+ * @private
281
+ *
282
+ * @returns {Taptree} The script tree
283
+ */
284
+ protected getScriptTree(): Taptree {
285
+ if (!this.calldata) {
286
+ throw new Error('Calldata is required');
287
+ }
288
+
289
+ this.generateRedeemScripts();
290
+
291
+ return [
292
+ {
293
+ output: this.compiledTargetScript,
294
+ version: 192,
295
+ },
296
+ {
297
+ output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
298
+ version: 192,
299
+ },
300
+ ];
301
+ }
302
+
303
+ /**
304
+ * Transaction finalizer
305
+ * @param {number} _inputIndex The input index
306
+ * @param {PsbtInput} input The input
307
+ */
308
+ protected customFinalizer = (_inputIndex: number, input: PsbtInput) => {
309
+ if (!this.tapLeafScript) {
310
+ throw new Error('Tap leaf script is required');
311
+ }
312
+
313
+ if (!input.tapScriptSig) {
314
+ throw new Error('Tap script signature is required');
315
+ }
316
+
317
+ if (!this.contractSecret) {
318
+ throw new Error('Contract secret is required');
319
+ }
320
+
321
+ const scriptSolution = this.getScriptSolution(input);
322
+ const witness = scriptSolution
323
+ .concat(this.tapLeafScript.script)
324
+ .concat(this.tapLeafScript.controlBlock);
325
+
326
+ return {
327
+ finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
328
+ };
329
+ };
330
+
331
+ /**
332
+ * Get the public keys
333
+ * @private
334
+ *
335
+ * @returns {Buffer[]} The public keys
336
+ */
337
+ private getPubKeys(): Buffer[] {
338
+ const pubkeys = [this.signer.publicKey];
339
+
340
+ if (this.scriptSigner) {
341
+ pubkeys.push(this.scriptSigner.publicKey);
342
+ }
343
+
344
+ return pubkeys;
345
+ }
346
+
347
+ /**
348
+ * Generate the redeem scripts
349
+ * @private
350
+ *
351
+ * @throws {Error} If the public keys are required
352
+ * @throws {Error} If the leaf script is required
353
+ * @throws {Error} If the leaf script version is required
354
+ * @throws {Error} If the leaf script output is required
355
+ * @throws {Error} If the target script redeem is required
356
+ */
357
+ private generateRedeemScripts(): void {
358
+ this.targetScriptRedeem = {
359
+ output: this.compiledTargetScript,
360
+ redeemVersion: 192,
361
+ };
362
+
363
+ this.leftOverFundsScriptRedeem = {
364
+ output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
365
+ redeemVersion: 192,
366
+ };
367
+ }
368
+ }