@btc-vision/transaction 1.0.84 → 1.0.86

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 (280) 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 +5 -5
  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/browser/BrowserSigner.d.ts +11 -0
  212. package/build/transaction/browser/BrowserSigner.js +10 -0
  213. package/build/transaction/browser/extensions/Unisat.d.ts +54 -0
  214. package/build/transaction/browser/extensions/Unisat.js +11 -0
  215. package/build/transaction/builders/GenericTransaction.d.ts +11 -0
  216. package/build/transaction/builders/GenericTransaction.js +23 -0
  217. package/build/transaction/builders/TapUnwarpTransaction.d.ts +37 -0
  218. package/build/transaction/builders/TapUnwarpTransaction.js +201 -0
  219. package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +34 -0
  220. package/build/transaction/builders/UnwarpSegwitTransaction.js +184 -0
  221. package/build/transaction/builders/UnwarpTransaction.d.ts +35 -0
  222. package/build/transaction/builders/UnwarpTransaction.js +199 -0
  223. package/build/transaction/interfaces/ITransactions.d.ts +32 -0
  224. package/build/transaction/interfaces/ITransactions.js +1 -0
  225. package/build/utxo/IUTXO.d.ts +0 -0
  226. package/build/utxo/IUTXO.js +1 -0
  227. package/build/utxo/OPNetUtils.d.ts +7 -0
  228. package/build/utxo/OPNetUtils.js +47 -0
  229. package/build/utxo/UTXOManager.d.ts +7 -0
  230. package/build/utxo/UTXOManager.js +47 -0
  231. package/build/wbtc/BroadcastResponse.d.ts +0 -0
  232. package/build/wbtc/BroadcastResponse.js +1 -0
  233. package/gulpfile.js +152 -152
  234. package/package.json +109 -109
  235. package/src/_version.ts +1 -1
  236. package/src/consensus/Consensus.ts +36 -36
  237. package/src/consensus/ConsensusConfig.ts +39 -39
  238. package/src/crypto/crypto-browser.js +75 -75
  239. package/src/generators/AddressGenerator.ts +24 -24
  240. package/src/generators/Features.ts +5 -5
  241. package/src/generators/Generator.ts +75 -75
  242. package/src/generators/builders/CalldataGenerator.ts +148 -148
  243. package/src/generators/builders/DeploymentGenerator.ts +66 -66
  244. package/src/index.ts +4 -4
  245. package/src/keypair/AddressVerificator.ts +40 -40
  246. package/src/keypair/EcKeyPair.ts +282 -282
  247. package/src/keypair/Wallet.ts +120 -97
  248. package/src/keypair/interfaces/IWallet.ts +19 -19
  249. package/src/metadata/ContractBaseMetadata.ts +23 -23
  250. package/src/metadata/contracts/wBTC.ts +60 -60
  251. package/src/metadata/tokens.ts +135 -135
  252. package/src/network/NetworkInformation.ts +7 -7
  253. package/src/transaction/TransactionFactory.ts +496 -496
  254. package/src/transaction/browser/BrowserSignerBase.ts +37 -37
  255. package/src/transaction/browser/Web3Provider.ts +46 -46
  256. package/src/transaction/browser/extensions/UnisatSigner.ts +218 -218
  257. package/src/transaction/browser/types/Unisat.ts +97 -97
  258. package/src/transaction/builders/FundingTransaction.ts +40 -40
  259. package/src/transaction/builders/InteractionTransaction.ts +38 -38
  260. package/src/transaction/builders/SharedInteractionTransaction.ts +368 -368
  261. package/src/transaction/builders/TransactionBuilder.ts +665 -665
  262. package/src/transaction/builders/UnwrapSegwitTransaction.ts +365 -365
  263. package/src/transaction/builders/UnwrapTransaction.ts +507 -507
  264. package/src/transaction/builders/WrapTransaction.ts +346 -346
  265. package/src/transaction/interfaces/ITransactionParameters.ts +59 -59
  266. package/src/transaction/interfaces/Tap.ts +26 -26
  267. package/src/transaction/psbt/PSBTTypes.ts +3 -3
  268. package/src/transaction/shared/TweakedTransaction.ts +539 -539
  269. package/src/utxo/OPNetLimitedProvider.ts +244 -244
  270. package/src/utxo/interfaces/BroadcastResponse.ts +10 -10
  271. package/src/utxo/interfaces/IUTXO.ts +29 -29
  272. package/src/verification/TapscriptVerificator.ts +89 -89
  273. package/src/wbtc/Generate.ts +40 -40
  274. package/src/wbtc/UnwrapGeneration.ts +13 -13
  275. package/src/wbtc/WrappedGenerationParameters.ts +33 -33
  276. package/webpack.config.js +78 -78
  277. /package/build/generators/builders/{MultiSignGenerator.d.ts → MultisignGenerator.d.ts} +0 -0
  278. /package/build/generators/builders/{MultiSignGenerator.js → MultisignGenerator.js} +0 -0
  279. /package/build/generators/{Features.d.ts → features.d.ts} +0 -0
  280. /package/build/generators/{Features.js → features.js} +0 -0
@@ -1,346 +1,346 @@
1
- import { Taptree } from 'bitcoinjs-lib/src/types.js';
2
- import { TransactionType } from '../enums/TransactionType.js';
3
- import { PsbtOutputExtendedAddress, TapLeafScript } from '../interfaces/Tap.js';
4
- import { IWrapParameters } from '../interfaces/ITransactionParameters.js';
5
- import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
6
- import { wBTC } from '../../metadata/contracts/wBTC.js';
7
- import { ABICoder, Address, BinaryWriter, Selector } from '@btc-vision/bsi-binary';
8
- import { TransactionBuilder } from './TransactionBuilder.js';
9
- import { ECPairInterface } from 'ecpair';
10
- import { WrappedGeneration } from '../../wbtc/WrappedGenerationParameters.js';
11
- import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
12
- import { AddressVerificator } from '../../keypair/AddressVerificator.js';
13
- import { Network } from 'bitcoinjs-lib';
14
- import { P2TR_MS } from '../shared/P2TR_MS.js';
15
- import { currentConsensusConfig } from '../../consensus/ConsensusConfig.js';
16
-
17
- const abiCoder: ABICoder = new ABICoder();
18
-
19
- /**
20
- * Wrapped Bitcoin transaction wrap interaction
21
- * @class InteractionTransaction
22
- */
23
- export class WrapTransaction extends SharedInteractionTransaction<TransactionType.WBTC_WRAP> {
24
- private static readonly WRAP_SELECTOR: Selector = Number(
25
- '0x' + abiCoder.encodeSelector('mint'),
26
- );
27
-
28
- public type: TransactionType.WBTC_WRAP = TransactionType.WBTC_WRAP;
29
-
30
- /**
31
- * The vault address
32
- * @private
33
- * @readonly
34
- */
35
- public readonly vault: Address;
36
-
37
- /**
38
- * The amount to wrap
39
- * @private
40
- */
41
- public readonly amount: bigint;
42
-
43
- /**
44
- * The receiver of the wrapped tokens
45
- * @private
46
- */
47
- public readonly receiver: Address;
48
-
49
- /**
50
- * The compiled target script
51
- * @protected
52
- */
53
- protected readonly compiledTargetScript: Buffer;
54
-
55
- /**
56
- * Tap tree for the interaction
57
- * @protected
58
- */
59
- protected readonly scriptTree: Taptree;
60
-
61
- /**
62
- * Tap leaf script
63
- * @protected
64
- */
65
- protected tapLeafScript: TapLeafScript | null = null;
66
-
67
- /**
68
- * Contract secret for the interaction
69
- * @protected
70
- */
71
- protected readonly contractSecret: Buffer;
72
- /**
73
- * Public keys specified in the interaction
74
- * @protected
75
- */
76
- protected readonly interactionPubKeys: Buffer[] = [];
77
- /**
78
- * Minimum signatures required for the interaction
79
- * @protected
80
- */
81
- protected readonly minimumSignatures: number = 0;
82
- /**
83
- * The wBTC contract
84
- * @private
85
- */
86
- private readonly wbtc: wBTC;
87
-
88
- public constructor(parameters: IWrapParameters) {
89
- if (parameters.amount < currentConsensusConfig.VAULT_MINIMUM_AMOUNT) {
90
- throw new Error(
91
- `Amount is below the minimum required of ${currentConsensusConfig.VAULT_MINIMUM_AMOUNT} sat.`,
92
- );
93
- }
94
-
95
- const receiver: Address =
96
- parameters.receiver ||
97
- TransactionBuilder.getFrom(
98
- parameters.from,
99
- parameters.signer as ECPairInterface,
100
- parameters.network,
101
- );
102
-
103
- parameters.calldata = WrapTransaction.generateMintCalldata(
104
- parameters.amount,
105
- receiver,
106
- parameters.network,
107
- );
108
-
109
- super(parameters);
110
-
111
- this.wbtc = new wBTC(parameters.network, parameters.chainId);
112
- this.vault = parameters.generationParameters.vault;
113
-
114
- this.to = this.wbtc.getAddress();
115
- this.receiver = receiver;
116
- this.amount = parameters.amount;
117
-
118
- this.verifyRequiredValue();
119
-
120
- this.interactionPubKeys = parameters.generationParameters.pubKeys;
121
- this.minimumSignatures = parameters.generationParameters.constraints.minimum;
122
- this.contractSecret = this.generateSecret();
123
-
124
- if (!this.verifyPublicKeysConstraints(parameters.generationParameters)) {
125
- throw new Error(
126
- 'Oops. Your wrapping request have been decline! It failed security checks!',
127
- );
128
- }
129
-
130
- this.compiledTargetScript = this.calldataGenerator.compile(
131
- this.calldata,
132
- this.contractSecret,
133
- [],
134
- this.interactionPubKeys,
135
- this.minimumSignatures,
136
- );
137
-
138
- this.scriptTree = this.getScriptTree();
139
- this.internalInit();
140
- }
141
-
142
- /**
143
- * Generate a valid wBTC calldata
144
- * @param {bigint} amount - The amount to wrap
145
- * @param {Address} to - The address to send the wrapped tokens to
146
- * @param {Network} network - The network to use
147
- * @private
148
- * @returns {Buffer} - The calldata
149
- */
150
- private static generateMintCalldata(amount: bigint, to: Address, network: Network): Buffer {
151
- if (!amount) throw new Error('Amount is required');
152
- if (!to) throw new Error('To address is required');
153
-
154
- if (!AddressVerificator.isValidP2TRAddress(to, network)) {
155
- throw new Error(
156
- `Oops! The address ${to} is not a valid P2TR address! If you wrap at this address, your funds will be lost!`,
157
- );
158
- }
159
-
160
- const bufWriter: BinaryWriter = new BinaryWriter();
161
- bufWriter.writeSelector(WrapTransaction.WRAP_SELECTOR);
162
- bufWriter.writeAddress(to);
163
- bufWriter.writeU256(amount);
164
-
165
- return Buffer.from(bufWriter.getBuffer());
166
- }
167
-
168
- /**
169
- * Verify the data integrity received by the client.
170
- * @param {WrappedGeneration} generation - The generation parameters
171
- * @returns {boolean} - True if the data is valid
172
- * @throws {Error} - If the data is invalid
173
- */
174
- public verifyPublicKeysConstraints(generation: WrappedGeneration): boolean {
175
- if (generation.constraints.minimum < 2) {
176
- throw new Error('Minimum signatures must be at least 2');
177
- }
178
-
179
- if (
180
- generation.keys.length < generation.constraints.transactionMinimum ||
181
- generation.keys.length < generation.constraints.minimum
182
- ) {
183
- throw new Error('Not enough pub keys');
184
- }
185
-
186
- if (generation.keys.length > 255) {
187
- throw new Error('Too many pub keys');
188
- }
189
-
190
- const generatedVault: string = this.generateVaultAddress(
191
- generation.pubKeys,
192
- generation.constraints.minimum,
193
- );
194
- if (generatedVault !== generation.vault) {
195
- throw new Error(
196
- `Invalid vault address. Expected: ${generatedVault} Got: ${generation.vault}`,
197
- );
198
- }
199
-
200
- const passChecksum: Buffer = this.generateChecksumSalt(
201
- generation,
202
- this.amount,
203
- generation.vault,
204
- );
205
-
206
- const checksum: string = BitcoinUtils.opnetHash(passChecksum);
207
- if (checksum !== generation.signature) {
208
- throw new Error(`Invalid checksum. Expected: ${checksum} Got: ${generation.signature}`);
209
- }
210
-
211
- return true;
212
- }
213
-
214
- /**
215
- * Build the transaction
216
- * @protected
217
- *
218
- * @throws {Error} If the leftover funds script redeem is required
219
- * @throws {Error} If the leftover funds script redeem version is required
220
- * @throws {Error} If the leftover funds script redeem output is required
221
- * @throws {Error} If the to address is required
222
- */
223
- protected override async buildTransaction(): Promise<void> {
224
- if (!this.to) throw new Error('To address is required');
225
-
226
- const selectedRedeem = !!this.scriptSigner
227
- ? this.targetScriptRedeem
228
- : this.leftOverFundsScriptRedeem;
229
-
230
- if (!selectedRedeem) {
231
- throw new Error('Left over funds script redeem is required');
232
- }
233
-
234
- if (!selectedRedeem.redeemVersion) {
235
- throw new Error('Left over funds script redeem version is required');
236
- }
237
-
238
- if (!selectedRedeem.output) {
239
- throw new Error('Left over funds script redeem output is required');
240
- }
241
-
242
- this.tapLeafScript = {
243
- leafVersion: selectedRedeem.redeemVersion,
244
- script: selectedRedeem.output,
245
- controlBlock: this.getWitness(),
246
- };
247
-
248
- this.addInputsFromUTXO();
249
-
250
- const amountSpent: bigint = this.getTransactionOPNetFee();
251
- this.addOutput({
252
- value: Number(amountSpent),
253
- address: this.to,
254
- });
255
-
256
- this.addVaultOutput();
257
- await this.addRefundOutput(
258
- amountSpent +
259
- this.amount +
260
- currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT,
261
- );
262
- }
263
-
264
- /**
265
- * Verify if the required value is available
266
- * @private
267
- */
268
- private verifyRequiredValue(): void {
269
- if (this.totalInputAmount < this.amount) {
270
- throw new Error(
271
- `Not enough funds to wrap the amount specified. ${this.totalInputAmount} < ${this.amount}`,
272
- );
273
- }
274
-
275
- const valueToVault: bigint =
276
- this.amount +
277
- currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT +
278
- this.priorityFee;
279
-
280
- if (this.totalInputAmount < valueToVault) {
281
- throw new Error(
282
- `Not enough funds to wrap the amount specified. ${this.totalInputAmount} < ${valueToVault}. Make sure that your inputs cover the amount to wrap, the priority fee and the unwrap prepaid fees.`,
283
- );
284
- }
285
- }
286
-
287
- /**
288
- * Add the vault output
289
- * @private
290
- * @throws {Error} If no vault address is provided
291
- * @throws {Error} If the amount is not a number
292
- */
293
- private addVaultOutput(): void {
294
- if (!this.vault) {
295
- throw new Error(`No vault address provided`);
296
- }
297
-
298
- const valueToSend: bigint =
299
- this.amount + currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
300
-
301
- const amountOutput: PsbtOutputExtendedAddress = {
302
- address: this.vault,
303
- value: Number(valueToSend),
304
- };
305
-
306
- this.addOutput(amountOutput);
307
- }
308
-
309
- /**
310
- * Generate a vault address
311
- * @param {Buffer[]} keys
312
- * @param {number} minimumSignatureRequired
313
- * @private
314
- * @returns {string}
315
- */
316
- private generateVaultAddress(keys: Buffer[], minimumSignatureRequired: number): string {
317
- return P2TR_MS.generateMultiSigAddress(keys, minimumSignatureRequired, this.network);
318
- }
319
-
320
- /**
321
- * Generate a wrapped checksum hash
322
- * @param {WrappedGeneration} param
323
- * @param {bigint} amount
324
- * @param {string} vault
325
- * @private
326
- * @returns {Buffer}
327
- */
328
- private generateChecksumSalt(param: WrappedGeneration, amount: bigint, vault: string): Buffer {
329
- const version: string = param.constraints.version;
330
- const timestamp: number = param.constraints.timestamp;
331
-
332
- const params: Buffer = Buffer.alloc(12 + version.length);
333
- params.writeBigInt64BE(BigInt(timestamp), 0);
334
- params.writeInt16BE(param.constraints.minimum, 8);
335
- params.writeInt16BE(param.constraints.transactionMinimum, 10);
336
- params.write(version, 12, version.length, 'utf-8');
337
-
338
- return Buffer.concat([
339
- ...param.pubKeys,
340
- ...param.entities.map((entity: string) => Buffer.from(entity, 'utf-8')),
341
- params,
342
- Buffer.from(amount.toString(), 'utf-8'),
343
- Buffer.from(vault, 'utf-8'),
344
- ]);
345
- }
346
- }
1
+ import { Taptree } from 'bitcoinjs-lib/src/types.js';
2
+ import { TransactionType } from '../enums/TransactionType.js';
3
+ import { PsbtOutputExtendedAddress, TapLeafScript } from '../interfaces/Tap.js';
4
+ import { IWrapParameters } from '../interfaces/ITransactionParameters.js';
5
+ import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
6
+ import { wBTC } from '../../metadata/contracts/wBTC.js';
7
+ import { ABICoder, Address, BinaryWriter, Selector } from '@btc-vision/bsi-binary';
8
+ import { TransactionBuilder } from './TransactionBuilder.js';
9
+ import { ECPairInterface } from 'ecpair';
10
+ import { WrappedGeneration } from '../../wbtc/WrappedGenerationParameters.js';
11
+ import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
12
+ import { AddressVerificator } from '../../keypair/AddressVerificator.js';
13
+ import { Network } from 'bitcoinjs-lib';
14
+ import { P2TR_MS } from '../shared/P2TR_MS.js';
15
+ import { currentConsensusConfig } from '../../consensus/ConsensusConfig.js';
16
+
17
+ const abiCoder: ABICoder = new ABICoder();
18
+
19
+ /**
20
+ * Wrapped Bitcoin transaction wrap interaction
21
+ * @class InteractionTransaction
22
+ */
23
+ export class WrapTransaction extends SharedInteractionTransaction<TransactionType.WBTC_WRAP> {
24
+ private static readonly WRAP_SELECTOR: Selector = Number(
25
+ '0x' + abiCoder.encodeSelector('mint'),
26
+ );
27
+
28
+ public type: TransactionType.WBTC_WRAP = TransactionType.WBTC_WRAP;
29
+
30
+ /**
31
+ * The vault address
32
+ * @private
33
+ * @readonly
34
+ */
35
+ public readonly vault: Address;
36
+
37
+ /**
38
+ * The amount to wrap
39
+ * @private
40
+ */
41
+ public readonly amount: bigint;
42
+
43
+ /**
44
+ * The receiver of the wrapped tokens
45
+ * @private
46
+ */
47
+ public readonly receiver: Address;
48
+
49
+ /**
50
+ * The compiled target script
51
+ * @protected
52
+ */
53
+ protected readonly compiledTargetScript: Buffer;
54
+
55
+ /**
56
+ * Tap tree for the interaction
57
+ * @protected
58
+ */
59
+ protected readonly scriptTree: Taptree;
60
+
61
+ /**
62
+ * Tap leaf script
63
+ * @protected
64
+ */
65
+ protected tapLeafScript: TapLeafScript | null = null;
66
+
67
+ /**
68
+ * Contract secret for the interaction
69
+ * @protected
70
+ */
71
+ protected readonly contractSecret: Buffer;
72
+ /**
73
+ * Public keys specified in the interaction
74
+ * @protected
75
+ */
76
+ protected readonly interactionPubKeys: Buffer[] = [];
77
+ /**
78
+ * Minimum signatures required for the interaction
79
+ * @protected
80
+ */
81
+ protected readonly minimumSignatures: number = 0;
82
+ /**
83
+ * The wBTC contract
84
+ * @private
85
+ */
86
+ private readonly wbtc: wBTC;
87
+
88
+ public constructor(parameters: IWrapParameters) {
89
+ if (parameters.amount < currentConsensusConfig.VAULT_MINIMUM_AMOUNT) {
90
+ throw new Error(
91
+ `Amount is below the minimum required of ${currentConsensusConfig.VAULT_MINIMUM_AMOUNT} sat.`,
92
+ );
93
+ }
94
+
95
+ const receiver: Address =
96
+ parameters.receiver ||
97
+ TransactionBuilder.getFrom(
98
+ parameters.from,
99
+ parameters.signer as ECPairInterface,
100
+ parameters.network,
101
+ );
102
+
103
+ parameters.calldata = WrapTransaction.generateMintCalldata(
104
+ parameters.amount,
105
+ receiver,
106
+ parameters.network,
107
+ );
108
+
109
+ super(parameters);
110
+
111
+ this.wbtc = new wBTC(parameters.network, parameters.chainId);
112
+ this.vault = parameters.generationParameters.vault;
113
+
114
+ this.to = this.wbtc.getAddress();
115
+ this.receiver = receiver;
116
+ this.amount = parameters.amount;
117
+
118
+ this.verifyRequiredValue();
119
+
120
+ this.interactionPubKeys = parameters.generationParameters.pubKeys;
121
+ this.minimumSignatures = parameters.generationParameters.constraints.minimum;
122
+ this.contractSecret = this.generateSecret();
123
+
124
+ if (!this.verifyPublicKeysConstraints(parameters.generationParameters)) {
125
+ throw new Error(
126
+ 'Oops. Your wrapping request have been decline! It failed security checks!',
127
+ );
128
+ }
129
+
130
+ this.compiledTargetScript = this.calldataGenerator.compile(
131
+ this.calldata,
132
+ this.contractSecret,
133
+ [],
134
+ this.interactionPubKeys,
135
+ this.minimumSignatures,
136
+ );
137
+
138
+ this.scriptTree = this.getScriptTree();
139
+ this.internalInit();
140
+ }
141
+
142
+ /**
143
+ * Generate a valid wBTC calldata
144
+ * @param {bigint} amount - The amount to wrap
145
+ * @param {Address} to - The address to send the wrapped tokens to
146
+ * @param {Network} network - The network to use
147
+ * @private
148
+ * @returns {Buffer} - The calldata
149
+ */
150
+ private static generateMintCalldata(amount: bigint, to: Address, network: Network): Buffer {
151
+ if (!amount) throw new Error('Amount is required');
152
+ if (!to) throw new Error('To address is required');
153
+
154
+ if (!AddressVerificator.isValidP2TRAddress(to, network)) {
155
+ throw new Error(
156
+ `Oops! The address ${to} is not a valid P2TR address! If you wrap at this address, your funds will be lost!`,
157
+ );
158
+ }
159
+
160
+ const bufWriter: BinaryWriter = new BinaryWriter();
161
+ bufWriter.writeSelector(WrapTransaction.WRAP_SELECTOR);
162
+ bufWriter.writeAddress(to);
163
+ bufWriter.writeU256(amount);
164
+
165
+ return Buffer.from(bufWriter.getBuffer());
166
+ }
167
+
168
+ /**
169
+ * Verify the data integrity received by the client.
170
+ * @param {WrappedGeneration} generation - The generation parameters
171
+ * @returns {boolean} - True if the data is valid
172
+ * @throws {Error} - If the data is invalid
173
+ */
174
+ public verifyPublicKeysConstraints(generation: WrappedGeneration): boolean {
175
+ if (generation.constraints.minimum < 2) {
176
+ throw new Error('Minimum signatures must be at least 2');
177
+ }
178
+
179
+ if (
180
+ generation.keys.length < generation.constraints.transactionMinimum ||
181
+ generation.keys.length < generation.constraints.minimum
182
+ ) {
183
+ throw new Error('Not enough pub keys');
184
+ }
185
+
186
+ if (generation.keys.length > 255) {
187
+ throw new Error('Too many pub keys');
188
+ }
189
+
190
+ const generatedVault: string = this.generateVaultAddress(
191
+ generation.pubKeys,
192
+ generation.constraints.minimum,
193
+ );
194
+ if (generatedVault !== generation.vault) {
195
+ throw new Error(
196
+ `Invalid vault address. Expected: ${generatedVault} Got: ${generation.vault}`,
197
+ );
198
+ }
199
+
200
+ const passChecksum: Buffer = this.generateChecksumSalt(
201
+ generation,
202
+ this.amount,
203
+ generation.vault,
204
+ );
205
+
206
+ const checksum: string = BitcoinUtils.opnetHash(passChecksum);
207
+ if (checksum !== generation.signature) {
208
+ throw new Error(`Invalid checksum. Expected: ${checksum} Got: ${generation.signature}`);
209
+ }
210
+
211
+ return true;
212
+ }
213
+
214
+ /**
215
+ * Build the transaction
216
+ * @protected
217
+ *
218
+ * @throws {Error} If the leftover funds script redeem is required
219
+ * @throws {Error} If the leftover funds script redeem version is required
220
+ * @throws {Error} If the leftover funds script redeem output is required
221
+ * @throws {Error} If the to address is required
222
+ */
223
+ protected override async buildTransaction(): Promise<void> {
224
+ if (!this.to) throw new Error('To address is required');
225
+
226
+ const selectedRedeem = !!this.scriptSigner
227
+ ? this.targetScriptRedeem
228
+ : this.leftOverFundsScriptRedeem;
229
+
230
+ if (!selectedRedeem) {
231
+ throw new Error('Left over funds script redeem is required');
232
+ }
233
+
234
+ if (!selectedRedeem.redeemVersion) {
235
+ throw new Error('Left over funds script redeem version is required');
236
+ }
237
+
238
+ if (!selectedRedeem.output) {
239
+ throw new Error('Left over funds script redeem output is required');
240
+ }
241
+
242
+ this.tapLeafScript = {
243
+ leafVersion: selectedRedeem.redeemVersion,
244
+ script: selectedRedeem.output,
245
+ controlBlock: this.getWitness(),
246
+ };
247
+
248
+ this.addInputsFromUTXO();
249
+
250
+ const amountSpent: bigint = this.getTransactionOPNetFee();
251
+ this.addOutput({
252
+ value: Number(amountSpent),
253
+ address: this.to,
254
+ });
255
+
256
+ this.addVaultOutput();
257
+ await this.addRefundOutput(
258
+ amountSpent +
259
+ this.amount +
260
+ currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT,
261
+ );
262
+ }
263
+
264
+ /**
265
+ * Verify if the required value is available
266
+ * @private
267
+ */
268
+ private verifyRequiredValue(): void {
269
+ if (this.totalInputAmount < this.amount) {
270
+ throw new Error(
271
+ `Not enough funds to wrap the amount specified. ${this.totalInputAmount} < ${this.amount}`,
272
+ );
273
+ }
274
+
275
+ const valueToVault: bigint =
276
+ this.amount +
277
+ currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT +
278
+ this.priorityFee;
279
+
280
+ if (this.totalInputAmount < valueToVault) {
281
+ throw new Error(
282
+ `Not enough funds to wrap the amount specified. ${this.totalInputAmount} < ${valueToVault}. Make sure that your inputs cover the amount to wrap, the priority fee and the unwrap prepaid fees.`,
283
+ );
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Add the vault output
289
+ * @private
290
+ * @throws {Error} If no vault address is provided
291
+ * @throws {Error} If the amount is not a number
292
+ */
293
+ private addVaultOutput(): void {
294
+ if (!this.vault) {
295
+ throw new Error(`No vault address provided`);
296
+ }
297
+
298
+ const valueToSend: bigint =
299
+ this.amount + currentConsensusConfig.UNWRAP_CONSOLIDATION_PREPAID_FEES_SAT;
300
+
301
+ const amountOutput: PsbtOutputExtendedAddress = {
302
+ address: this.vault,
303
+ value: Number(valueToSend),
304
+ };
305
+
306
+ this.addOutput(amountOutput);
307
+ }
308
+
309
+ /**
310
+ * Generate a vault address
311
+ * @param {Buffer[]} keys
312
+ * @param {number} minimumSignatureRequired
313
+ * @private
314
+ * @returns {string}
315
+ */
316
+ private generateVaultAddress(keys: Buffer[], minimumSignatureRequired: number): string {
317
+ return P2TR_MS.generateMultiSigAddress(keys, minimumSignatureRequired, this.network);
318
+ }
319
+
320
+ /**
321
+ * Generate a wrapped checksum hash
322
+ * @param {WrappedGeneration} param
323
+ * @param {bigint} amount
324
+ * @param {string} vault
325
+ * @private
326
+ * @returns {Buffer}
327
+ */
328
+ private generateChecksumSalt(param: WrappedGeneration, amount: bigint, vault: string): Buffer {
329
+ const version: string = param.constraints.version;
330
+ const timestamp: number = param.constraints.timestamp;
331
+
332
+ const params: Buffer = Buffer.alloc(12 + version.length);
333
+ params.writeBigInt64BE(BigInt(timestamp), 0);
334
+ params.writeInt16BE(param.constraints.minimum, 8);
335
+ params.writeInt16BE(param.constraints.transactionMinimum, 10);
336
+ params.write(version, 12, version.length, 'utf-8');
337
+
338
+ return Buffer.concat([
339
+ ...param.pubKeys,
340
+ ...param.entities.map((entity: string) => Buffer.from(entity, 'utf-8')),
341
+ params,
342
+ Buffer.from(amount.toString(), 'utf-8'),
343
+ Buffer.from(vault, 'utf-8'),
344
+ ]);
345
+ }
346
+ }