@btc-vision/transaction 1.0.97 → 1.0.100

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 (373) hide show
  1. package/.babelrc +4 -7
  2. package/.prettierrc.json +11 -11
  3. package/CONTRIBUTING.md +71 -71
  4. package/LICENSE.md +62 -62
  5. package/README.md +76 -76
  6. package/browser/_version.d.ts +1 -1
  7. package/browser/bytecode/Compressor.d.ts +0 -1
  8. package/browser/crypto/crypto-browser.d.ts +1 -30
  9. package/browser/crypto/crypto.d.ts +0 -1
  10. package/browser/generators/AddressGenerator.d.ts +0 -1
  11. package/browser/generators/Generator.d.ts +2 -3
  12. package/browser/generators/builders/CalldataGenerator.d.ts +0 -1
  13. package/browser/generators/builders/CustomGenerator.d.ts +6 -0
  14. package/browser/generators/builders/DeploymentGenerator.d.ts +0 -1
  15. package/browser/generators/builders/MultiSignGenerator.d.ts +0 -1
  16. package/browser/index.js +1 -1
  17. package/browser/keypair/EcKeyPair.d.ts +0 -1
  18. package/browser/keypair/Wallet.d.ts +0 -1
  19. package/browser/opnet.d.ts +5 -3
  20. package/browser/signer/TweakedSigner.d.ts +0 -1
  21. package/browser/transaction/TransactionFactory.d.ts +2 -0
  22. package/browser/transaction/browser/BrowserSignerBase.d.ts +0 -1
  23. package/browser/transaction/browser/extensions/UnisatSigner.d.ts +0 -1
  24. package/{build/transaction/builders/DeploymentTransactionV2.d.ts → browser/transaction/builders/CustomScriptTransaction.d.ts} +16 -12
  25. package/browser/transaction/builders/DeploymentTransaction.d.ts +0 -1
  26. package/browser/transaction/builders/InteractionTransaction.d.ts +0 -1
  27. package/browser/transaction/builders/MultiSignTransaction.d.ts +0 -1
  28. package/browser/transaction/builders/SharedInteractionTransaction.d.ts +0 -1
  29. package/browser/transaction/builders/TransactionBuilder.d.ts +0 -1
  30. package/browser/transaction/builders/UnwrapSegwitTransaction.d.ts +0 -1
  31. package/browser/transaction/builders/UnwrapTransaction.d.ts +0 -1
  32. package/browser/transaction/builders/WrapTransaction.d.ts +0 -1
  33. package/browser/transaction/enums/TransactionType.d.ts +2 -1
  34. package/browser/transaction/interfaces/ITransactionParameters.d.ts +0 -1
  35. package/browser/transaction/interfaces/Tap.d.ts +0 -1
  36. package/browser/transaction/shared/P2TR_MS.d.ts +0 -1
  37. package/browser/transaction/shared/TweakedTransaction.d.ts +0 -1
  38. package/browser/utils/BitcoinUtils.d.ts +0 -1
  39. package/browser/verification/TapscriptVerificator.d.ts +0 -1
  40. package/browser/wbtc/WrappedGenerationParameters.d.ts +0 -1
  41. package/build/_version.d.ts +1 -1
  42. package/build/_version.js +1 -1
  43. package/build/bytecode/Compressor.d.ts +0 -1
  44. package/build/bytecode/Compressor.js +4 -4
  45. package/build/crypto/crypto.d.ts +0 -1
  46. package/build/generators/AddressGenerator.d.ts +0 -1
  47. package/build/generators/Generator.d.ts +2 -3
  48. package/build/generators/Generator.js +3 -5
  49. package/build/generators/builders/CalldataGenerator.d.ts +0 -1
  50. package/build/generators/builders/CalldataGenerator.js +2 -0
  51. package/build/generators/builders/CustomGenerator.d.ts +6 -0
  52. package/build/generators/builders/CustomGenerator.js +16 -0
  53. package/build/generators/builders/DeploymentGenerator.d.ts +0 -1
  54. package/build/generators/builders/DeploymentGenerator.js +2 -0
  55. package/build/generators/builders/{MultisignGenerator.d.ts → MultiSignGenerator.d.ts} +0 -1
  56. package/build/generators/builders/{MultisignGenerator.js → MultiSignGenerator.js} +1 -1
  57. package/build/keypair/EcKeyPair.d.ts +0 -1
  58. package/build/keypair/EcKeyPair.js +2 -2
  59. package/build/keypair/Wallet.d.ts +0 -1
  60. package/build/keypair/Wallet.js +0 -5
  61. package/build/metadata/ContractBaseMetadata.js +0 -1
  62. package/build/metadata/contracts/wBTC.js +3 -5
  63. package/build/metadata/tokens.js +32 -30
  64. package/build/opnet.d.ts +5 -3
  65. package/build/opnet.js +5 -3
  66. package/build/signer/TweakedSigner.d.ts +0 -1
  67. package/build/transaction/TransactionFactory.d.ts +2 -0
  68. package/build/transaction/TransactionFactory.js +42 -3
  69. package/build/transaction/browser/BrowserSignerBase.d.ts +0 -1
  70. package/build/transaction/browser/extensions/UnisatSigner.d.ts +0 -1
  71. package/build/transaction/browser/extensions/UnisatSigner.js +1 -6
  72. package/build/transaction/builders/CustomScriptTransaction.d.ts +40 -0
  73. package/build/transaction/builders/{DeploymentTransactionV2.js → CustomScriptTransaction.js} +40 -67
  74. package/build/transaction/builders/DeploymentTransaction.d.ts +0 -1
  75. package/build/transaction/builders/DeploymentTransaction.js +25 -33
  76. package/build/transaction/builders/FundingTransaction.js +1 -3
  77. package/build/transaction/builders/InteractionTransaction.d.ts +0 -1
  78. package/build/transaction/builders/InteractionTransaction.js +2 -5
  79. package/build/transaction/builders/MultiSignTransaction.d.ts +0 -1
  80. package/build/transaction/builders/MultiSignTransaction.js +66 -73
  81. package/build/transaction/builders/SharedInteractionTransaction.d.ts +0 -1
  82. package/build/transaction/builders/SharedInteractionTransaction.js +20 -25
  83. package/build/transaction/builders/TransactionBuilder.d.ts +0 -1
  84. package/build/transaction/builders/TransactionBuilder.js +12 -21
  85. package/build/transaction/builders/UnwrapSegwitTransaction.d.ts +0 -1
  86. package/build/transaction/builders/UnwrapSegwitTransaction.js +4 -10
  87. package/build/transaction/builders/UnwrapTransaction.d.ts +0 -1
  88. package/build/transaction/builders/UnwrapTransaction.js +5 -11
  89. package/build/transaction/builders/WrapTransaction.d.ts +0 -1
  90. package/build/transaction/builders/WrapTransaction.js +5 -12
  91. package/build/transaction/enums/TransactionType.d.ts +2 -1
  92. package/build/transaction/enums/TransactionType.js +1 -0
  93. package/build/transaction/interfaces/ITransactionParameters.d.ts +0 -1
  94. package/build/transaction/interfaces/Tap.d.ts +0 -1
  95. package/build/transaction/processor/PsbtTransaction.js +3 -4
  96. package/build/transaction/shared/P2TR_MS.d.ts +0 -1
  97. package/build/transaction/shared/TweakedTransaction.d.ts +0 -1
  98. package/build/transaction/shared/TweakedTransaction.js +11 -16
  99. package/build/utils/BitcoinUtils.d.ts +0 -1
  100. package/build/utxo/OPNetLimitedProvider.js +2 -3
  101. package/build/verification/TapscriptVerificator.d.ts +0 -1
  102. package/build/verification/TapscriptVerificator.js +1 -1
  103. package/build/wbtc/UnwrapGeneration.js +0 -2
  104. package/build/wbtc/WrappedGenerationParameters.d.ts +0 -1
  105. package/build/wbtc/WrappedGenerationParameters.js +0 -6
  106. package/cjs/package.json +3 -0
  107. package/gulpfile.js +49 -133
  108. package/package.json +112 -113
  109. package/src/_version.ts +1 -1
  110. package/src/bytecode/Compressor.ts +27 -27
  111. package/src/consensus/metadata/RoswellConsensus.ts +26 -26
  112. package/src/crypto/crypto.ts +1 -1
  113. package/src/generators/Generator.ts +75 -75
  114. package/src/generators/builders/CalldataGenerator.ts +2 -0
  115. package/src/generators/builders/CustomGenerator.ts +30 -0
  116. package/src/generators/builders/DeploymentGenerator.ts +2 -0
  117. package/src/generators/builders/MultiSignGenerator.ts +73 -73
  118. package/src/metadata/contracts/wBTC.ts +60 -60
  119. package/src/metadata/tokens.ts +135 -135
  120. package/src/network/ChainId.ts +6 -6
  121. package/src/opnet.ts +82 -82
  122. package/src/signer/TweakedSigner.ts +56 -56
  123. package/src/transaction/TransactionFactory.ts +72 -14
  124. package/src/transaction/builders/CustomScriptTransaction.ts +337 -0
  125. package/src/transaction/builders/DeploymentTransaction.ts +356 -356
  126. package/src/transaction/builders/MultiSignTransaction.ts +659 -659
  127. package/src/transaction/builders/UnwrapSegwitTransaction.ts +365 -365
  128. package/src/transaction/builders/UnwrapTransaction.ts +507 -507
  129. package/src/transaction/enums/TransactionType.ts +10 -9
  130. package/src/transaction/processor/PsbtTransaction.ts +173 -173
  131. package/src/transaction/shared/P2TR_MS.ts +42 -42
  132. package/src/transaction/shared/TweakedTransaction.ts +539 -539
  133. package/src/utils/BitcoinUtils.ts +96 -96
  134. package/tsconfig.base.json +27 -43
  135. package/tsconfig.json +15 -8
  136. package/tsconfig.webpack.json +22 -22
  137. package/EPOCH.md +0 -250
  138. package/VAULT_TARGET_CONSOLIDATION.md +0 -111
  139. package/browser/network/NetworkInformation.d.ts +0 -6
  140. package/browser/transaction/browser/BrowserSigner.d.ts +0 -9
  141. package/browser/transaction/builders/TapUnwarpTransaction.d.ts +0 -40
  142. package/browser/transaction/builders/UnwarpTransaction.d.ts +0 -34
  143. package/browser/utxo/UTXOManager.d.ts +0 -7
  144. package/build/Utils.d.ts +0 -0
  145. package/build/Utils.js +0 -1
  146. package/build/consensus/metadata/RoswsellConsensus.d.ts +0 -2
  147. package/build/consensus/metadata/RoswsellConsensus.js +0 -4
  148. package/build/contracts/ContractMetadataManager.d.ts +0 -0
  149. package/build/contracts/ContractMetadataManager.js +0 -1
  150. package/build/generators/OPNetAddressGenerator.d.ts +0 -0
  151. package/build/generators/OPNetAddressGenerator.js +0 -1
  152. package/build/generators/builders/DeploymentGeneratorV2.d.ts +0 -13
  153. package/build/generators/builders/DeploymentGeneratorV2.js +0 -57
  154. package/build/generators/builders/UnwrapGenerator.d.ts +0 -8
  155. package/build/generators/builders/UnwrapGenerator.js +0 -79
  156. package/build/keypair/interfaces/GeneratedWallet.d.ts +0 -5
  157. package/build/keypair/interfaces/GeneratedWallet.js +0 -1
  158. package/build/metadata/CommonContracts.d.ts +0 -6
  159. package/build/metadata/CommonContracts.js +0 -5
  160. package/build/metadata/ContractMetadataManager.d.ts +0 -1
  161. package/build/metadata/ContractMetadataManager.js +0 -9
  162. package/build/metadata/contracts/ContractBase.d.ts +0 -9
  163. package/build/metadata/contracts/ContractBase.js +0 -13
  164. package/build/metadata/contracts/ContractBaseMetadata.d.ts +0 -9
  165. package/build/metadata/contracts/ContractBaseMetadata.js +0 -13
  166. package/build/metadata/contracts/ContractMetadataManager.d.ts +0 -0
  167. package/build/metadata/contracts/ContractMetadataManager.js +0 -1
  168. package/build/network/NetworkConverter.d.ts +0 -0
  169. package/build/network/NetworkConverter.js +0 -14
  170. package/build/network/NetworkInformation.d.ts +0 -6
  171. package/build/network/NetworkInformation.js +0 -1
  172. package/build/scripts/Regtest.d.ts +0 -2
  173. package/build/scripts/Regtest.js +0 -15
  174. package/build/scripts/test.d.ts +0 -1
  175. package/build/scripts/test.js +0 -74
  176. package/build/signer/Regtest.d.ts +0 -2
  177. package/build/signer/Regtest.js +0 -15
  178. package/build/tests/Regtest.d.ts +0 -3
  179. package/build/tests/Regtest.js +0 -29
  180. package/build/tests/adaptPSBT.d.ts +0 -1
  181. package/build/tests/adaptPSBT.js +0 -44
  182. package/build/tests/btc/send.d.ts +0 -1
  183. package/build/tests/btc/send.js +0 -35
  184. package/build/tests/btc/transfer.d.ts +0 -1
  185. package/build/tests/btc/transfer.js +0 -35
  186. package/build/tests/createPairReg.d.ts +0 -1
  187. package/build/tests/createPairReg.js +0 -73
  188. package/build/tests/deploy/deployMoto.d.ts +0 -4
  189. package/build/tests/deploy/deployMoto.js +0 -89
  190. package/build/tests/deploy/deployPool.d.ts +0 -1
  191. package/build/tests/deploy/deployPool.js +0 -5
  192. package/build/tests/deploy/deployStep1.d.ts +0 -1
  193. package/build/tests/deploy/deployStep1.js +0 -5
  194. package/build/tests/deploy/deployStep2.d.ts +0 -1
  195. package/build/tests/deploy/deployStep2.js +0 -5
  196. package/build/tests/deploy/deployStep3.d.ts +0 -1
  197. package/build/tests/deploy/deployStep3.js +0 -5
  198. package/build/tests/deploy.d.ts +0 -1
  199. package/build/tests/deploy.js +0 -41
  200. package/build/tests/deployMotoRegStep1.d.ts +0 -1
  201. package/build/tests/deployMotoRegStep1.js +0 -85
  202. package/build/tests/deployReg.d.ts +0 -1
  203. package/build/tests/deployReg.js +0 -85
  204. package/build/tests/factory/createPairReg.d.ts +0 -1
  205. package/build/tests/factory/createPairReg.js +0 -13
  206. package/build/tests/gen.d.ts +0 -1
  207. package/build/tests/gen.js +0 -19
  208. package/build/tests/interaction.d.ts +0 -5
  209. package/build/tests/interaction.js +0 -62
  210. package/build/tests/massWrapReg.d.ts +0 -1
  211. package/build/tests/massWrapReg.js +0 -105
  212. package/build/tests/mineReg.d.ts +0 -1
  213. package/build/tests/mineReg.js +0 -19
  214. package/build/tests/moto/airdropToken.d.ts +0 -1
  215. package/build/tests/moto/airdropToken.js +0 -21
  216. package/build/tests/moto/airdropTokens.d.ts +0 -1
  217. package/build/tests/moto/airdropTokens.js +0 -60
  218. package/build/tests/moto/allowance.d.ts +0 -1
  219. package/build/tests/moto/allowance.js +0 -6
  220. package/build/tests/moto/approve.d.ts +0 -1
  221. package/build/tests/moto/approve.js +0 -10
  222. package/build/tests/moto/approveWBTC.d.ts +0 -1
  223. package/build/tests/moto/approveWBTC.js +0 -12
  224. package/build/tests/moto/balanceOf.d.ts +0 -1
  225. package/build/tests/moto/balanceOf.js +0 -12
  226. package/build/tests/moto/transfer.d.ts +0 -1
  227. package/build/tests/moto/transfer.js +0 -16
  228. package/build/tests/motoswap/airdropToken.d.ts +0 -11
  229. package/build/tests/motoswap/airdropToken.js +0 -36
  230. package/build/tests/motoswap/deployMoto.d.ts +0 -4
  231. package/build/tests/motoswap/deployMoto.js +0 -89
  232. package/build/tests/motoswap/deployMotoRegStep1.d.ts +0 -1
  233. package/build/tests/motoswap/deployMotoRegStep1.js +0 -91
  234. package/build/tests/motoswap/deployMotoRegStep2.d.ts +0 -1
  235. package/build/tests/motoswap/deployMotoRegStep2.js +0 -91
  236. package/build/tests/motoswap/deployPool.d.ts +0 -1
  237. package/build/tests/motoswap/deployPool.js +0 -5
  238. package/build/tests/motoswap/deployStep1.d.ts +0 -1
  239. package/build/tests/motoswap/deployStep1.js +0 -5
  240. package/build/tests/motoswap/deployStep2.d.ts +0 -1
  241. package/build/tests/motoswap/deployStep2.js +0 -5
  242. package/build/tests/motoswap/deployStep3.d.ts +0 -1
  243. package/build/tests/motoswap/deployStep3.js +0 -5
  244. package/build/tests/motoswap/interaction.d.ts +0 -3
  245. package/build/tests/motoswap/interaction.js +0 -63
  246. package/build/tests/motoswap/routerAddLiquidity.d.ts +0 -11
  247. package/build/tests/motoswap/routerAddLiquidity.js +0 -35
  248. package/build/tests/motoswap-router/addLiquidity.d.ts +0 -11
  249. package/build/tests/motoswap-router/addLiquidity.js +0 -36
  250. package/build/tests/motoswap-router/deployMoto.d.ts +0 -4
  251. package/build/tests/motoswap-router/deployMoto.js +0 -89
  252. package/build/tests/motoswap-router/deployPool.d.ts +0 -1
  253. package/build/tests/motoswap-router/deployPool.js +0 -5
  254. package/build/tests/motoswap-router/deployStep1.d.ts +0 -1
  255. package/build/tests/motoswap-router/deployStep1.js +0 -5
  256. package/build/tests/motoswap-router/deployStep2.d.ts +0 -1
  257. package/build/tests/motoswap-router/deployStep2.js +0 -5
  258. package/build/tests/motoswap-router/deployStep3.d.ts +0 -1
  259. package/build/tests/motoswap-router/deployStep3.js +0 -5
  260. package/build/tests/motoswap-router/getAmountsOut.d.ts +0 -5
  261. package/build/tests/motoswap-router/getAmountsOut.js +0 -34
  262. package/build/tests/motoswap-router/routerAddLiquidity.d.ts +0 -11
  263. package/build/tests/motoswap-router/routerAddLiquidity.js +0 -35
  264. package/build/tests/motoswap-router/swap.d.ts +0 -8
  265. package/build/tests/motoswap-router/swap.js +0 -24
  266. package/build/tests/multisign.d.ts +0 -1
  267. package/build/tests/multisign.js +0 -47
  268. package/build/tests/multisign2.d.ts +0 -1
  269. package/build/tests/multisign2.js +0 -27
  270. package/build/tests/pool/DecodePoolAddress.d.ts +0 -6
  271. package/build/tests/pool/DecodePoolAddress.js +0 -12
  272. package/build/tests/pool/decodeReserves.d.ts +0 -5
  273. package/build/tests/pool/decodeReserves.js +0 -13
  274. package/build/tests/pool/reserves.d.ts +0 -1
  275. package/build/tests/pool/reserves.js +0 -18
  276. package/build/tests/shared/Utils.d.ts +0 -2
  277. package/build/tests/shared/Utils.js +0 -14
  278. package/build/tests/shared/interaction.d.ts +0 -7
  279. package/build/tests/shared/interaction.js +0 -85
  280. package/build/tests/shared/tokens.d.ts +0 -6
  281. package/build/tests/shared/tokens.js +0 -5
  282. package/build/tests/stakeReg.d.ts +0 -1
  283. package/build/tests/stakeReg.js +0 -73
  284. package/build/tests/stakedReg.d.ts +0 -1
  285. package/build/tests/stakedReg.js +0 -28
  286. package/build/tests/test.d.ts +0 -1
  287. package/build/tests/test.js +0 -51
  288. package/build/tests/test2.d.ts +0 -1
  289. package/build/tests/test2.js +0 -73
  290. package/build/tests/testReg.d.ts +0 -1
  291. package/build/tests/testReg.js +0 -91
  292. package/build/tests/tokens.d.ts +0 -6
  293. package/build/tests/tokens.js +0 -5
  294. package/build/tests/totalRewardReg.d.ts +0 -1
  295. package/build/tests/totalRewardReg.js +0 -28
  296. package/build/tests/transfer.d.ts +0 -1
  297. package/build/tests/transfer.js +0 -74
  298. package/build/tests/transferReg.d.ts +0 -1
  299. package/build/tests/transferReg.js +0 -74
  300. package/build/tests/unStakeReg.d.ts +0 -1
  301. package/build/tests/unStakeReg.js +0 -72
  302. package/build/tests/unwrapReg.d.ts +0 -1
  303. package/build/tests/unwrapReg.js +0 -61
  304. package/build/tests/unwrapReg2.d.ts +0 -1
  305. package/build/tests/unwrapReg2.js +0 -56
  306. package/build/tests/unwrapRegSegwit.d.ts +0 -1
  307. package/build/tests/unwrapRegSegwit.js +0 -83
  308. package/build/tests/wbtc/approve.d.ts +0 -1
  309. package/build/tests/wbtc/approve.js +0 -6
  310. package/build/tests/wbtc/approveWBTC.d.ts +0 -1
  311. package/build/tests/wbtc/approveWBTC.js +0 -12
  312. package/build/tests/wbtc/massWrapReg.d.ts +0 -1
  313. package/build/tests/wbtc/massWrapReg.js +0 -105
  314. package/build/tests/wbtc/transfer.d.ts +0 -1
  315. package/build/tests/wbtc/transfer.js +0 -16
  316. package/build/tests/wbtc/transferReg.d.ts +0 -1
  317. package/build/tests/wbtc/transferReg.js +0 -16
  318. package/build/tests/wbtc/unStakeReg.d.ts +0 -1
  319. package/build/tests/wbtc/unStakeReg.js +0 -72
  320. package/build/tests/wbtc/unwrapReg.d.ts +0 -1
  321. package/build/tests/wbtc/unwrapReg.js +0 -60
  322. package/build/tests/wbtc/unwrapRegSegwit.d.ts +0 -1
  323. package/build/tests/wbtc/unwrapRegSegwit.js +0 -83
  324. package/build/tests/wbtc/withdrawalRequestReg.d.ts +0 -1
  325. package/build/tests/wbtc/withdrawalRequestReg.js +0 -71
  326. package/build/tests/wbtc/wrapReg.d.ts +0 -1
  327. package/build/tests/wbtc/wrapReg.js +0 -65
  328. package/build/tests/wbtc/wrapTest.d.ts +0 -1
  329. package/build/tests/wbtc/wrapTest.js +0 -66
  330. package/build/tests/withdrawalRequestReg.d.ts +0 -1
  331. package/build/tests/withdrawalRequestReg.js +0 -71
  332. package/build/tests/wrap.d.ts +0 -1
  333. package/build/tests/wrap.js +0 -65
  334. package/build/tests/wrapReg.d.ts +0 -1
  335. package/build/tests/wrapReg.js +0 -68
  336. package/build/tests/wrapTest.d.ts +0 -1
  337. package/build/tests/wrapTest.js +0 -66
  338. package/build/tests/wrapTestg.d.ts +0 -1
  339. package/build/tests/wrapTestg.js +0 -66
  340. package/build/tests/writers/allowance.d.ts +0 -3
  341. package/build/tests/writers/allowance.js +0 -10
  342. package/build/tests/writers/approve.d.ts +0 -4
  343. package/build/tests/writers/approve.js +0 -11
  344. package/build/transaction/TransactionBuilder.d.ts +0 -60
  345. package/build/transaction/TransactionBuilder.js +0 -244
  346. package/build/transaction/browser/BrowserSigner.d.ts +0 -11
  347. package/build/transaction/browser/BrowserSigner.js +0 -10
  348. package/build/transaction/browser/extensions/Unisat.d.ts +0 -54
  349. package/build/transaction/browser/extensions/Unisat.js +0 -11
  350. package/build/transaction/builders/GenericTransaction.d.ts +0 -11
  351. package/build/transaction/builders/GenericTransaction.js +0 -23
  352. package/build/transaction/builders/TapUnwarpTransaction.d.ts +0 -37
  353. package/build/transaction/builders/TapUnwarpTransaction.js +0 -201
  354. package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +0 -34
  355. package/build/transaction/builders/UnwarpSegwitTransaction.js +0 -184
  356. package/build/transaction/builders/UnwarpTransaction.d.ts +0 -35
  357. package/build/transaction/builders/UnwarpTransaction.js +0 -199
  358. package/build/transaction/interfaces/ITransactions.d.ts +0 -32
  359. package/build/transaction/interfaces/ITransactions.js +0 -1
  360. package/build/utxo/IUTXO.d.ts +0 -0
  361. package/build/utxo/IUTXO.js +0 -1
  362. package/build/utxo/OPNetUtils.d.ts +0 -7
  363. package/build/utxo/OPNetUtils.js +0 -47
  364. package/build/utxo/UTXOManager.d.ts +0 -7
  365. package/build/utxo/UTXOManager.js +0 -47
  366. package/build/wbtc/BroadcastResponse.d.ts +0 -0
  367. package/build/wbtc/BroadcastResponse.js +0 -1
  368. package/examples/Deploy.md +0 -188
  369. package/examples/Unwrap.md +0 -165
  370. package/examples/Wrap.md +0 -194
  371. package/tsconfig.cjs.json +0 -13
  372. /package/build/generators/{features.d.ts → Features.d.ts} +0 -0
  373. /package/build/generators/{features.js → Features.js} +0 -0
@@ -1,507 +1,507 @@
1
- import { Taptree } from 'bitcoinjs-lib/src/types.js';
2
- import { TransactionType } from '../enums/TransactionType.js';
3
- import { IUnwrapParameters } from '../interfaces/ITransactionParameters.js';
4
- import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
5
- import { TransactionBuilder } from './TransactionBuilder.js';
6
- import { ABICoder, BinaryWriter, Selector } from '@btc-vision/bsi-binary';
7
- import { wBTC } from '../../metadata/contracts/wBTC.js';
8
- import { Network, Payment, payments, Psbt } from 'bitcoinjs-lib';
9
- import { EcKeyPair } from '../../keypair/EcKeyPair.js';
10
- import { IWBTCUTXODocument, PsbtTransaction, VaultUTXOs } from '../processor/PsbtTransaction.js';
11
- import { PsbtInputExtended, PsbtOutputExtended } from '../interfaces/Tap.js';
12
- import { MultiSignGenerator } from '../../generators/builders/MultiSignGenerator.js';
13
- import { MultiSignTransaction } from './MultiSignTransaction.js';
14
- import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
15
- import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
16
- import { PsbtInput } from 'bip174/src/lib/interfaces.js';
17
- import { currentConsensusConfig } from '../../consensus/ConsensusConfig.js';
18
- import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
19
- import { Features } from '../../generators/Features.js';
20
-
21
- const abiCoder: ABICoder = new ABICoder();
22
- const numsPoint: Buffer = Buffer.from(
23
- '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0',
24
- 'hex',
25
- );
26
-
27
- /**
28
- * Unwrap transaction
29
- * @class UnwrapTransaction
30
- */
31
- export class UnwrapTransaction extends SharedInteractionTransaction<TransactionType.WBTC_UNWRAP> {
32
- private static readonly UNWRAP_SELECTOR: Selector = Number(
33
- '0x' + abiCoder.encodeSelector('burn'),
34
- );
35
-
36
- public type: TransactionType.WBTC_UNWRAP = TransactionType.WBTC_UNWRAP;
37
-
38
- /**
39
- * The amount to wrap
40
- * @private
41
- */
42
- public readonly amount: bigint;
43
-
44
- /**
45
- * The compiled target script
46
- * @protected
47
- */
48
- protected readonly compiledTargetScript: Buffer;
49
- /**
50
- * The script tree
51
- * @protected
52
- */
53
- protected readonly scriptTree: Taptree;
54
- /**
55
- * The sighash types for the transaction
56
- * @protected
57
- */
58
- protected sighashTypes: number[] = [];
59
- /**
60
- * Contract secret for the interaction
61
- * @protected
62
- */
63
- protected readonly contractSecret: Buffer;
64
- /**
65
- * The vault UTXOs
66
- * @protected
67
- */
68
- protected readonly vaultUTXOs: VaultUTXOs[];
69
-
70
- /**
71
- * Estimated unwrap loss due to bitcoin fees in satoshis.
72
- * @protected
73
- */
74
- protected readonly estimatedFeeLoss: bigint = 0n;
75
-
76
- /**
77
- * The wBTC contract
78
- * @private
79
- */
80
- private readonly wbtc: wBTC;
81
- private readonly calculatedSignHash: number = PsbtTransaction.calculateSignHash(
82
- this.sighashTypes,
83
- );
84
-
85
- public constructor(parameters: IUnwrapParameters) {
86
- if (parameters.amount < TransactionBuilder.MINIMUM_DUST) {
87
- throw new Error('Amount is below dust limit');
88
- }
89
-
90
- parameters.disableAutoRefund = true; // we have to disable auto refund for this transaction, so it does not create an unwanted output.
91
- parameters.calldata = UnwrapTransaction.generateBurnCalldata(parameters.amount);
92
-
93
- super(parameters);
94
-
95
- this.wbtc = new wBTC(parameters.network, parameters.chainId);
96
- this.to = this.wbtc.getAddress();
97
-
98
- this.vaultUTXOs = parameters.unwrapUTXOs;
99
- this.estimatedFeeLoss = UnwrapTransaction.preEstimateTaprootTransactionFees(
100
- BigInt(this.feeRate),
101
- this.calculateNumInputs(this.vaultUTXOs),
102
- 2n,
103
- this.calculateNumSignatures(this.vaultUTXOs),
104
- 65n,
105
- this.calculateNumEmptyWitnesses(this.vaultUTXOs),
106
- );
107
-
108
- this.amount = parameters.amount;
109
- this.contractSecret = this.generateSecret();
110
-
111
- this.calldataGenerator = new CalldataGenerator(
112
- toXOnly(this.signer.publicKey),
113
- this.scriptSignerXOnlyPubKey(),
114
- this.network,
115
- );
116
-
117
- this.compiledTargetScript = this.calldataGenerator.compile(
118
- this.calldata,
119
- this.contractSecret,
120
- [Features.UNWRAP],
121
- );
122
-
123
- this.scriptTree = this.getScriptTree();
124
- this.internalInit();
125
- }
126
-
127
- /**
128
- * Generate a valid wBTC calldata
129
- * @param {bigint} amount - The amount to wrap
130
- * @private
131
- * @returns {Buffer} - The calldata
132
- */
133
- public static generateBurnCalldata(amount: bigint): Buffer {
134
- if (!amount) throw new Error('Amount is required');
135
-
136
- const bufWriter: BinaryWriter = new BinaryWriter();
137
- bufWriter.writeSelector(UnwrapTransaction.UNWRAP_SELECTOR);
138
- bufWriter.writeU256(amount);
139
-
140
- return Buffer.from(bufWriter.getBuffer());
141
- }
142
-
143
- /*public tweakScalarPoints(): Uint8Array {
144
- const key: Uint8Array = (this.signer as ECPairInterface).privateKey as Uint8Array;
145
- //const r = bitcoin.crypto.sha256(Buffer.from('WTF_IS_OP_NET!', 'utf-8'));
146
- const rG = ecc.pointMultiply(
147
- Buffer.from(this.internalPubKeyToXOnly()), //EcKeyPair.fromPrivateKey(r).publicKey.subarray(1)
148
- key,
149
- );
150
-
151
- if (!rG) throw new Error('Failed to tweak rG');
152
-
153
- const tweaked = ecc.pointAdd(this.numsPoint, rG);
154
- if (!tweaked) throw new Error('Failed to tweak rG');
155
-
156
- return Buffer.from(tweaked);
157
- }*/
158
-
159
- /**
160
- * @description Signs the transaction
161
- * @public
162
- * @returns {Promise<Psbt>} - The signed transaction in hex format
163
- * @throws {Error} - If something went wrong
164
- */
165
- public async signPSBT(): Promise<Psbt> {
166
- if (this.to && !EcKeyPair.verifyContractAddress(this.to, this.network)) {
167
- throw new Error(
168
- 'Invalid contract address. The contract address must be a taproot address.',
169
- );
170
- }
171
-
172
- if (!this.vaultUTXOs.length) {
173
- throw new Error('No vault UTXOs provided');
174
- }
175
-
176
- await this.buildTransaction();
177
- this.ignoreSignatureError();
178
- this.mergeVaults();
179
-
180
- const builtTx = await this.internalBuildTransaction(this.transaction);
181
- if (builtTx) {
182
- return this.transaction;
183
- }
184
-
185
- throw new Error('Could not sign transaction');
186
- }
187
-
188
- public getRefund(): bigint {
189
- let losses: bigint = -currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
190
-
191
- for (let vault of this.vaultUTXOs) {
192
- for (let i = 0; i < vault.utxos.length; i++) {
193
- losses += currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
194
- }
195
- }
196
-
197
- // Since we are creating one output when consolidating, we need to add the fee for that output.
198
- return losses;
199
- }
200
-
201
- /**
202
- * @description Get the estimated unwrap loss due to bitcoin fees in satoshis.
203
- * @description If the number is negative, it means the user will get a refund.
204
- * @description If the number is positive, it means the user will lose that amount.
205
- * @public
206
- * @returns {bigint} - The estimated fee loss or refund
207
- */
208
- public getFeeLossOrRefund(): bigint {
209
- let refund: bigint = this.getRefund();
210
-
211
- return refund - this.estimatedFeeLoss;
212
- }
213
-
214
- /**
215
- * @description Merge vault UTXOs into the transaction
216
- * @protected
217
- */
218
- protected mergeVaults(): void {
219
- const totalInputAmount: bigint = this.getVaultTotalOutputAmount(this.vaultUTXOs);
220
-
221
- let refund: bigint = this.getRefund();
222
- let outputLeftAmount = totalInputAmount - refund - this.amount;
223
-
224
- if (outputLeftAmount === currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT) {
225
- refund += currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
226
- } else if (outputLeftAmount < currentConsensusConfig.VAULT_MINIMUM_AMOUNT) {
227
- throw new Error(
228
- `Output left amount is below the minimum amount: ${outputLeftAmount} below ${currentConsensusConfig.VAULT_MINIMUM_AMOUNT}`,
229
- );
230
- }
231
-
232
- const outAmount: bigint = this.amount + refund - this.estimatedFeeLoss;
233
- const bestVault = BitcoinUtils.findVaultWithMostPublicKeys(this.vaultUTXOs);
234
- if (!bestVault) {
235
- throw new Error('No vaults provided');
236
- }
237
-
238
- let hasConsolidation: boolean =
239
- outputLeftAmount > currentConsensusConfig.VAULT_MINIMUM_AMOUNT &&
240
- outputLeftAmount - currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT !== 0n;
241
-
242
- if (hasConsolidation) {
243
- this.success(`Consolidating output with ${outputLeftAmount} sat.`);
244
- } else {
245
- this.warn(`No consolidation in this transaction.`);
246
- }
247
-
248
- if (
249
- outputLeftAmount - currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT !==
250
- 0n
251
- ) {
252
- // If the amount left is 0, we don't consolidate the output.
253
- this.addOutput({
254
- address: bestVault.vault,
255
- value: Number(outputLeftAmount),
256
- });
257
- }
258
-
259
- if (outAmount < TransactionBuilder.MINIMUM_DUST) {
260
- throw new Error(
261
- `Amount is below dust limit. The requested amount can not be unwrapped since, after fees, it is below the dust limit. Dust: ${outAmount} sat. Are your bitcoin fees too high?`,
262
- );
263
- }
264
-
265
- const percentageLossOverInitialAmount = (outAmount * 100n) / this.amount;
266
- if (percentageLossOverInitialAmount <= 60n) {
267
- // For user safety, we don't allow more than 60% loss over the initial amount.
268
- throw new Error(
269
- `For user safety, OPNet will decline this transaction since you will lose ${100n - percentageLossOverInitialAmount}% of your btc by doing this transaction due to bitcoin fees. Are your bitcoin fees too high?`,
270
- );
271
- }
272
-
273
- this.addOutput({
274
- address: this.from,
275
- value: Number(outAmount),
276
- });
277
-
278
- for (const vault of this.vaultUTXOs) {
279
- this.addVaultInputs(vault);
280
- }
281
- }
282
-
283
- protected calculateNumEmptyWitnesses(vault: VaultUTXOs[]): bigint {
284
- let numSignatures = 0n;
285
- for (const v of vault) {
286
- numSignatures += BigInt(v.publicKeys.length - v.minimum) * BigInt(v.utxos.length);
287
- }
288
-
289
- return numSignatures;
290
- }
291
-
292
- protected calculateNumSignatures(vault: VaultUTXOs[]): bigint {
293
- let numSignatures = 0n;
294
- for (const v of vault) {
295
- numSignatures += BigInt(v.minimum * v.utxos.length);
296
- }
297
-
298
- return numSignatures;
299
- }
300
-
301
- protected calculateNumInputs(vault: VaultUTXOs[]): bigint {
302
- let numSignatures = 0n;
303
- for (const v of vault) {
304
- numSignatures += BigInt(v.utxos.length);
305
- }
306
-
307
- return numSignatures;
308
- }
309
-
310
- /**
311
- * Converts the public key to x-only.
312
- * @protected
313
- * @returns {Buffer}
314
- */
315
- protected internalPubKeyToXOnly(): Buffer {
316
- return toXOnly(numsPoint);
317
- }
318
-
319
- /**
320
- * Generate an input for a vault UTXO
321
- * @param {Buffer[]} pubkeys The public keys
322
- * @param {number} minimumSignatures The minimum number of signatures
323
- * @protected
324
- * @returns {Taptree} The tap tree
325
- * @throws {Error} If something went wrong
326
- */
327
- protected generateTapDataForInput(
328
- pubkeys: Buffer[],
329
- minimumSignatures: number,
330
- ): {
331
- internalPubkey: Buffer;
332
- network: Network;
333
- scriptTree: Taptree;
334
- redeem: Payment;
335
- } {
336
- const compiledTargetScript = MultiSignGenerator.compile(pubkeys, minimumSignatures);
337
- const scriptTree: Taptree = [
338
- {
339
- output: compiledTargetScript,
340
- version: 192,
341
- },
342
- {
343
- output: MultiSignTransaction.LOCK_LEAF_SCRIPT,
344
- version: 192,
345
- },
346
- ];
347
-
348
- const redeem: Payment = {
349
- output: compiledTargetScript,
350
- redeemVersion: 192,
351
- };
352
-
353
- return {
354
- internalPubkey: this.internalPubKeyToXOnly(),
355
- network: this.network,
356
- scriptTree: scriptTree,
357
- redeem: redeem,
358
- };
359
- }
360
-
361
- /**
362
- * Generate the script solution
363
- * @param {PsbtInput} input The input
364
- * @protected
365
- *
366
- * @returns {Buffer[]} The script solution
367
- */
368
- protected getScriptSolution(input: PsbtInput): Buffer[] {
369
- if (!input.tapScriptSig) {
370
- throw new Error('Tap script signature is required');
371
- }
372
-
373
- return [
374
- this.contractSecret,
375
- toXOnly(this.signer.publicKey),
376
- input.tapScriptSig[0].signature,
377
- input.tapScriptSig[1].signature,
378
- ];
379
- }
380
-
381
- /**
382
- * Builds the transaction.
383
- * @param {Psbt} transaction - The transaction to build
384
- * @protected
385
- * @returns {Promise<boolean>}
386
- * @throws {Error} - If something went wrong while building the transaction
387
- */
388
- protected async internalBuildTransaction(transaction: Psbt): Promise<boolean> {
389
- if (transaction.data.inputs.length === 0) {
390
- const inputs: PsbtInputExtended[] = this.getInputs();
391
- const outputs: PsbtOutputExtended[] = this.getOutputs();
392
-
393
- transaction.setMaximumFeeRate(this._maximumFeeRate);
394
- transaction.addInputs(inputs);
395
-
396
- for (let i = 0; i < this.updateInputs.length; i++) {
397
- transaction.updateInput(i, this.updateInputs[i]);
398
- }
399
-
400
- transaction.addOutputs(outputs);
401
- }
402
-
403
- try {
404
- try {
405
- await this.signInputs(transaction);
406
- } catch (e) {
407
- console.log(e);
408
- }
409
-
410
- if (this.finalized) {
411
- this.transactionFee = BigInt(transaction.getFee());
412
- }
413
-
414
- return true;
415
- } catch (e) {
416
- const err: Error = e as Error;
417
-
418
- this.error(
419
- `[internalBuildTransaction] Something went wrong while getting building the transaction: ${err.stack}`,
420
- );
421
- }
422
-
423
- return false;
424
- }
425
-
426
- /**
427
- * @description Add a vault UTXO to the transaction
428
- * @private
429
- */
430
- private addVaultUTXO(
431
- utxo: IWBTCUTXODocument,
432
- pubkeys: Buffer[],
433
- minimumSignatures: number,
434
- ): void {
435
- const tapInput = this.generateTapDataForInput(pubkeys, minimumSignatures);
436
- const tap = payments.p2tr(tapInput);
437
-
438
- if (!tap.witness) throw new Error('Failed to generate taproot witness');
439
-
440
- const controlBlock = tap.witness[tap.witness.length - 1];
441
- const input: PsbtInputExtended = {
442
- hash: utxo.hash,
443
- index: utxo.outputIndex,
444
- witnessUtxo: {
445
- script: Buffer.from(utxo.output, 'base64'),
446
- value: Number(utxo.value),
447
- },
448
- sequence: this.sequence,
449
- tapLeafScript: [
450
- {
451
- leafVersion: tapInput.redeem.redeemVersion as number,
452
- script: tapInput.redeem.output as Buffer,
453
- controlBlock: controlBlock,
454
- },
455
- ],
456
- };
457
-
458
- if (this.calculatedSignHash) {
459
- input.sighashType = this.calculatedSignHash;
460
- }
461
-
462
- this.addInput(input);
463
- }
464
-
465
- /**
466
- * @description Add vault inputs to the transaction
467
- * @param {VaultUTXOs} vault The vault UTXOs
468
- * @private
469
- */
470
- private addVaultInputs(vault: VaultUTXOs): void {
471
- const pubKeys = vault.publicKeys.map((key) => Buffer.from(key, 'base64'));
472
-
473
- for (const utxo of vault.utxos) {
474
- this.addVaultUTXO(utxo, pubKeys, vault.minimum);
475
- }
476
- }
477
-
478
- /**
479
- * @description Calculate the amount left to refund to the first vault.
480
- * @param {VaultUTXOs[]} vaults The vaults
481
- * @private
482
- * @returns {bigint} The amount left
483
- */
484
- private calculateOutputLeftAmountFromVaults(vaults: VaultUTXOs[]): bigint {
485
- const total = this.getVaultTotalOutputAmount(vaults);
486
-
487
- return total - this.amount;
488
- }
489
-
490
- /**
491
- * Get the total output amount from the vaults
492
- * @description Get the total output amount from the vaults
493
- * @param {VaultUTXOs[]} vaults The vaults
494
- * @private
495
- * @returns {bigint} The total output amount
496
- */
497
- private getVaultTotalOutputAmount(vaults: VaultUTXOs[]): bigint {
498
- let total = BigInt(0);
499
- for (const vault of vaults) {
500
- for (const utxo of vault.utxos) {
501
- total += BigInt(utxo.value);
502
- }
503
- }
504
-
505
- return total;
506
- }
507
- }
1
+ import { Taptree } from 'bitcoinjs-lib/src/types.js';
2
+ import { TransactionType } from '../enums/TransactionType.js';
3
+ import { IUnwrapParameters } from '../interfaces/ITransactionParameters.js';
4
+ import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
5
+ import { TransactionBuilder } from './TransactionBuilder.js';
6
+ import { ABICoder, BinaryWriter, Selector } from '@btc-vision/bsi-binary';
7
+ import { wBTC } from '../../metadata/contracts/wBTC.js';
8
+ import { Network, Payment, payments, Psbt } from 'bitcoinjs-lib';
9
+ import { EcKeyPair } from '../../keypair/EcKeyPair.js';
10
+ import { IWBTCUTXODocument, PsbtTransaction, VaultUTXOs } from '../processor/PsbtTransaction.js';
11
+ import { PsbtInputExtended, PsbtOutputExtended } from '../interfaces/Tap.js';
12
+ import { MultiSignGenerator } from '../../generators/builders/MultiSignGenerator.js';
13
+ import { MultiSignTransaction } from './MultiSignTransaction.js';
14
+ import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
15
+ import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
16
+ import { PsbtInput } from 'bip174/src/lib/interfaces.js';
17
+ import { currentConsensusConfig } from '../../consensus/ConsensusConfig.js';
18
+ import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
19
+ import { Features } from '../../generators/Features.js';
20
+
21
+ const abiCoder: ABICoder = new ABICoder();
22
+ const numsPoint: Buffer = Buffer.from(
23
+ '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0',
24
+ 'hex',
25
+ );
26
+
27
+ /**
28
+ * Unwrap transaction
29
+ * @class UnwrapTransaction
30
+ */
31
+ export class UnwrapTransaction extends SharedInteractionTransaction<TransactionType.WBTC_UNWRAP> {
32
+ private static readonly UNWRAP_SELECTOR: Selector = Number(
33
+ '0x' + abiCoder.encodeSelector('burn'),
34
+ );
35
+
36
+ public type: TransactionType.WBTC_UNWRAP = TransactionType.WBTC_UNWRAP;
37
+
38
+ /**
39
+ * The amount to wrap
40
+ * @private
41
+ */
42
+ public readonly amount: bigint;
43
+
44
+ /**
45
+ * The compiled target script
46
+ * @protected
47
+ */
48
+ protected readonly compiledTargetScript: Buffer;
49
+ /**
50
+ * The script tree
51
+ * @protected
52
+ */
53
+ protected readonly scriptTree: Taptree;
54
+ /**
55
+ * The sighash types for the transaction
56
+ * @protected
57
+ */
58
+ protected sighashTypes: number[] = [];
59
+ /**
60
+ * Contract secret for the interaction
61
+ * @protected
62
+ */
63
+ protected readonly contractSecret: Buffer;
64
+ /**
65
+ * The vault UTXOs
66
+ * @protected
67
+ */
68
+ protected readonly vaultUTXOs: VaultUTXOs[];
69
+
70
+ /**
71
+ * Estimated unwrap loss due to bitcoin fees in satoshis.
72
+ * @protected
73
+ */
74
+ protected readonly estimatedFeeLoss: bigint = 0n;
75
+
76
+ /**
77
+ * The wBTC contract
78
+ * @private
79
+ */
80
+ private readonly wbtc: wBTC;
81
+ private readonly calculatedSignHash: number = PsbtTransaction.calculateSignHash(
82
+ this.sighashTypes,
83
+ );
84
+
85
+ public constructor(parameters: IUnwrapParameters) {
86
+ if (parameters.amount < TransactionBuilder.MINIMUM_DUST) {
87
+ throw new Error('Amount is below dust limit');
88
+ }
89
+
90
+ parameters.disableAutoRefund = true; // we have to disable auto refund for this transaction, so it does not create an unwanted output.
91
+ parameters.calldata = UnwrapTransaction.generateBurnCalldata(parameters.amount);
92
+
93
+ super(parameters);
94
+
95
+ this.wbtc = new wBTC(parameters.network, parameters.chainId);
96
+ this.to = this.wbtc.getAddress();
97
+
98
+ this.vaultUTXOs = parameters.unwrapUTXOs;
99
+ this.estimatedFeeLoss = UnwrapTransaction.preEstimateTaprootTransactionFees(
100
+ BigInt(this.feeRate),
101
+ this.calculateNumInputs(this.vaultUTXOs),
102
+ 2n,
103
+ this.calculateNumSignatures(this.vaultUTXOs),
104
+ 65n,
105
+ this.calculateNumEmptyWitnesses(this.vaultUTXOs),
106
+ );
107
+
108
+ this.amount = parameters.amount;
109
+ this.contractSecret = this.generateSecret();
110
+
111
+ this.calldataGenerator = new CalldataGenerator(
112
+ toXOnly(this.signer.publicKey),
113
+ this.scriptSignerXOnlyPubKey(),
114
+ this.network,
115
+ );
116
+
117
+ this.compiledTargetScript = this.calldataGenerator.compile(
118
+ this.calldata,
119
+ this.contractSecret,
120
+ [Features.UNWRAP],
121
+ );
122
+
123
+ this.scriptTree = this.getScriptTree();
124
+ this.internalInit();
125
+ }
126
+
127
+ /**
128
+ * Generate a valid wBTC calldata
129
+ * @param {bigint} amount - The amount to wrap
130
+ * @private
131
+ * @returns {Buffer} - The calldata
132
+ */
133
+ public static generateBurnCalldata(amount: bigint): Buffer {
134
+ if (!amount) throw new Error('Amount is required');
135
+
136
+ const bufWriter: BinaryWriter = new BinaryWriter();
137
+ bufWriter.writeSelector(UnwrapTransaction.UNWRAP_SELECTOR);
138
+ bufWriter.writeU256(amount);
139
+
140
+ return Buffer.from(bufWriter.getBuffer());
141
+ }
142
+
143
+ /*public tweakScalarPoints(): Uint8Array {
144
+ const key: Uint8Array = (this.signer as ECPairInterface).privateKey as Uint8Array;
145
+ //const r = bitcoin.crypto.sha256(Buffer.from('WTF_IS_OP_NET!', 'utf-8'));
146
+ const rG = ecc.pointMultiply(
147
+ Buffer.from(this.internalPubKeyToXOnly()), //EcKeyPair.fromPrivateKey(r).publicKey.subarray(1)
148
+ key,
149
+ );
150
+
151
+ if (!rG) throw new Error('Failed to tweak rG');
152
+
153
+ const tweaked = ecc.pointAdd(this.numsPoint, rG);
154
+ if (!tweaked) throw new Error('Failed to tweak rG');
155
+
156
+ return Buffer.from(tweaked);
157
+ }*/
158
+
159
+ /**
160
+ * @description Signs the transaction
161
+ * @public
162
+ * @returns {Promise<Psbt>} - The signed transaction in hex format
163
+ * @throws {Error} - If something went wrong
164
+ */
165
+ public async signPSBT(): Promise<Psbt> {
166
+ if (this.to && !EcKeyPair.verifyContractAddress(this.to, this.network)) {
167
+ throw new Error(
168
+ 'Invalid contract address. The contract address must be a taproot address.',
169
+ );
170
+ }
171
+
172
+ if (!this.vaultUTXOs.length) {
173
+ throw new Error('No vault UTXOs provided');
174
+ }
175
+
176
+ await this.buildTransaction();
177
+ this.ignoreSignatureError();
178
+ this.mergeVaults();
179
+
180
+ const builtTx = await this.internalBuildTransaction(this.transaction);
181
+ if (builtTx) {
182
+ return this.transaction;
183
+ }
184
+
185
+ throw new Error('Could not sign transaction');
186
+ }
187
+
188
+ public getRefund(): bigint {
189
+ let losses: bigint = -currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
190
+
191
+ for (let vault of this.vaultUTXOs) {
192
+ for (let i = 0; i < vault.utxos.length; i++) {
193
+ losses += currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
194
+ }
195
+ }
196
+
197
+ // Since we are creating one output when consolidating, we need to add the fee for that output.
198
+ return losses;
199
+ }
200
+
201
+ /**
202
+ * @description Get the estimated unwrap loss due to bitcoin fees in satoshis.
203
+ * @description If the number is negative, it means the user will get a refund.
204
+ * @description If the number is positive, it means the user will lose that amount.
205
+ * @public
206
+ * @returns {bigint} - The estimated fee loss or refund
207
+ */
208
+ public getFeeLossOrRefund(): bigint {
209
+ let refund: bigint = this.getRefund();
210
+
211
+ return refund - this.estimatedFeeLoss;
212
+ }
213
+
214
+ /**
215
+ * @description Merge vault UTXOs into the transaction
216
+ * @protected
217
+ */
218
+ protected mergeVaults(): void {
219
+ const totalInputAmount: bigint = this.getVaultTotalOutputAmount(this.vaultUTXOs);
220
+
221
+ let refund: bigint = this.getRefund();
222
+ let outputLeftAmount = totalInputAmount - refund - this.amount;
223
+
224
+ if (outputLeftAmount === currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT) {
225
+ refund += currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
226
+ } else if (outputLeftAmount < currentConsensusConfig.VAULT_MINIMUM_AMOUNT) {
227
+ throw new Error(
228
+ `Output left amount is below the minimum amount: ${outputLeftAmount} below ${currentConsensusConfig.VAULT_MINIMUM_AMOUNT}`,
229
+ );
230
+ }
231
+
232
+ const outAmount: bigint = this.amount + refund - this.estimatedFeeLoss;
233
+ const bestVault = BitcoinUtils.findVaultWithMostPublicKeys(this.vaultUTXOs);
234
+ if (!bestVault) {
235
+ throw new Error('No vaults provided');
236
+ }
237
+
238
+ let hasConsolidation: boolean =
239
+ outputLeftAmount > currentConsensusConfig.VAULT_MINIMUM_AMOUNT &&
240
+ outputLeftAmount - currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT !== 0n;
241
+
242
+ if (hasConsolidation) {
243
+ this.success(`Consolidating output with ${outputLeftAmount} sat.`);
244
+ } else {
245
+ this.warn(`No consolidation in this transaction.`);
246
+ }
247
+
248
+ if (
249
+ outputLeftAmount - currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT !==
250
+ 0n
251
+ ) {
252
+ // If the amount left is 0, we don't consolidate the output.
253
+ this.addOutput({
254
+ address: bestVault.vault,
255
+ value: Number(outputLeftAmount),
256
+ });
257
+ }
258
+
259
+ if (outAmount < TransactionBuilder.MINIMUM_DUST) {
260
+ throw new Error(
261
+ `Amount is below dust limit. The requested amount can not be unwrapped since, after fees, it is below the dust limit. Dust: ${outAmount} sat. Are your bitcoin fees too high?`,
262
+ );
263
+ }
264
+
265
+ const percentageLossOverInitialAmount = (outAmount * 100n) / this.amount;
266
+ if (percentageLossOverInitialAmount <= 60n) {
267
+ // For user safety, we don't allow more than 60% loss over the initial amount.
268
+ throw new Error(
269
+ `For user safety, OPNet will decline this transaction since you will lose ${100n - percentageLossOverInitialAmount}% of your btc by doing this transaction due to bitcoin fees. Are your bitcoin fees too high?`,
270
+ );
271
+ }
272
+
273
+ this.addOutput({
274
+ address: this.from,
275
+ value: Number(outAmount),
276
+ });
277
+
278
+ for (const vault of this.vaultUTXOs) {
279
+ this.addVaultInputs(vault);
280
+ }
281
+ }
282
+
283
+ protected calculateNumEmptyWitnesses(vault: VaultUTXOs[]): bigint {
284
+ let numSignatures = 0n;
285
+ for (const v of vault) {
286
+ numSignatures += BigInt(v.publicKeys.length - v.minimum) * BigInt(v.utxos.length);
287
+ }
288
+
289
+ return numSignatures;
290
+ }
291
+
292
+ protected calculateNumSignatures(vault: VaultUTXOs[]): bigint {
293
+ let numSignatures = 0n;
294
+ for (const v of vault) {
295
+ numSignatures += BigInt(v.minimum * v.utxos.length);
296
+ }
297
+
298
+ return numSignatures;
299
+ }
300
+
301
+ protected calculateNumInputs(vault: VaultUTXOs[]): bigint {
302
+ let numSignatures = 0n;
303
+ for (const v of vault) {
304
+ numSignatures += BigInt(v.utxos.length);
305
+ }
306
+
307
+ return numSignatures;
308
+ }
309
+
310
+ /**
311
+ * Converts the public key to x-only.
312
+ * @protected
313
+ * @returns {Buffer}
314
+ */
315
+ protected internalPubKeyToXOnly(): Buffer {
316
+ return toXOnly(numsPoint);
317
+ }
318
+
319
+ /**
320
+ * Generate an input for a vault UTXO
321
+ * @param {Buffer[]} pubkeys The public keys
322
+ * @param {number} minimumSignatures The minimum number of signatures
323
+ * @protected
324
+ * @returns {Taptree} The tap tree
325
+ * @throws {Error} If something went wrong
326
+ */
327
+ protected generateTapDataForInput(
328
+ pubkeys: Buffer[],
329
+ minimumSignatures: number,
330
+ ): {
331
+ internalPubkey: Buffer;
332
+ network: Network;
333
+ scriptTree: Taptree;
334
+ redeem: Payment;
335
+ } {
336
+ const compiledTargetScript = MultiSignGenerator.compile(pubkeys, minimumSignatures);
337
+ const scriptTree: Taptree = [
338
+ {
339
+ output: compiledTargetScript,
340
+ version: 192,
341
+ },
342
+ {
343
+ output: MultiSignTransaction.LOCK_LEAF_SCRIPT,
344
+ version: 192,
345
+ },
346
+ ];
347
+
348
+ const redeem: Payment = {
349
+ output: compiledTargetScript,
350
+ redeemVersion: 192,
351
+ };
352
+
353
+ return {
354
+ internalPubkey: this.internalPubKeyToXOnly(),
355
+ network: this.network,
356
+ scriptTree: scriptTree,
357
+ redeem: redeem,
358
+ };
359
+ }
360
+
361
+ /**
362
+ * Generate the script solution
363
+ * @param {PsbtInput} input The input
364
+ * @protected
365
+ *
366
+ * @returns {Buffer[]} The script solution
367
+ */
368
+ protected getScriptSolution(input: PsbtInput): Buffer[] {
369
+ if (!input.tapScriptSig) {
370
+ throw new Error('Tap script signature is required');
371
+ }
372
+
373
+ return [
374
+ this.contractSecret,
375
+ toXOnly(this.signer.publicKey),
376
+ input.tapScriptSig[0].signature,
377
+ input.tapScriptSig[1].signature,
378
+ ];
379
+ }
380
+
381
+ /**
382
+ * Builds the transaction.
383
+ * @param {Psbt} transaction - The transaction to build
384
+ * @protected
385
+ * @returns {Promise<boolean>}
386
+ * @throws {Error} - If something went wrong while building the transaction
387
+ */
388
+ protected async internalBuildTransaction(transaction: Psbt): Promise<boolean> {
389
+ if (transaction.data.inputs.length === 0) {
390
+ const inputs: PsbtInputExtended[] = this.getInputs();
391
+ const outputs: PsbtOutputExtended[] = this.getOutputs();
392
+
393
+ transaction.setMaximumFeeRate(this._maximumFeeRate);
394
+ transaction.addInputs(inputs);
395
+
396
+ for (let i = 0; i < this.updateInputs.length; i++) {
397
+ transaction.updateInput(i, this.updateInputs[i]);
398
+ }
399
+
400
+ transaction.addOutputs(outputs);
401
+ }
402
+
403
+ try {
404
+ try {
405
+ await this.signInputs(transaction);
406
+ } catch (e) {
407
+ console.log(e);
408
+ }
409
+
410
+ if (this.finalized) {
411
+ this.transactionFee = BigInt(transaction.getFee());
412
+ }
413
+
414
+ return true;
415
+ } catch (e) {
416
+ const err: Error = e as Error;
417
+
418
+ this.error(
419
+ `[internalBuildTransaction] Something went wrong while getting building the transaction: ${err.stack}`,
420
+ );
421
+ }
422
+
423
+ return false;
424
+ }
425
+
426
+ /**
427
+ * @description Add a vault UTXO to the transaction
428
+ * @private
429
+ */
430
+ private addVaultUTXO(
431
+ utxo: IWBTCUTXODocument,
432
+ pubkeys: Buffer[],
433
+ minimumSignatures: number,
434
+ ): void {
435
+ const tapInput = this.generateTapDataForInput(pubkeys, minimumSignatures);
436
+ const tap = payments.p2tr(tapInput);
437
+
438
+ if (!tap.witness) throw new Error('Failed to generate taproot witness');
439
+
440
+ const controlBlock = tap.witness[tap.witness.length - 1];
441
+ const input: PsbtInputExtended = {
442
+ hash: utxo.hash,
443
+ index: utxo.outputIndex,
444
+ witnessUtxo: {
445
+ script: Buffer.from(utxo.output, 'base64'),
446
+ value: Number(utxo.value),
447
+ },
448
+ sequence: this.sequence,
449
+ tapLeafScript: [
450
+ {
451
+ leafVersion: tapInput.redeem.redeemVersion as number,
452
+ script: tapInput.redeem.output as Buffer,
453
+ controlBlock: controlBlock,
454
+ },
455
+ ],
456
+ };
457
+
458
+ if (this.calculatedSignHash) {
459
+ input.sighashType = this.calculatedSignHash;
460
+ }
461
+
462
+ this.addInput(input);
463
+ }
464
+
465
+ /**
466
+ * @description Add vault inputs to the transaction
467
+ * @param {VaultUTXOs} vault The vault UTXOs
468
+ * @private
469
+ */
470
+ private addVaultInputs(vault: VaultUTXOs): void {
471
+ const pubKeys = vault.publicKeys.map((key) => Buffer.from(key, 'base64'));
472
+
473
+ for (const utxo of vault.utxos) {
474
+ this.addVaultUTXO(utxo, pubKeys, vault.minimum);
475
+ }
476
+ }
477
+
478
+ /**
479
+ * @description Calculate the amount left to refund to the first vault.
480
+ * @param {VaultUTXOs[]} vaults The vaults
481
+ * @private
482
+ * @returns {bigint} The amount left
483
+ */
484
+ private calculateOutputLeftAmountFromVaults(vaults: VaultUTXOs[]): bigint {
485
+ const total = this.getVaultTotalOutputAmount(vaults);
486
+
487
+ return total - this.amount;
488
+ }
489
+
490
+ /**
491
+ * Get the total output amount from the vaults
492
+ * @description Get the total output amount from the vaults
493
+ * @param {VaultUTXOs[]} vaults The vaults
494
+ * @private
495
+ * @returns {bigint} The total output amount
496
+ */
497
+ private getVaultTotalOutputAmount(vaults: VaultUTXOs[]): bigint {
498
+ let total = BigInt(0);
499
+ for (const vault of vaults) {
500
+ for (const utxo of vault.utxos) {
501
+ total += BigInt(utxo.value);
502
+ }
503
+ }
504
+
505
+ return total;
506
+ }
507
+ }