@btc-vision/transaction 1.8.6 → 1.8.7

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 (702) hide show
  1. package/browser/btc-vision-bitcoin.js +364 -364
  2. package/browser/index.js +1577 -1276
  3. package/browser/noble-curves.js +1072 -1173
  4. package/browser/noble-hashes.js +282 -261
  5. package/browser/rolldown-runtime.js +7 -7
  6. package/browser/src/_version.d.ts +1 -0
  7. package/browser/{abi → src/abi}/ABICoder.d.ts +0 -1
  8. package/browser/{abi → src/abi}/ABIDataTypes.d.ts +0 -1
  9. package/browser/{abi → src/abi}/AbiTypes.d.ts +0 -1
  10. package/browser/{abi → src/abi}/TupleUtils.d.ts +0 -1
  11. package/browser/{branded → src/branded}/Branded.d.ts +0 -1
  12. package/browser/{buffer → src/buffer}/BinaryReader.d.ts +0 -1
  13. package/browser/{buffer → src/buffer}/BinaryWriter.d.ts +0 -1
  14. package/browser/{bytecode → src/bytecode}/Compressor.d.ts +0 -1
  15. package/browser/{chain → src/chain}/ChainData.d.ts +1 -2
  16. package/browser/{consensus → src/consensus}/Consensus.d.ts +0 -1
  17. package/browser/{consensus → src/consensus}/ConsensusConfig.d.ts +0 -1
  18. package/browser/{consensus → src/consensus}/IConsensusConfig.d.ts +0 -1
  19. package/browser/{consensus → src/consensus}/metadata/RoswellConsensus.d.ts +0 -1
  20. package/browser/{crypto → src/crypto}/crypto.d.ts +1 -2
  21. package/browser/{deterministic → src/deterministic}/AddressMap.d.ts +0 -1
  22. package/browser/{deterministic → src/deterministic}/AddressSet.d.ts +0 -1
  23. package/browser/{deterministic → src/deterministic}/CustomMap.d.ts +0 -1
  24. package/browser/{deterministic → src/deterministic}/DeterministicMap.d.ts +0 -1
  25. package/browser/{deterministic → src/deterministic}/DeterministicSet.d.ts +0 -1
  26. package/browser/{deterministic → src/deterministic}/ExtendedAddressMap.d.ts +0 -1
  27. package/browser/{deterministic → src/deterministic}/FastMap.d.ts +0 -1
  28. package/browser/{ecc → src/ecc}/backend.d.ts +1 -2
  29. package/browser/{epoch → src/epoch}/ChallengeSolution.d.ts +0 -1
  30. package/browser/{epoch → src/epoch}/interfaces/IChallengeSolution.d.ts +0 -1
  31. package/browser/{epoch → src/epoch}/validator/EpochValidator.d.ts +0 -1
  32. package/browser/{event → src/event}/NetEvent.d.ts +0 -1
  33. package/browser/{generators → src/generators}/AddressGenerator.d.ts +1 -2
  34. package/browser/{generators → src/generators}/Features.d.ts +0 -1
  35. package/browser/{generators → src/generators}/Generator.d.ts +1 -2
  36. package/browser/{generators → src/generators}/MLDSAData.d.ts +1 -2
  37. package/browser/{generators → src/generators}/builders/CalldataGenerator.d.ts +1 -2
  38. package/browser/{generators → src/generators}/builders/CustomGenerator.d.ts +1 -2
  39. package/browser/{generators → src/generators}/builders/DeploymentGenerator.d.ts +1 -2
  40. package/browser/{generators → src/generators}/builders/HashCommitmentGenerator.d.ts +1 -2
  41. package/browser/{generators → src/generators}/builders/LegacyCalldataGenerator.d.ts +1 -2
  42. package/browser/{generators → src/generators}/builders/MultiSignGenerator.d.ts +1 -2
  43. package/browser/{generators → src/generators}/builders/P2WDAGenerator.d.ts +1 -2
  44. package/browser/{index.d.ts → src/index.d.ts} +0 -1
  45. package/browser/{keypair → src/keypair}/Address.d.ts +2 -3
  46. package/browser/{keypair → src/keypair}/AddressVerificator.d.ts +2 -3
  47. package/browser/{keypair → src/keypair}/EcKeyPair.d.ts +2 -3
  48. package/browser/{keypair → src/keypair}/MessageSigner.d.ts +2 -3
  49. package/browser/{keypair → src/keypair}/Secp256k1PointDeriver.d.ts +0 -1
  50. package/browser/{keypair → src/keypair}/Wallet.d.ts +2 -3
  51. package/browser/{keypair → src/keypair}/interfaces/IWallet.d.ts +0 -1
  52. package/browser/{metadata → src/metadata}/ContractBaseMetadata.d.ts +1 -2
  53. package/browser/{mnemonic → src/mnemonic}/BIPStandard.d.ts +0 -1
  54. package/browser/{mnemonic → src/mnemonic}/Mnemonic.d.ts +2 -3
  55. package/browser/{mnemonic → src/mnemonic}/MnemonicStrength.d.ts +0 -1
  56. package/browser/{network → src/network}/ChainId.d.ts +0 -1
  57. package/browser/{opnet.d.ts → src/opnet.d.ts} +2 -2
  58. package/browser/{p2wda → src/p2wda}/P2WDADetector.d.ts +1 -2
  59. package/browser/{polyfill → src/polyfill}/disposable.d.ts +0 -1
  60. package/browser/{signer → src/signer}/AddressRotation.d.ts +0 -1
  61. package/browser/{signer → src/signer}/IRotationSigner.d.ts +1 -2
  62. package/browser/{signer → src/signer}/ParallelSignerAdapter.d.ts +1 -2
  63. package/browser/{signer → src/signer}/SignerUtils.d.ts +1 -2
  64. package/browser/{signer → src/signer}/TweakedSigner.d.ts +1 -2
  65. package/browser/{transaction → src/transaction}/ContractAddress.d.ts +0 -1
  66. package/browser/{transaction → src/transaction}/TransactionFactory.d.ts +1 -2
  67. package/browser/{transaction → src/transaction}/browser/BrowserSignerBase.d.ts +1 -2
  68. package/browser/{transaction → src/transaction}/browser/WalletNetworks.d.ts +0 -1
  69. package/browser/{transaction → src/transaction}/browser/Web3Provider.d.ts +0 -1
  70. package/browser/{transaction → src/transaction}/browser/extensions/UnisatSigner.d.ts +1 -2
  71. package/browser/{transaction → src/transaction}/browser/extensions/XverseSigner.d.ts +1 -2
  72. package/browser/{transaction → src/transaction}/browser/types/OPWallet.d.ts +0 -1
  73. package/browser/{transaction → src/transaction}/browser/types/Unisat.d.ts +0 -1
  74. package/browser/{transaction → src/transaction}/browser/types/Xverse.d.ts +0 -1
  75. package/browser/{transaction → src/transaction}/builders/CancelTransaction.d.ts +1 -2
  76. package/browser/src/transaction/builders/ChallengeSolutionTransaction.d.ts +1 -0
  77. package/browser/{transaction → src/transaction}/builders/ConsolidatedInteractionTransaction.d.ts +0 -1
  78. package/browser/{transaction → src/transaction}/builders/CustomScriptTransaction.d.ts +1 -2
  79. package/browser/{transaction → src/transaction}/builders/DeploymentTransaction.d.ts +1 -2
  80. package/browser/{transaction → src/transaction}/builders/FundingTransaction.d.ts +1 -2
  81. package/browser/{transaction → src/transaction}/builders/InteractionTransaction.d.ts +1 -2
  82. package/browser/{transaction → src/transaction}/builders/InteractionTransactionP2WDA.d.ts +1 -2
  83. package/browser/{transaction → src/transaction}/builders/MultiSignTransaction.d.ts +1 -2
  84. package/browser/{transaction → src/transaction}/builders/SharedInteractionTransaction.d.ts +1 -2
  85. package/browser/{transaction → src/transaction}/builders/TransactionBuilder.d.ts +2 -2
  86. package/browser/{transaction → src/transaction}/enums/TransactionType.d.ts +0 -1
  87. package/browser/{transaction → src/transaction}/interfaces/ICancelTransactionParameters.d.ts +0 -1
  88. package/browser/{transaction → src/transaction}/interfaces/IConsolidatedTransactionParameters.d.ts +0 -1
  89. package/browser/{transaction → src/transaction}/interfaces/ICustomTransactionParameters.d.ts +1 -2
  90. package/browser/{transaction → src/transaction}/interfaces/ITransactionParameters.d.ts +1 -2
  91. package/browser/{transaction → src/transaction}/interfaces/ITransactionResponses.d.ts +0 -1
  92. package/browser/{transaction → src/transaction}/interfaces/ITweakedTransactionData.d.ts +2 -3
  93. package/browser/{transaction → src/transaction}/interfaces/IWeb3ProviderTypes.d.ts +1 -2
  94. package/browser/{transaction → src/transaction}/interfaces/Tap.d.ts +1 -2
  95. package/browser/src/transaction/mineable/CSVMultisigProvider.d.ts +102 -0
  96. package/browser/{transaction → src/transaction}/mineable/IP2WSHAddress.d.ts +0 -1
  97. package/browser/{transaction → src/transaction}/mineable/TimelockGenerator.d.ts +1 -2
  98. package/browser/{transaction → src/transaction}/offline/OfflineTransactionManager.d.ts +51 -2
  99. package/browser/{transaction → src/transaction}/offline/TransactionReconstructor.d.ts +2 -3
  100. package/browser/{transaction → src/transaction}/offline/TransactionSerializer.d.ts +0 -1
  101. package/browser/{transaction → src/transaction}/offline/TransactionStateCapture.d.ts +0 -1
  102. package/browser/{transaction → src/transaction}/offline/interfaces/ISerializableState.d.ts +10 -3
  103. package/browser/{transaction → src/transaction}/offline/interfaces/ITypeSpecificData.d.ts +0 -1
  104. package/browser/{transaction → src/transaction}/psbt/PSBTTypes.d.ts +0 -1
  105. package/browser/{transaction → src/transaction}/shared/P2MR_MS.d.ts +1 -2
  106. package/browser/{transaction → src/transaction}/shared/P2TR_MS.d.ts +1 -2
  107. package/browser/{transaction → src/transaction}/shared/TweakedTransaction.d.ts +21 -3
  108. package/browser/{transaction → src/transaction}/utils/WitnessUtils.d.ts +0 -1
  109. package/browser/{utils → src/utils}/BitcoinUtils.d.ts +0 -1
  110. package/browser/{utils → src/utils}/BufferHelper.d.ts +0 -1
  111. package/browser/{utils → src/utils}/StringToBuffer.d.ts +0 -1
  112. package/browser/{utils → src/utils}/lengths.d.ts +0 -1
  113. package/browser/{utils → src/utils}/types.d.ts +0 -1
  114. package/browser/{utxo → src/utxo}/OPNetLimitedProvider.d.ts +1 -2
  115. package/browser/{utxo → src/utxo}/interfaces/BroadcastResponse.d.ts +0 -1
  116. package/browser/{utxo → src/utxo}/interfaces/IUTXO.d.ts +0 -1
  117. package/browser/{verification → src/verification}/TapscriptVerificator.d.ts +1 -2
  118. package/browser/vendors.js +1397 -1397
  119. package/build/_version.d.ts +1 -2
  120. package/build/_version.js +1 -2
  121. package/build/abi/ABICoder.d.ts +0 -1
  122. package/build/abi/ABICoder.js +0 -1
  123. package/build/abi/ABIDataTypes.d.ts +0 -1
  124. package/build/abi/ABIDataTypes.js +0 -1
  125. package/build/abi/AbiTypes.d.ts +0 -1
  126. package/build/abi/AbiTypes.js +0 -1
  127. package/build/abi/TupleUtils.d.ts +0 -1
  128. package/build/abi/TupleUtils.js +0 -1
  129. package/build/branded/Branded.d.ts +0 -1
  130. package/build/branded/Branded.js +0 -1
  131. package/build/buffer/BinaryReader.d.ts +0 -1
  132. package/build/buffer/BinaryReader.js +0 -1
  133. package/build/buffer/BinaryWriter.d.ts +0 -1
  134. package/build/buffer/BinaryWriter.js +0 -1
  135. package/build/bytecode/Compressor.d.ts +0 -1
  136. package/build/bytecode/Compressor.js +0 -1
  137. package/build/chain/ChainData.d.ts +0 -1
  138. package/build/chain/ChainData.js +0 -1
  139. package/build/consensus/Consensus.d.ts +0 -1
  140. package/build/consensus/Consensus.js +0 -1
  141. package/build/consensus/ConsensusConfig.d.ts +0 -1
  142. package/build/consensus/ConsensusConfig.js +0 -1
  143. package/build/consensus/IConsensusConfig.d.ts +0 -1
  144. package/build/consensus/IConsensusConfig.js +0 -1
  145. package/build/consensus/metadata/RoswellConsensus.d.ts +0 -1
  146. package/build/consensus/metadata/RoswellConsensus.js +0 -1
  147. package/build/crypto/crypto.d.ts +0 -1
  148. package/build/crypto/crypto.js +0 -1
  149. package/build/deterministic/AddressMap.d.ts +0 -1
  150. package/build/deterministic/AddressMap.js +0 -1
  151. package/build/deterministic/AddressSet.d.ts +0 -1
  152. package/build/deterministic/AddressSet.js +0 -1
  153. package/build/deterministic/CustomMap.d.ts +0 -1
  154. package/build/deterministic/CustomMap.js +0 -1
  155. package/build/deterministic/DeterministicMap.d.ts +0 -1
  156. package/build/deterministic/DeterministicMap.js +0 -1
  157. package/build/deterministic/DeterministicSet.d.ts +0 -1
  158. package/build/deterministic/DeterministicSet.js +0 -1
  159. package/build/deterministic/ExtendedAddressMap.d.ts +0 -1
  160. package/build/deterministic/ExtendedAddressMap.js +0 -1
  161. package/build/deterministic/FastMap.d.ts +0 -1
  162. package/build/deterministic/FastMap.js +0 -1
  163. package/build/ecc/backend.d.ts +0 -1
  164. package/build/ecc/backend.js +0 -1
  165. package/build/epoch/ChallengeSolution.d.ts +0 -1
  166. package/build/epoch/ChallengeSolution.js +0 -1
  167. package/build/epoch/interfaces/IChallengeSolution.d.ts +0 -1
  168. package/build/epoch/interfaces/IChallengeSolution.js +0 -1
  169. package/build/epoch/validator/EpochValidator.d.ts +0 -1
  170. package/build/epoch/validator/EpochValidator.js +0 -1
  171. package/build/event/NetEvent.d.ts +0 -1
  172. package/build/event/NetEvent.js +0 -1
  173. package/build/generators/AddressGenerator.d.ts +0 -1
  174. package/build/generators/AddressGenerator.js +0 -1
  175. package/build/generators/Features.d.ts +0 -1
  176. package/build/generators/Features.js +0 -1
  177. package/build/generators/Generator.d.ts +0 -1
  178. package/build/generators/Generator.js +0 -1
  179. package/build/generators/MLDSAData.d.ts +0 -1
  180. package/build/generators/MLDSAData.js +0 -1
  181. package/build/generators/builders/CalldataGenerator.d.ts +0 -1
  182. package/build/generators/builders/CalldataGenerator.js +0 -1
  183. package/build/generators/builders/CustomGenerator.d.ts +0 -1
  184. package/build/generators/builders/CustomGenerator.js +0 -1
  185. package/build/generators/builders/DeploymentGenerator.d.ts +0 -1
  186. package/build/generators/builders/DeploymentGenerator.js +0 -1
  187. package/build/generators/builders/HashCommitmentGenerator.d.ts +0 -1
  188. package/build/generators/builders/HashCommitmentGenerator.js +0 -1
  189. package/build/generators/builders/LegacyCalldataGenerator.d.ts +0 -1
  190. package/build/generators/builders/LegacyCalldataGenerator.js +0 -1
  191. package/build/generators/builders/MultiSignGenerator.d.ts +0 -1
  192. package/build/generators/builders/MultiSignGenerator.js +0 -1
  193. package/build/generators/builders/P2WDAGenerator.d.ts +0 -1
  194. package/build/generators/builders/P2WDAGenerator.js +0 -1
  195. package/build/index.d.ts +0 -1
  196. package/build/index.js +0 -1
  197. package/build/keypair/Address.d.ts +0 -1
  198. package/build/keypair/Address.js +0 -1
  199. package/build/keypair/AddressVerificator.d.ts +0 -1
  200. package/build/keypair/AddressVerificator.js +0 -1
  201. package/build/keypair/EcKeyPair.d.ts +0 -1
  202. package/build/keypair/EcKeyPair.js +0 -1
  203. package/build/keypair/MessageSigner.d.ts +0 -1
  204. package/build/keypair/MessageSigner.js +0 -1
  205. package/build/keypair/Secp256k1PointDeriver.d.ts +0 -1
  206. package/build/keypair/Secp256k1PointDeriver.js +0 -1
  207. package/build/keypair/Wallet.d.ts +0 -1
  208. package/build/keypair/Wallet.js +0 -1
  209. package/build/keypair/interfaces/IWallet.d.ts +0 -1
  210. package/build/keypair/interfaces/IWallet.js +0 -1
  211. package/build/metadata/ContractBaseMetadata.d.ts +0 -1
  212. package/build/metadata/ContractBaseMetadata.js +0 -1
  213. package/build/mnemonic/BIPStandard.d.ts +0 -1
  214. package/build/mnemonic/BIPStandard.js +0 -1
  215. package/build/mnemonic/Mnemonic.d.ts +0 -1
  216. package/build/mnemonic/Mnemonic.js +0 -1
  217. package/build/mnemonic/MnemonicStrength.d.ts +0 -1
  218. package/build/mnemonic/MnemonicStrength.js +0 -1
  219. package/build/network/ChainId.d.ts +0 -1
  220. package/build/network/ChainId.js +0 -1
  221. package/build/opnet.d.ts +1 -1
  222. package/build/opnet.js +1 -1
  223. package/build/p2wda/P2WDADetector.d.ts +0 -1
  224. package/build/p2wda/P2WDADetector.js +0 -1
  225. package/build/polyfill/disposable.d.ts +0 -1
  226. package/build/polyfill/disposable.js +0 -1
  227. package/build/signer/AddressRotation.d.ts +0 -1
  228. package/build/signer/AddressRotation.js +0 -1
  229. package/build/signer/IRotationSigner.d.ts +0 -1
  230. package/build/signer/IRotationSigner.js +0 -1
  231. package/build/signer/ParallelSignerAdapter.d.ts +0 -1
  232. package/build/signer/ParallelSignerAdapter.js +0 -1
  233. package/build/signer/SignerUtils.d.ts +0 -1
  234. package/build/signer/SignerUtils.js +0 -1
  235. package/build/signer/TweakedSigner.d.ts +0 -1
  236. package/build/signer/TweakedSigner.js +0 -1
  237. package/build/transaction/ContractAddress.d.ts +0 -1
  238. package/build/transaction/ContractAddress.js +0 -1
  239. package/build/transaction/TransactionFactory.d.ts +0 -1
  240. package/build/transaction/TransactionFactory.js +1 -2
  241. package/build/transaction/browser/BrowserSignerBase.d.ts +0 -1
  242. package/build/transaction/browser/BrowserSignerBase.js +0 -1
  243. package/build/transaction/browser/WalletNetworks.d.ts +0 -1
  244. package/build/transaction/browser/WalletNetworks.js +0 -1
  245. package/build/transaction/browser/Web3Provider.d.ts +0 -1
  246. package/build/transaction/browser/Web3Provider.js +0 -1
  247. package/build/transaction/browser/extensions/UnisatSigner.d.ts +0 -1
  248. package/build/transaction/browser/extensions/UnisatSigner.js +0 -1
  249. package/build/transaction/browser/extensions/XverseSigner.d.ts +0 -1
  250. package/build/transaction/browser/extensions/XverseSigner.js +0 -1
  251. package/build/transaction/browser/types/OPWallet.d.ts +0 -1
  252. package/build/transaction/browser/types/OPWallet.js +0 -1
  253. package/build/transaction/browser/types/Unisat.d.ts +0 -1
  254. package/build/transaction/browser/types/Unisat.js +0 -1
  255. package/build/transaction/browser/types/Xverse.d.ts +0 -1
  256. package/build/transaction/browser/types/Xverse.js +0 -1
  257. package/build/transaction/builders/CancelTransaction.d.ts +0 -1
  258. package/build/transaction/builders/CancelTransaction.js +0 -1
  259. package/build/transaction/builders/ChallengeSolutionTransaction.d.ts +0 -1
  260. package/build/transaction/builders/ChallengeSolutionTransaction.js +0 -1
  261. package/build/transaction/builders/ConsolidatedInteractionTransaction.d.ts +0 -1
  262. package/build/transaction/builders/ConsolidatedInteractionTransaction.js +0 -1
  263. package/build/transaction/builders/CustomScriptTransaction.d.ts +0 -1
  264. package/build/transaction/builders/CustomScriptTransaction.js +0 -1
  265. package/build/transaction/builders/DeploymentTransaction.d.ts +0 -1
  266. package/build/transaction/builders/DeploymentTransaction.js +0 -1
  267. package/build/transaction/builders/FundingTransaction.d.ts +0 -1
  268. package/build/transaction/builders/FundingTransaction.js +17 -14
  269. package/build/transaction/builders/InteractionTransaction.d.ts +0 -1
  270. package/build/transaction/builders/InteractionTransaction.js +0 -1
  271. package/build/transaction/builders/InteractionTransactionP2WDA.d.ts +0 -1
  272. package/build/transaction/builders/InteractionTransactionP2WDA.js +0 -1
  273. package/build/transaction/builders/MultiSignTransaction.d.ts +0 -1
  274. package/build/transaction/builders/MultiSignTransaction.js +0 -1
  275. package/build/transaction/builders/SharedInteractionTransaction.d.ts +0 -1
  276. package/build/transaction/builders/SharedInteractionTransaction.js +0 -1
  277. package/build/transaction/builders/TransactionBuilder.d.ts +1 -1
  278. package/build/transaction/builders/TransactionBuilder.js +39 -8
  279. package/build/transaction/enums/TransactionType.d.ts +0 -1
  280. package/build/transaction/enums/TransactionType.js +0 -1
  281. package/build/transaction/interfaces/ICancelTransactionParameters.d.ts +0 -1
  282. package/build/transaction/interfaces/ICancelTransactionParameters.js +0 -1
  283. package/build/transaction/interfaces/IConsolidatedTransactionParameters.d.ts +0 -1
  284. package/build/transaction/interfaces/IConsolidatedTransactionParameters.js +0 -1
  285. package/build/transaction/interfaces/ICustomTransactionParameters.d.ts +0 -1
  286. package/build/transaction/interfaces/ICustomTransactionParameters.js +0 -1
  287. package/build/transaction/interfaces/ITransactionParameters.d.ts +0 -1
  288. package/build/transaction/interfaces/ITransactionParameters.js +0 -1
  289. package/build/transaction/interfaces/ITransactionResponses.d.ts +0 -1
  290. package/build/transaction/interfaces/ITransactionResponses.js +0 -1
  291. package/build/transaction/interfaces/ITweakedTransactionData.d.ts +0 -1
  292. package/build/transaction/interfaces/ITweakedTransactionData.js +0 -1
  293. package/build/transaction/interfaces/IWeb3ProviderTypes.d.ts +0 -1
  294. package/build/transaction/interfaces/IWeb3ProviderTypes.js +0 -1
  295. package/build/transaction/interfaces/Tap.d.ts +0 -1
  296. package/build/transaction/interfaces/Tap.js +0 -1
  297. package/build/transaction/mineable/CSVMultisigProvider.d.ts +102 -0
  298. package/build/transaction/mineable/CSVMultisigProvider.js +348 -0
  299. package/build/transaction/mineable/IP2WSHAddress.d.ts +0 -1
  300. package/build/transaction/mineable/IP2WSHAddress.js +0 -1
  301. package/build/transaction/mineable/TimelockGenerator.d.ts +0 -1
  302. package/build/transaction/mineable/TimelockGenerator.js +0 -1
  303. package/build/transaction/offline/OfflineTransactionManager.d.ts +50 -1
  304. package/build/transaction/offline/OfflineTransactionManager.js +142 -2
  305. package/build/transaction/offline/TransactionReconstructor.d.ts +0 -1
  306. package/build/transaction/offline/TransactionReconstructor.js +0 -1
  307. package/build/transaction/offline/TransactionSerializer.d.ts +0 -1
  308. package/build/transaction/offline/TransactionSerializer.js +9 -1
  309. package/build/transaction/offline/TransactionStateCapture.d.ts +0 -1
  310. package/build/transaction/offline/TransactionStateCapture.js +0 -1
  311. package/build/transaction/offline/interfaces/ISerializableState.d.ts +10 -3
  312. package/build/transaction/offline/interfaces/ISerializableState.js +3 -3
  313. package/build/transaction/offline/interfaces/ITypeSpecificData.d.ts +0 -1
  314. package/build/transaction/offline/interfaces/ITypeSpecificData.js +0 -1
  315. package/build/transaction/psbt/PSBTTypes.d.ts +0 -1
  316. package/build/transaction/psbt/PSBTTypes.js +0 -1
  317. package/build/transaction/shared/P2MR_MS.d.ts +0 -1
  318. package/build/transaction/shared/P2MR_MS.js +0 -1
  319. package/build/transaction/shared/P2TR_MS.d.ts +0 -1
  320. package/build/transaction/shared/P2TR_MS.js +0 -1
  321. package/build/transaction/shared/TweakedTransaction.d.ts +19 -1
  322. package/build/transaction/shared/TweakedTransaction.js +96 -12
  323. package/build/transaction/utils/WitnessUtils.d.ts +0 -1
  324. package/build/transaction/utils/WitnessUtils.js +0 -1
  325. package/build/utils/BitcoinUtils.d.ts +0 -1
  326. package/build/utils/BitcoinUtils.js +0 -1
  327. package/build/utils/BufferHelper.d.ts +0 -1
  328. package/build/utils/BufferHelper.js +0 -1
  329. package/build/utils/StringToBuffer.d.ts +0 -1
  330. package/build/utils/StringToBuffer.js +0 -1
  331. package/build/utils/lengths.d.ts +0 -1
  332. package/build/utils/lengths.js +0 -1
  333. package/build/utils/types.d.ts +0 -1
  334. package/build/utils/types.js +0 -1
  335. package/build/utxo/OPNetLimitedProvider.d.ts +0 -1
  336. package/build/utxo/OPNetLimitedProvider.js +0 -1
  337. package/build/utxo/interfaces/BroadcastResponse.d.ts +0 -1
  338. package/build/utxo/interfaces/BroadcastResponse.js +0 -1
  339. package/build/utxo/interfaces/IUTXO.d.ts +0 -1
  340. package/build/utxo/interfaces/IUTXO.js +0 -1
  341. package/build/verification/TapscriptVerificator.d.ts +0 -1
  342. package/build/verification/TapscriptVerificator.js +0 -1
  343. package/eslint.config.js +5 -0
  344. package/package.json +20 -17
  345. package/src/_version.ts +1 -1
  346. package/src/keypair/Address.ts +1 -1
  347. package/src/opnet.ts +1 -0
  348. package/src/transaction/TransactionFactory.ts +1 -1
  349. package/src/transaction/builders/FundingTransaction.ts +21 -16
  350. package/src/transaction/builders/TransactionBuilder.ts +56 -10
  351. package/src/transaction/mineable/CSVMultisigProvider.ts +465 -0
  352. package/src/transaction/offline/OfflineTransactionManager.ts +191 -1
  353. package/src/transaction/offline/TransactionSerializer.ts +11 -0
  354. package/src/transaction/offline/interfaces/ISerializableState.ts +10 -2
  355. package/src/transaction/shared/TweakedTransaction.ts +123 -10
  356. package/test/add-refund-output.test.ts +96 -11
  357. package/test/csv-multisig-offline-edges.test.ts +293 -0
  358. package/test/csv-multisig-offline.test.ts +202 -0
  359. package/test/csv-multisig-spend.test.ts +363 -0
  360. package/test/transaction-builders.test.ts +69 -3
  361. package/test/web3-provider-types.test.ts +349 -0
  362. package/test/zero-amount-funding.test.ts +311 -0
  363. package/tsconfig.base.json +2 -2
  364. package/tsconfig.build.json +4 -1
  365. package/tsconfig.build.tsbuildinfo +1 -0
  366. package/tsconfig.json +9 -3
  367. package/browser/_version.d.ts +0 -2
  368. package/browser/_version.d.ts.map +0 -1
  369. package/browser/abi/ABICoder.d.ts.map +0 -1
  370. package/browser/abi/ABIDataTypes.d.ts.map +0 -1
  371. package/browser/abi/AbiTypes.d.ts.map +0 -1
  372. package/browser/abi/TupleUtils.d.ts.map +0 -1
  373. package/browser/branded/Branded.d.ts.map +0 -1
  374. package/browser/buffer/BinaryReader.d.ts.map +0 -1
  375. package/browser/buffer/BinaryWriter.d.ts.map +0 -1
  376. package/browser/bytecode/Compressor.d.ts.map +0 -1
  377. package/browser/chain/ChainData.d.ts.map +0 -1
  378. package/browser/consensus/Consensus.d.ts.map +0 -1
  379. package/browser/consensus/ConsensusConfig.d.ts.map +0 -1
  380. package/browser/consensus/IConsensusConfig.d.ts.map +0 -1
  381. package/browser/consensus/metadata/RoswellConsensus.d.ts.map +0 -1
  382. package/browser/crypto/crypto.d.ts.map +0 -1
  383. package/browser/deterministic/AddressMap.d.ts.map +0 -1
  384. package/browser/deterministic/AddressSet.d.ts.map +0 -1
  385. package/browser/deterministic/CustomMap.d.ts.map +0 -1
  386. package/browser/deterministic/DeterministicMap.d.ts.map +0 -1
  387. package/browser/deterministic/DeterministicSet.d.ts.map +0 -1
  388. package/browser/deterministic/ExtendedAddressMap.d.ts.map +0 -1
  389. package/browser/deterministic/FastMap.d.ts.map +0 -1
  390. package/browser/ecc/backend.d.ts.map +0 -1
  391. package/browser/epoch/ChallengeSolution.d.ts.map +0 -1
  392. package/browser/epoch/interfaces/IChallengeSolution.d.ts.map +0 -1
  393. package/browser/epoch/validator/EpochValidator.d.ts.map +0 -1
  394. package/browser/event/NetEvent.d.ts.map +0 -1
  395. package/browser/generators/AddressGenerator.d.ts.map +0 -1
  396. package/browser/generators/Features.d.ts.map +0 -1
  397. package/browser/generators/Generator.d.ts.map +0 -1
  398. package/browser/generators/MLDSAData.d.ts.map +0 -1
  399. package/browser/generators/builders/CalldataGenerator.d.ts.map +0 -1
  400. package/browser/generators/builders/CustomGenerator.d.ts.map +0 -1
  401. package/browser/generators/builders/DeploymentGenerator.d.ts.map +0 -1
  402. package/browser/generators/builders/HashCommitmentGenerator.d.ts.map +0 -1
  403. package/browser/generators/builders/LegacyCalldataGenerator.d.ts.map +0 -1
  404. package/browser/generators/builders/MultiSignGenerator.d.ts.map +0 -1
  405. package/browser/generators/builders/P2WDAGenerator.d.ts.map +0 -1
  406. package/browser/index.d.ts.map +0 -1
  407. package/browser/keypair/Address.d.ts.map +0 -1
  408. package/browser/keypair/AddressVerificator.d.ts.map +0 -1
  409. package/browser/keypair/EcKeyPair.d.ts.map +0 -1
  410. package/browser/keypair/MessageSigner.d.ts.map +0 -1
  411. package/browser/keypair/Secp256k1PointDeriver.d.ts.map +0 -1
  412. package/browser/keypair/Wallet.d.ts.map +0 -1
  413. package/browser/keypair/interfaces/IWallet.d.ts.map +0 -1
  414. package/browser/metadata/ContractBaseMetadata.d.ts.map +0 -1
  415. package/browser/mnemonic/BIPStandard.d.ts.map +0 -1
  416. package/browser/mnemonic/Mnemonic.d.ts.map +0 -1
  417. package/browser/mnemonic/MnemonicStrength.d.ts.map +0 -1
  418. package/browser/network/ChainId.d.ts.map +0 -1
  419. package/browser/opnet.d.ts.map +0 -1
  420. package/browser/p2wda/P2WDADetector.d.ts.map +0 -1
  421. package/browser/polyfill/disposable.d.ts.map +0 -1
  422. package/browser/signer/AddressRotation.d.ts.map +0 -1
  423. package/browser/signer/IRotationSigner.d.ts.map +0 -1
  424. package/browser/signer/ParallelSignerAdapter.d.ts.map +0 -1
  425. package/browser/signer/SignerUtils.d.ts.map +0 -1
  426. package/browser/signer/TweakedSigner.d.ts.map +0 -1
  427. package/browser/transaction/ContractAddress.d.ts.map +0 -1
  428. package/browser/transaction/TransactionFactory.d.ts.map +0 -1
  429. package/browser/transaction/browser/BrowserSignerBase.d.ts.map +0 -1
  430. package/browser/transaction/browser/WalletNetworks.d.ts.map +0 -1
  431. package/browser/transaction/browser/Web3Provider.d.ts.map +0 -1
  432. package/browser/transaction/browser/extensions/UnisatSigner.d.ts.map +0 -1
  433. package/browser/transaction/browser/extensions/XverseSigner.d.ts.map +0 -1
  434. package/browser/transaction/browser/types/OPWallet.d.ts.map +0 -1
  435. package/browser/transaction/browser/types/Unisat.d.ts.map +0 -1
  436. package/browser/transaction/browser/types/Xverse.d.ts.map +0 -1
  437. package/browser/transaction/builders/CancelTransaction.d.ts.map +0 -1
  438. package/browser/transaction/builders/ChallengeSolutionTransaction.d.ts +0 -2
  439. package/browser/transaction/builders/ChallengeSolutionTransaction.d.ts.map +0 -1
  440. package/browser/transaction/builders/ConsolidatedInteractionTransaction.d.ts.map +0 -1
  441. package/browser/transaction/builders/CustomScriptTransaction.d.ts.map +0 -1
  442. package/browser/transaction/builders/DeploymentTransaction.d.ts.map +0 -1
  443. package/browser/transaction/builders/FundingTransaction.d.ts.map +0 -1
  444. package/browser/transaction/builders/InteractionTransaction.d.ts.map +0 -1
  445. package/browser/transaction/builders/InteractionTransactionP2WDA.d.ts.map +0 -1
  446. package/browser/transaction/builders/MultiSignTransaction.d.ts.map +0 -1
  447. package/browser/transaction/builders/SharedInteractionTransaction.d.ts.map +0 -1
  448. package/browser/transaction/builders/TransactionBuilder.d.ts.map +0 -1
  449. package/browser/transaction/enums/TransactionType.d.ts.map +0 -1
  450. package/browser/transaction/interfaces/ICancelTransactionParameters.d.ts.map +0 -1
  451. package/browser/transaction/interfaces/IConsolidatedTransactionParameters.d.ts.map +0 -1
  452. package/browser/transaction/interfaces/ICustomTransactionParameters.d.ts.map +0 -1
  453. package/browser/transaction/interfaces/ITransactionParameters.d.ts.map +0 -1
  454. package/browser/transaction/interfaces/ITransactionResponses.d.ts.map +0 -1
  455. package/browser/transaction/interfaces/ITweakedTransactionData.d.ts.map +0 -1
  456. package/browser/transaction/interfaces/IWeb3ProviderTypes.d.ts.map +0 -1
  457. package/browser/transaction/interfaces/Tap.d.ts.map +0 -1
  458. package/browser/transaction/mineable/IP2WSHAddress.d.ts.map +0 -1
  459. package/browser/transaction/mineable/TimelockGenerator.d.ts.map +0 -1
  460. package/browser/transaction/offline/OfflineTransactionManager.d.ts.map +0 -1
  461. package/browser/transaction/offline/TransactionReconstructor.d.ts.map +0 -1
  462. package/browser/transaction/offline/TransactionSerializer.d.ts.map +0 -1
  463. package/browser/transaction/offline/TransactionStateCapture.d.ts.map +0 -1
  464. package/browser/transaction/offline/interfaces/ISerializableState.d.ts.map +0 -1
  465. package/browser/transaction/offline/interfaces/ITypeSpecificData.d.ts.map +0 -1
  466. package/browser/transaction/psbt/PSBTTypes.d.ts.map +0 -1
  467. package/browser/transaction/shared/P2MR_MS.d.ts.map +0 -1
  468. package/browser/transaction/shared/P2TR_MS.d.ts.map +0 -1
  469. package/browser/transaction/shared/TweakedTransaction.d.ts.map +0 -1
  470. package/browser/transaction/utils/WitnessUtils.d.ts.map +0 -1
  471. package/browser/utils/BitcoinUtils.d.ts.map +0 -1
  472. package/browser/utils/BufferHelper.d.ts.map +0 -1
  473. package/browser/utils/StringToBuffer.d.ts.map +0 -1
  474. package/browser/utils/lengths.d.ts.map +0 -1
  475. package/browser/utils/types.d.ts.map +0 -1
  476. package/browser/utxo/OPNetLimitedProvider.d.ts.map +0 -1
  477. package/browser/utxo/interfaces/BroadcastResponse.d.ts.map +0 -1
  478. package/browser/utxo/interfaces/IUTXO.d.ts.map +0 -1
  479. package/browser/verification/TapscriptVerificator.d.ts.map +0 -1
  480. package/build/_version.d.ts.map +0 -1
  481. package/build/_version.js.map +0 -1
  482. package/build/abi/ABICoder.d.ts.map +0 -1
  483. package/build/abi/ABICoder.js.map +0 -1
  484. package/build/abi/ABIDataTypes.d.ts.map +0 -1
  485. package/build/abi/ABIDataTypes.js.map +0 -1
  486. package/build/abi/AbiTypes.d.ts.map +0 -1
  487. package/build/abi/AbiTypes.js.map +0 -1
  488. package/build/abi/TupleUtils.d.ts.map +0 -1
  489. package/build/abi/TupleUtils.js.map +0 -1
  490. package/build/branded/Branded.d.ts.map +0 -1
  491. package/build/branded/Branded.js.map +0 -1
  492. package/build/buffer/BinaryReader.d.ts.map +0 -1
  493. package/build/buffer/BinaryReader.js.map +0 -1
  494. package/build/buffer/BinaryWriter.d.ts.map +0 -1
  495. package/build/buffer/BinaryWriter.js.map +0 -1
  496. package/build/bytecode/Compressor.d.ts.map +0 -1
  497. package/build/bytecode/Compressor.js.map +0 -1
  498. package/build/chain/ChainData.d.ts.map +0 -1
  499. package/build/chain/ChainData.js.map +0 -1
  500. package/build/consensus/Consensus.d.ts.map +0 -1
  501. package/build/consensus/Consensus.js.map +0 -1
  502. package/build/consensus/ConsensusConfig.d.ts.map +0 -1
  503. package/build/consensus/ConsensusConfig.js.map +0 -1
  504. package/build/consensus/IConsensusConfig.d.ts.map +0 -1
  505. package/build/consensus/IConsensusConfig.js.map +0 -1
  506. package/build/consensus/metadata/RoswellConsensus.d.ts.map +0 -1
  507. package/build/consensus/metadata/RoswellConsensus.js.map +0 -1
  508. package/build/crypto/crypto.d.ts.map +0 -1
  509. package/build/crypto/crypto.js.map +0 -1
  510. package/build/deterministic/AddressMap.d.ts.map +0 -1
  511. package/build/deterministic/AddressMap.js.map +0 -1
  512. package/build/deterministic/AddressSet.d.ts.map +0 -1
  513. package/build/deterministic/AddressSet.js.map +0 -1
  514. package/build/deterministic/CustomMap.d.ts.map +0 -1
  515. package/build/deterministic/CustomMap.js.map +0 -1
  516. package/build/deterministic/DeterministicMap.d.ts.map +0 -1
  517. package/build/deterministic/DeterministicMap.js.map +0 -1
  518. package/build/deterministic/DeterministicSet.d.ts.map +0 -1
  519. package/build/deterministic/DeterministicSet.js.map +0 -1
  520. package/build/deterministic/ExtendedAddressMap.d.ts.map +0 -1
  521. package/build/deterministic/ExtendedAddressMap.js.map +0 -1
  522. package/build/deterministic/FastMap.d.ts.map +0 -1
  523. package/build/deterministic/FastMap.js.map +0 -1
  524. package/build/ecc/backend.d.ts.map +0 -1
  525. package/build/ecc/backend.js.map +0 -1
  526. package/build/epoch/ChallengeSolution.d.ts.map +0 -1
  527. package/build/epoch/ChallengeSolution.js.map +0 -1
  528. package/build/epoch/interfaces/IChallengeSolution.d.ts.map +0 -1
  529. package/build/epoch/interfaces/IChallengeSolution.js.map +0 -1
  530. package/build/epoch/validator/EpochValidator.d.ts.map +0 -1
  531. package/build/epoch/validator/EpochValidator.js.map +0 -1
  532. package/build/event/NetEvent.d.ts.map +0 -1
  533. package/build/event/NetEvent.js.map +0 -1
  534. package/build/generators/AddressGenerator.d.ts.map +0 -1
  535. package/build/generators/AddressGenerator.js.map +0 -1
  536. package/build/generators/Features.d.ts.map +0 -1
  537. package/build/generators/Features.js.map +0 -1
  538. package/build/generators/Generator.d.ts.map +0 -1
  539. package/build/generators/Generator.js.map +0 -1
  540. package/build/generators/MLDSAData.d.ts.map +0 -1
  541. package/build/generators/MLDSAData.js.map +0 -1
  542. package/build/generators/builders/CalldataGenerator.d.ts.map +0 -1
  543. package/build/generators/builders/CalldataGenerator.js.map +0 -1
  544. package/build/generators/builders/CustomGenerator.d.ts.map +0 -1
  545. package/build/generators/builders/CustomGenerator.js.map +0 -1
  546. package/build/generators/builders/DeploymentGenerator.d.ts.map +0 -1
  547. package/build/generators/builders/DeploymentGenerator.js.map +0 -1
  548. package/build/generators/builders/HashCommitmentGenerator.d.ts.map +0 -1
  549. package/build/generators/builders/HashCommitmentGenerator.js.map +0 -1
  550. package/build/generators/builders/LegacyCalldataGenerator.d.ts.map +0 -1
  551. package/build/generators/builders/LegacyCalldataGenerator.js.map +0 -1
  552. package/build/generators/builders/MultiSignGenerator.d.ts.map +0 -1
  553. package/build/generators/builders/MultiSignGenerator.js.map +0 -1
  554. package/build/generators/builders/P2WDAGenerator.d.ts.map +0 -1
  555. package/build/generators/builders/P2WDAGenerator.js.map +0 -1
  556. package/build/index.d.ts.map +0 -1
  557. package/build/index.js.map +0 -1
  558. package/build/keypair/Address.d.ts.map +0 -1
  559. package/build/keypair/Address.js.map +0 -1
  560. package/build/keypair/AddressVerificator.d.ts.map +0 -1
  561. package/build/keypair/AddressVerificator.js.map +0 -1
  562. package/build/keypair/EcKeyPair.d.ts.map +0 -1
  563. package/build/keypair/EcKeyPair.js.map +0 -1
  564. package/build/keypair/MessageSigner.d.ts.map +0 -1
  565. package/build/keypair/MessageSigner.js.map +0 -1
  566. package/build/keypair/Secp256k1PointDeriver.d.ts.map +0 -1
  567. package/build/keypair/Secp256k1PointDeriver.js.map +0 -1
  568. package/build/keypair/Wallet.d.ts.map +0 -1
  569. package/build/keypair/Wallet.js.map +0 -1
  570. package/build/keypair/interfaces/IWallet.d.ts.map +0 -1
  571. package/build/keypair/interfaces/IWallet.js.map +0 -1
  572. package/build/metadata/ContractBaseMetadata.d.ts.map +0 -1
  573. package/build/metadata/ContractBaseMetadata.js.map +0 -1
  574. package/build/mnemonic/BIPStandard.d.ts.map +0 -1
  575. package/build/mnemonic/BIPStandard.js.map +0 -1
  576. package/build/mnemonic/Mnemonic.d.ts.map +0 -1
  577. package/build/mnemonic/Mnemonic.js.map +0 -1
  578. package/build/mnemonic/MnemonicStrength.d.ts.map +0 -1
  579. package/build/mnemonic/MnemonicStrength.js.map +0 -1
  580. package/build/network/ChainId.d.ts.map +0 -1
  581. package/build/network/ChainId.js.map +0 -1
  582. package/build/opnet.d.ts.map +0 -1
  583. package/build/opnet.js.map +0 -1
  584. package/build/p2wda/P2WDADetector.d.ts.map +0 -1
  585. package/build/p2wda/P2WDADetector.js.map +0 -1
  586. package/build/polyfill/disposable.d.ts.map +0 -1
  587. package/build/polyfill/disposable.js.map +0 -1
  588. package/build/signer/AddressRotation.d.ts.map +0 -1
  589. package/build/signer/AddressRotation.js.map +0 -1
  590. package/build/signer/IRotationSigner.d.ts.map +0 -1
  591. package/build/signer/IRotationSigner.js.map +0 -1
  592. package/build/signer/ParallelSignerAdapter.d.ts.map +0 -1
  593. package/build/signer/ParallelSignerAdapter.js.map +0 -1
  594. package/build/signer/SignerUtils.d.ts.map +0 -1
  595. package/build/signer/SignerUtils.js.map +0 -1
  596. package/build/signer/TweakedSigner.d.ts.map +0 -1
  597. package/build/signer/TweakedSigner.js.map +0 -1
  598. package/build/transaction/ContractAddress.d.ts.map +0 -1
  599. package/build/transaction/ContractAddress.js.map +0 -1
  600. package/build/transaction/TransactionFactory.d.ts.map +0 -1
  601. package/build/transaction/TransactionFactory.js.map +0 -1
  602. package/build/transaction/browser/BrowserSignerBase.d.ts.map +0 -1
  603. package/build/transaction/browser/BrowserSignerBase.js.map +0 -1
  604. package/build/transaction/browser/WalletNetworks.d.ts.map +0 -1
  605. package/build/transaction/browser/WalletNetworks.js.map +0 -1
  606. package/build/transaction/browser/Web3Provider.d.ts.map +0 -1
  607. package/build/transaction/browser/Web3Provider.js.map +0 -1
  608. package/build/transaction/browser/extensions/UnisatSigner.d.ts.map +0 -1
  609. package/build/transaction/browser/extensions/UnisatSigner.js.map +0 -1
  610. package/build/transaction/browser/extensions/XverseSigner.d.ts.map +0 -1
  611. package/build/transaction/browser/extensions/XverseSigner.js.map +0 -1
  612. package/build/transaction/browser/types/OPWallet.d.ts.map +0 -1
  613. package/build/transaction/browser/types/OPWallet.js.map +0 -1
  614. package/build/transaction/browser/types/Unisat.d.ts.map +0 -1
  615. package/build/transaction/browser/types/Unisat.js.map +0 -1
  616. package/build/transaction/browser/types/Xverse.d.ts.map +0 -1
  617. package/build/transaction/browser/types/Xverse.js.map +0 -1
  618. package/build/transaction/builders/CancelTransaction.d.ts.map +0 -1
  619. package/build/transaction/builders/CancelTransaction.js.map +0 -1
  620. package/build/transaction/builders/ChallengeSolutionTransaction.d.ts.map +0 -1
  621. package/build/transaction/builders/ChallengeSolutionTransaction.js.map +0 -1
  622. package/build/transaction/builders/ConsolidatedInteractionTransaction.d.ts.map +0 -1
  623. package/build/transaction/builders/ConsolidatedInteractionTransaction.js.map +0 -1
  624. package/build/transaction/builders/CustomScriptTransaction.d.ts.map +0 -1
  625. package/build/transaction/builders/CustomScriptTransaction.js.map +0 -1
  626. package/build/transaction/builders/DeploymentTransaction.d.ts.map +0 -1
  627. package/build/transaction/builders/DeploymentTransaction.js.map +0 -1
  628. package/build/transaction/builders/FundingTransaction.d.ts.map +0 -1
  629. package/build/transaction/builders/FundingTransaction.js.map +0 -1
  630. package/build/transaction/builders/InteractionTransaction.d.ts.map +0 -1
  631. package/build/transaction/builders/InteractionTransaction.js.map +0 -1
  632. package/build/transaction/builders/InteractionTransactionP2WDA.d.ts.map +0 -1
  633. package/build/transaction/builders/InteractionTransactionP2WDA.js.map +0 -1
  634. package/build/transaction/builders/MultiSignTransaction.d.ts.map +0 -1
  635. package/build/transaction/builders/MultiSignTransaction.js.map +0 -1
  636. package/build/transaction/builders/SharedInteractionTransaction.d.ts.map +0 -1
  637. package/build/transaction/builders/SharedInteractionTransaction.js.map +0 -1
  638. package/build/transaction/builders/TransactionBuilder.d.ts.map +0 -1
  639. package/build/transaction/builders/TransactionBuilder.js.map +0 -1
  640. package/build/transaction/enums/TransactionType.d.ts.map +0 -1
  641. package/build/transaction/enums/TransactionType.js.map +0 -1
  642. package/build/transaction/interfaces/ICancelTransactionParameters.d.ts.map +0 -1
  643. package/build/transaction/interfaces/ICancelTransactionParameters.js.map +0 -1
  644. package/build/transaction/interfaces/IConsolidatedTransactionParameters.d.ts.map +0 -1
  645. package/build/transaction/interfaces/IConsolidatedTransactionParameters.js.map +0 -1
  646. package/build/transaction/interfaces/ICustomTransactionParameters.d.ts.map +0 -1
  647. package/build/transaction/interfaces/ICustomTransactionParameters.js.map +0 -1
  648. package/build/transaction/interfaces/ITransactionParameters.d.ts.map +0 -1
  649. package/build/transaction/interfaces/ITransactionParameters.js.map +0 -1
  650. package/build/transaction/interfaces/ITransactionResponses.d.ts.map +0 -1
  651. package/build/transaction/interfaces/ITransactionResponses.js.map +0 -1
  652. package/build/transaction/interfaces/ITweakedTransactionData.d.ts.map +0 -1
  653. package/build/transaction/interfaces/ITweakedTransactionData.js.map +0 -1
  654. package/build/transaction/interfaces/IWeb3ProviderTypes.d.ts.map +0 -1
  655. package/build/transaction/interfaces/IWeb3ProviderTypes.js.map +0 -1
  656. package/build/transaction/interfaces/Tap.d.ts.map +0 -1
  657. package/build/transaction/interfaces/Tap.js.map +0 -1
  658. package/build/transaction/mineable/IP2WSHAddress.d.ts.map +0 -1
  659. package/build/transaction/mineable/IP2WSHAddress.js.map +0 -1
  660. package/build/transaction/mineable/TimelockGenerator.d.ts.map +0 -1
  661. package/build/transaction/mineable/TimelockGenerator.js.map +0 -1
  662. package/build/transaction/offline/OfflineTransactionManager.d.ts.map +0 -1
  663. package/build/transaction/offline/OfflineTransactionManager.js.map +0 -1
  664. package/build/transaction/offline/TransactionReconstructor.d.ts.map +0 -1
  665. package/build/transaction/offline/TransactionReconstructor.js.map +0 -1
  666. package/build/transaction/offline/TransactionSerializer.d.ts.map +0 -1
  667. package/build/transaction/offline/TransactionSerializer.js.map +0 -1
  668. package/build/transaction/offline/TransactionStateCapture.d.ts.map +0 -1
  669. package/build/transaction/offline/TransactionStateCapture.js.map +0 -1
  670. package/build/transaction/offline/interfaces/ISerializableState.d.ts.map +0 -1
  671. package/build/transaction/offline/interfaces/ISerializableState.js.map +0 -1
  672. package/build/transaction/offline/interfaces/ITypeSpecificData.d.ts.map +0 -1
  673. package/build/transaction/offline/interfaces/ITypeSpecificData.js.map +0 -1
  674. package/build/transaction/psbt/PSBTTypes.d.ts.map +0 -1
  675. package/build/transaction/psbt/PSBTTypes.js.map +0 -1
  676. package/build/transaction/shared/P2MR_MS.d.ts.map +0 -1
  677. package/build/transaction/shared/P2MR_MS.js.map +0 -1
  678. package/build/transaction/shared/P2TR_MS.d.ts.map +0 -1
  679. package/build/transaction/shared/P2TR_MS.js.map +0 -1
  680. package/build/transaction/shared/TweakedTransaction.d.ts.map +0 -1
  681. package/build/transaction/shared/TweakedTransaction.js.map +0 -1
  682. package/build/transaction/utils/WitnessUtils.d.ts.map +0 -1
  683. package/build/transaction/utils/WitnessUtils.js.map +0 -1
  684. package/build/tsconfig.build.tsbuildinfo +0 -1
  685. package/build/utils/BitcoinUtils.d.ts.map +0 -1
  686. package/build/utils/BitcoinUtils.js.map +0 -1
  687. package/build/utils/BufferHelper.d.ts.map +0 -1
  688. package/build/utils/BufferHelper.js.map +0 -1
  689. package/build/utils/StringToBuffer.d.ts.map +0 -1
  690. package/build/utils/StringToBuffer.js.map +0 -1
  691. package/build/utils/lengths.d.ts.map +0 -1
  692. package/build/utils/lengths.js.map +0 -1
  693. package/build/utils/types.d.ts.map +0 -1
  694. package/build/utils/types.js.map +0 -1
  695. package/build/utxo/OPNetLimitedProvider.d.ts.map +0 -1
  696. package/build/utxo/OPNetLimitedProvider.js.map +0 -1
  697. package/build/utxo/interfaces/BroadcastResponse.d.ts.map +0 -1
  698. package/build/utxo/interfaces/BroadcastResponse.js.map +0 -1
  699. package/build/utxo/interfaces/IUTXO.d.ts.map +0 -1
  700. package/build/utxo/interfaces/IUTXO.js.map +0 -1
  701. package/build/verification/TapscriptVerificator.d.ts.map +0 -1
  702. package/build/verification/TapscriptVerificator.js.map +0 -1
@@ -3,9 +3,10 @@ import { ChainId } from '../../../network/ChainId.js';
3
3
  import type { TypeSpecificData } from './ITypeSpecificData.js';
4
4
 
5
5
  /**
6
- * Format version for serialization compatibility
6
+ * Format version for serialization compatibility.
7
+ * v2 adds the optional `partialPsbtBase64` field on the top-level state.
7
8
  */
8
- export const SERIALIZATION_FORMAT_VERSION = 1;
9
+ export const SERIALIZATION_FORMAT_VERSION = 2;
9
10
 
10
11
  /**
11
12
  * Magic byte for identifying serialized transaction state
@@ -138,4 +139,11 @@ export interface ISerializableTransactionState {
138
139
  readonly typeSpecificData: TypeSpecificData;
139
140
  /** Pre-computed data for deterministic rebuild */
140
141
  readonly precomputedData: PrecomputedData;
142
+ /**
143
+ * Partial PSBT (base64) carrying signatures collected so far.
144
+ * Used by collaborative flows like CSV multisig where multiple cosigners
145
+ * accumulate signatures across hops before finalization.
146
+ * Only present once at least one signing hop has run.
147
+ */
148
+ readonly partialPsbtBase64?: string;
141
149
  }
@@ -4,6 +4,7 @@ import {
4
4
  address as bitAddress,
5
5
  applySignaturesToPsbt,
6
6
  crypto as bitCrypto,
7
+ equals,
7
8
  fromHex,
8
9
  getFinalScripts,
9
10
  isP2A,
@@ -45,6 +46,10 @@ import { UnisatSigner } from '../browser/extensions/UnisatSigner.js';
45
46
  import { canSignNonTaprootInput, isTaprootInput, pubkeyInScript, } from '../../signer/SignerUtils.js';
46
47
  import { witnessStackToScriptWitness } from '../utils/WitnessUtils.js';
47
48
  import { P2WDADetector } from '../../p2wda/P2WDADetector.js';
49
+ import {
50
+ type CSVMultisigAddress,
51
+ CSVMultisigProvider,
52
+ } from '../mineable/CSVMultisigProvider.js';
48
53
  import type { QuantumBIP32Interface } from '@btc-vision/bip32';
49
54
  import { MessageSigner } from '../../keypair/MessageSigner.js';
50
55
  import { type RotationSigner, type SignerMap } from '../../signer/AddressRotation.js';
@@ -154,6 +159,13 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
154
159
  protected csvInputIndices: Set<number> = new Set();
155
160
  protected anchorInputIndices: Set<number> = new Set();
156
161
 
162
+ /**
163
+ * Track P2TR CSV multisig inputs together with the address descriptor needed
164
+ * to finalize them (tapscript + derived control block + parsed config).
165
+ * @protected
166
+ */
167
+ protected csvMultisigInputs: Map<number, CSVMultisigAddress> = new Map();
168
+
157
169
  protected regenerated: boolean = false;
158
170
  protected ignoreSignatureErrors: boolean = false;
159
171
  protected noSignatures: boolean = false;
@@ -391,6 +403,7 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
391
403
  delete this.tweakedSigner;
392
404
  this.csvInputIndices.clear();
393
405
  this.anchorInputIndices.clear();
406
+ this.csvMultisigInputs.clear();
394
407
  this.inputSignerMap.clear();
395
408
  this.tweakedSignerCache.clear();
396
409
  delete this.parallelSigningConfig;
@@ -450,7 +463,8 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
450
463
 
451
464
  for (const input of this.inputs) {
452
465
  // This would disable CSV! You need to check if the input has CSV
453
- if (this.csvInputIndices.has(this.inputs.indexOf(input))) {
466
+ const idx = this.inputs.indexOf(input);
467
+ if (this.csvInputIndices.has(idx) || this.csvMultisigInputs.has(idx)) {
454
468
  continue;
455
469
  }
456
470
 
@@ -755,11 +769,27 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
755
769
  }
756
770
  }
757
771
 
772
+ let allFinalized = true;
758
773
  for (let i = 0; i < transaction.data.inputs.length; i++) {
759
- transaction.finalizeInput(i, this.customFinalizerP2SH.bind(this) as FinalScriptsFunc);
774
+ try {
775
+ transaction.finalizeInput(
776
+ i,
777
+ this.customFinalizerP2SH.bind(this) as FinalScriptsFunc,
778
+ );
779
+ } catch (e) {
780
+ // CSV multisig inputs may legitimately be below threshold during
781
+ // a collaborative signing hop. Leave them unfinalized so the
782
+ // partial PSBT can travel to the next cosigner.
783
+ if (this.csvMultisigInputs.has(i)) {
784
+ allFinalized = false;
785
+ continue;
786
+ }
787
+
788
+ throw e;
789
+ }
760
790
  }
761
791
 
762
- this.finalized = true;
792
+ this.finalized = allFinalized;
763
793
  }
764
794
 
765
795
  /**
@@ -1203,8 +1233,12 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
1203
1233
  if (inputSign) input.sighashType = inputSign;
1204
1234
  }
1205
1235
 
1206
- // Taproot internal key - use per-input signer in address rotation mode
1207
- if (this.addressRotationEnabled) {
1236
+ // CSV multisig P2TR: script-path spend with NUMS internal key.
1237
+ // Must come before the default key-path setup below.
1238
+ if (this.processCSVMultisigP2TRInput(utxo, input, i, scriptPub)) {
1239
+ // input fully configured for script-path spend
1240
+ } else if (this.addressRotationEnabled) {
1241
+ // Taproot internal key - use per-input signer in address rotation mode
1208
1242
  input.tapInternalKey = this.internalPubKeyToXOnlyForInput(i);
1209
1243
  } else {
1210
1244
  this.tweakSigner();
@@ -1254,8 +1288,10 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
1254
1288
  }
1255
1289
 
1256
1290
  if (i === 0) {
1257
- // TapLeafScript if available
1258
- if (this.tapLeafScript) {
1291
+ // TapLeafScript if available — but never clobber a CSV multisig input's
1292
+ // own tapscript; its spend is a script-path that belongs to the UTXO,
1293
+ // not to this transaction's contract leaf.
1294
+ if (this.tapLeafScript && !this.csvMultisigInputs.has(i)) {
1259
1295
  input.tapLeafScript = [this.tapLeafScript];
1260
1296
  }
1261
1297
 
@@ -1267,6 +1303,58 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
1267
1303
  return input;
1268
1304
  }
1269
1305
 
1306
+ /**
1307
+ * Detect + configure a P2TR CSV multisig input for script-path spending.
1308
+ *
1309
+ * UTXOs of this shape carry the tapscript in `witnessScript`. The control
1310
+ * block and internal pubkey are fully determined by the tapscript (single
1311
+ * leaf tree, NUMS internal key) so the caller only needs to provide the
1312
+ * tapscript.
1313
+ *
1314
+ * Returns true when the UTXO was recognized and the input was configured,
1315
+ * false otherwise (caller falls back to the default P2TR key-path setup).
1316
+ */
1317
+ protected processCSVMultisigP2TRInput(
1318
+ utxo: UTXO,
1319
+ input: PsbtInputExtended,
1320
+ i: number,
1321
+ scriptPub: Uint8Array,
1322
+ ): boolean {
1323
+ if (!utxo.witnessScript) return false;
1324
+
1325
+ const tapscript =
1326
+ utxo.witnessScript instanceof Uint8Array
1327
+ ? utxo.witnessScript
1328
+ : fromHex(utxo.witnessScript);
1329
+
1330
+ const addr = CSVMultisigProvider.deriveAddressFromTapscript(tapscript, this.network);
1331
+ if (!addr) return false;
1332
+
1333
+ // Guard against spoofed witnessScripts on P2TR UTXOs from an unrelated
1334
+ // address: the tapscript must hash back to this exact scriptPubKey.
1335
+ if (!equals(addr.scriptPubKey, scriptPub)) {
1336
+ return false;
1337
+ }
1338
+
1339
+ (input as PsbtInputExtended & { tapLeafScript: TapLeafScript[] }).tapLeafScript = [
1340
+ {
1341
+ leafVersion: addr.leafVersion,
1342
+ script: addr.tapscript,
1343
+ controlBlock: addr.controlBlock,
1344
+ },
1345
+ ];
1346
+ input.tapInternalKey = addr.internalPubkey as XOnlyPublicKey;
1347
+
1348
+ // Force a CSV-compatible nSequence so OP_CHECKSEQUENCEVERIFY passes.
1349
+ (input as { sequence: number }).sequence = this.setCSVSequence(
1350
+ addr.config.csvBlocks,
1351
+ this.sequence,
1352
+ );
1353
+
1354
+ this.csvMultisigInputs.set(i, addr);
1355
+ return true;
1356
+ }
1357
+
1270
1358
  protected processP2WSHInput(utxo: UTXO, input: PsbtInputExtended, i: number): void {
1271
1359
  // P2WSH requires a witnessScript
1272
1360
  if (!utxo.witnessScript) {
@@ -1350,6 +1438,19 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
1350
1438
  };
1351
1439
  }
1352
1440
 
1441
+ const csvMultisigAddr = this.csvMultisigInputs.get(inputIndex);
1442
+ if (csvMultisigAddr) {
1443
+ const tapSigs = input.tapScriptSig ?? [];
1444
+ const witnessStack = CSVMultisigProvider.buildFinalWitnessFromTapScriptSigs(
1445
+ tapSigs,
1446
+ csvMultisigAddr,
1447
+ );
1448
+ return {
1449
+ finalScriptSig: undefined,
1450
+ finalScriptWitness: witnessStackToScriptWitness(witnessStack),
1451
+ };
1452
+ }
1453
+
1353
1454
  if (isP2WSH && isSegwit && input.witnessScript) {
1354
1455
  if (!input.partialSig || input.partialSig.length === 0) {
1355
1456
  throw new Error(`No signatures for P2WSH input #${inputIndex}`);
@@ -1424,12 +1525,24 @@ export abstract class TweakedTransaction extends Logger implements Disposable {
1424
1525
  // then, we sign all the remaining inputs with the wallet signer.
1425
1526
  await signer.multiSignPsbt([transaction]);
1426
1527
 
1427
- // Then, we finalize every input.
1528
+ let allFinalized = true;
1428
1529
  for (let i = 0; i < transaction.data.inputs.length; i++) {
1429
- transaction.finalizeInput(i, this.customFinalizerP2SH.bind(this) as FinalScriptsFunc);
1530
+ try {
1531
+ transaction.finalizeInput(
1532
+ i,
1533
+ this.customFinalizerP2SH.bind(this) as FinalScriptsFunc,
1534
+ );
1535
+ } catch (e) {
1536
+ if (this.csvMultisigInputs.has(i)) {
1537
+ allFinalized = false;
1538
+ continue;
1539
+ }
1540
+
1541
+ throw e;
1542
+ }
1430
1543
  }
1431
1544
 
1432
- this.finalized = true;
1545
+ this.finalized = allFinalized;
1433
1546
  }
1434
1547
 
1435
1548
  protected isCSVScript(decompiled: (number | Uint8Array)[]): boolean {
@@ -52,6 +52,7 @@ describe('addRefundOutput , deterministic fee estimation', () => {
52
52
  feeRate?: number;
53
53
  feeUtxos?: UTXO[];
54
54
  autoAdjustAmount?: boolean;
55
+ debugFees?: boolean;
55
56
  }) {
56
57
  const utxo = createTaprootUtxo(taprootAddress, opts.utxoValue);
57
58
  return new FundingTransaction({
@@ -64,6 +65,7 @@ describe('addRefundOutput , deterministic fee estimation', () => {
64
65
  priorityFee: 0n,
65
66
  gasSatFee: 0n,
66
67
  mldsaSigner: null,
68
+ debugFees: !!opts.debugFees,
67
69
  ...(opts.feeUtxos !== undefined && { feeUtxos: opts.feeUtxos }),
68
70
  ...(opts.autoAdjustAmount !== undefined && { autoAdjustAmount: opts.autoAdjustAmount }),
69
71
  });
@@ -204,15 +206,38 @@ describe('addRefundOutput , deterministic fee estimation', () => {
204
206
  });
205
207
  });
206
208
 
209
+ // ================================================================
210
+ // Fee underpayment guard: leftover absorbed into fee must still meet feeRate
211
+ // ================================================================
212
+ describe('fee underpayment guard', () => {
213
+ it('should throw when leftover would underpay feeRate (200 sats at feeRate=10)', async () => {
214
+ const utxoValue = 100_000n;
215
+ const amount = utxoValue - 200n;
216
+
217
+ const tx = buildFunding({ utxoValue, amount, feeRate: 10 });
218
+
219
+ await expect(tx.signTransaction()).rejects.toThrow(/Insufficient funds for fee/);
220
+ });
221
+
222
+ it('should throw when leftover is a token amount (1 sat) far below feeRate', async () => {
223
+ const utxoValue = 100_000n;
224
+ const amount = utxoValue - 1n;
225
+
226
+ const tx = buildFunding({ utxoValue, amount, feeRate: 5 });
227
+
228
+ await expect(tx.signTransaction()).rejects.toThrow(/Insufficient funds for fee/);
229
+ });
230
+ });
231
+
207
232
  // ================================================================
208
233
  // Tolerance: sendBack < 0 but totalInput > amountSpent
209
234
  // ================================================================
210
- describe('tolerance , effective fee is positive but less than estimated', () => {
211
- it('should succeed when amount is close to totalInput leaving a small effective fee', async () => {
235
+ describe('tolerance , effective fee is positive but is a little bit less than estimated UTXO available', () => {
236
+ it('should succeed when amount+fees is close to totalInput', async () => {
212
237
  const utxoValue = 100_000n;
213
238
  // Leave 200 sats for fees , less than the estimated fee at high rate
214
239
  // but totalInput > amountSpent so it's valid
215
- const amount = utxoValue - 200n;
240
+ const amount = utxoValue - 1109n;
216
241
 
217
242
  const tx = buildFunding({ utxoValue, amount, feeRate: 10 });
218
243
 
@@ -223,20 +248,80 @@ describe('addRefundOutput , deterministic fee estimation', () => {
223
248
 
224
249
  // Verify fee is exactly the 200 sats leftover
225
250
  const totalOut = signed.outs.reduce((sum, o) => sum + BigInt(o.value), 0n);
226
- expect(utxoValue - totalOut).toBe(200n);
251
+ expect(utxoValue - totalOut).toBe(1109n);
252
+ expect(tx.transactionFee).toBe(1109n);
227
253
  });
228
254
 
229
- it('should succeed with very small leftover (1 sat) as long as totalInput > amountSpent', async () => {
255
+ // Const real fees = 555n, dust = 330n
256
+ const shouldSucceed: [
257
+ delta: bigint,
258
+ succeed: boolean,
259
+ overflow: bigint,
260
+ message: string,
261
+ ][] = [
262
+ [0n, false, 0n, 'amount equal utxoValue'],
263
+ [1n, false, 0n, 'amount equal utxoValue less 1'],
264
+
265
+ // Check fees bondary
266
+ [553n, false, 0n, 'amount equal utxoValue less 553 (real fees - 2)'],
267
+ [554n, true, 0n, 'amount equal utxoValue less 554 (real fees - 1)'],
268
+ [555n, true, 0n, 'amount equal utxoValue less 555 (real fees)'],
269
+ [556n, true, 0n, 'amount equal utxoValue less 556 (real fees + 1)'],
270
+
271
+ // Check fees+dust bondaries
272
+ [555n + 329n, true, 0n, 'amount equal utxoValue less 884 (real fees + dust - 1)'],
273
+ [555n + 330n, true, 0n, 'amount equal utxoValue less 885 (real fees + dust)'],
274
+ [555n + 331n, true, 0n, 'amount equal utxoValue less 886 (real fees + dust + 1)'],
275
+
276
+ // If there is really a refund, a refund output section will be added
277
+ // to the tx, with a vbsize of 43 vbytes * 5 feeRate --> 215...
278
+ // Check the new fees+refund_section+dust boundaries
279
+ [
280
+ 555n + 43n * 5n + 329n,
281
+ true,
282
+ 0n,
283
+ 'amount equal utxoValue less 1109 (real fees + refund + dust - 1)',
284
+ ],
285
+ [
286
+ 555n + 43n * 5n + 330n,
287
+ true,
288
+ 330n,
289
+ 'amount equal utxoValue less 1110 (real fees + refund + dust)',
290
+ ],
291
+ [
292
+ 555n + 43n * 5n + 331n,
293
+ true,
294
+ 331n,
295
+ 'amount equal utxoValue less 1111 (real fees + refund + dust + 1)',
296
+ ],
297
+ ];
298
+ it('should succeed with very small diff from calculated fees (1 sat)', async () => {
230
299
  const utxoValue = 100_000n;
231
- const amount = utxoValue - 1n;
232
300
 
233
- const tx = buildFunding({ utxoValue, amount, feeRate: 5 });
301
+ let tx: FundingTransaction | undefined = undefined;
302
+ for (const [delta, shouldSuccess, overflow, message] of shouldSucceed) {
303
+ let succeed = false;
304
+ try {
305
+ const amount = utxoValue - delta;
234
306
 
235
- const signed = await tx.signTransaction();
236
- expect(signed.ins.length).toBeGreaterThan(0);
307
+ tx = buildFunding({ utxoValue, amount, feeRate: 5, debugFees: false });
237
308
 
238
- const totalOut = signed.outs.reduce((sum, o) => sum + BigInt(o.value), 0n);
239
- expect(utxoValue - totalOut).toBe(1n);
309
+ const signed = await tx.signTransaction();
310
+ expect(signed.ins.length).toBeGreaterThan(0);
311
+
312
+ const totalOut = signed.outs.reduce((sum, o) => sum + BigInt(o.value), 0n);
313
+
314
+ //console.log('DELTA', utxoValue, totalOut, delta, overflow, tx.estimatedFees, tx.overflowFees,);
315
+ expect(utxoValue - totalOut).toBe(delta - overflow);
316
+ succeed = true;
317
+ } catch (e) {
318
+ //console.log('E', e);
319
+ succeed = false;
320
+ }
321
+
322
+ expect(succeed, message).toBe(shouldSuccess);
323
+ expect(tx?.overflowFees, message).toBe(overflow);
324
+ }
240
325
  });
241
326
  });
242
327
 
@@ -0,0 +1,293 @@
1
+ /**
2
+ * csv-multisig-offline-edges.test.ts
3
+ *
4
+ * Edge cases for the OfflineTransactionManager CSV multisig API:
5
+ * - csvMultisigGetStatus standalone
6
+ * - csvMultisigFinalize error paths
7
+ * - addCSVMultisigSignature idempotency + non-cosigner no-op on first hop
8
+ * - Serializer v2 round-trip of partialPsbtBase64
9
+ * - signPSBT returns a partial PSBT for under-threshold CSV inputs
10
+ */
11
+
12
+ import { beforeAll, describe, expect, it } from 'vitest';
13
+ import {
14
+ crypto as bitCrypto,
15
+ networks,
16
+ payments,
17
+ Psbt,
18
+ toHex,
19
+ toXOnly,
20
+ type XOnlyPublicKey,
21
+ } from '@btc-vision/bitcoin';
22
+ import { type UniversalSigner } from '@btc-vision/ecpair';
23
+ import type { UTXO } from '../build/opnet.js';
24
+ import {
25
+ CSVMultisigProvider,
26
+ EcKeyPair,
27
+ FundingTransaction,
28
+ OfflineTransactionManager,
29
+ TransactionBuilder,
30
+ TransactionSerializer,
31
+ } from '../build/opnet.js';
32
+
33
+ const network = networks.regtest;
34
+
35
+ function makeSigner(seed: string): UniversalSigner {
36
+ return EcKeyPair.fromPrivateKey(
37
+ bitCrypto.sha256(new TextEncoder().encode(seed)),
38
+ network,
39
+ );
40
+ }
41
+
42
+ function buildAddr(signers: UniversalSigner[], csvBlocks: number, threshold: number) {
43
+ const pubkeys = signers.map((s) => toXOnly(s.publicKey) as XOnlyPublicKey);
44
+ return CSVMultisigProvider.generateAddress({ pubkeys, threshold, csvBlocks }, network);
45
+ }
46
+
47
+ function makeUtxo(
48
+ addr: ReturnType<typeof buildAddr>,
49
+ value: bigint,
50
+ txid: string = '22'.repeat(32),
51
+ ): UTXO {
52
+ return {
53
+ transactionId: txid,
54
+ outputIndex: 0,
55
+ value,
56
+ scriptPubKey: {
57
+ hex: toHex(addr.scriptPubKey),
58
+ address: addr.address,
59
+ },
60
+ witnessScript: addr.tapscript,
61
+ };
62
+ }
63
+
64
+ function fundingState(
65
+ addr: ReturnType<typeof buildAddr>,
66
+ utxo: UTXO,
67
+ placeholderSigner: UniversalSigner,
68
+ ): string {
69
+ const recipient = payments.p2tr({
70
+ internalPubkey: toXOnly(placeholderSigner.publicKey) as XOnlyPublicKey,
71
+ network,
72
+ }).address as string;
73
+
74
+ return OfflineTransactionManager.exportFunding({
75
+ signer: placeholderSigner,
76
+ mldsaSigner: null,
77
+ network,
78
+ utxos: [utxo],
79
+ to: recipient,
80
+ amount: TransactionBuilder.MINIMUM_DUST,
81
+ feeRate: 1,
82
+ priorityFee: 0n,
83
+ gasSatFee: 0n,
84
+ });
85
+ }
86
+
87
+ describe('OfflineTransactionManager CSV multisig — edges', () => {
88
+ let signerA: UniversalSigner;
89
+ let signerB: UniversalSigner;
90
+ let signerC: UniversalSigner;
91
+ let signerD: UniversalSigner; // never a cosigner anywhere
92
+
93
+ beforeAll(() => {
94
+ signerA = makeSigner('edges-A');
95
+ signerB = makeSigner('edges-B');
96
+ signerC = makeSigner('edges-C');
97
+ signerD = makeSigner('edges-D');
98
+ });
99
+
100
+ // ----------------------------------------------------------------
101
+ // csvMultisigGetStatus
102
+ // ----------------------------------------------------------------
103
+ describe('csvMultisigGetStatus', () => {
104
+ it('returns [] when no partial PSBT has been produced yet', () => {
105
+ const addr = buildAddr([signerA, signerB], 5, 2);
106
+ const utxo = makeUtxo(addr, 200_000n);
107
+ const state = fundingState(addr, utxo, signerA);
108
+
109
+ expect(OfflineTransactionManager.csvMultisigGetStatus(state)).toEqual([]);
110
+ });
111
+
112
+ it('reflects the same status as the hop result after addCSVMultisigSignature', async () => {
113
+ const addr = buildAddr([signerA, signerB, signerC], 5, 2);
114
+ const utxo = makeUtxo(addr, 200_000n);
115
+ const state = fundingState(addr, utxo, signerA);
116
+
117
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
118
+ const direct = OfflineTransactionManager.csvMultisigGetStatus(hop1.state);
119
+
120
+ expect(direct).toEqual(hop1.perInput);
121
+ expect(direct[0]!.collected).toBe(1);
122
+ expect(direct[0]!.required).toBe(2);
123
+ });
124
+
125
+ it('reports collected === threshold for finalized inputs (threshold=1 single hop)', async () => {
126
+ const addr = buildAddr([signerA], 3, 1);
127
+ const utxo = makeUtxo(addr, 200_000n);
128
+ const state = fundingState(addr, utxo, signerA);
129
+
130
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
131
+
132
+ const status = OfflineTransactionManager.csvMultisigGetStatus(hop1.state);
133
+ expect(status).toHaveLength(1);
134
+ expect(status[0]!.required).toBe(1);
135
+ expect(status[0]!.collected).toBe(1);
136
+ });
137
+ });
138
+
139
+ // ----------------------------------------------------------------
140
+ // csvMultisigFinalize error paths
141
+ // ----------------------------------------------------------------
142
+ describe('csvMultisigFinalize', () => {
143
+ it('throws when no partial PSBT exists in state', () => {
144
+ const addr = buildAddr([signerA, signerB], 5, 2);
145
+ const utxo = makeUtxo(addr, 200_000n);
146
+ const state = fundingState(addr, utxo, signerA);
147
+
148
+ expect(() => OfflineTransactionManager.csvMultisigFinalize(state)).toThrow(
149
+ /No partial PSBT/i,
150
+ );
151
+ });
152
+
153
+ it('throws when the partial PSBT is below threshold', async () => {
154
+ const addr = buildAddr([signerA, signerB, signerC], 5, 2);
155
+ const utxo = makeUtxo(addr, 200_000n);
156
+ const state = fundingState(addr, utxo, signerA);
157
+
158
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
159
+ expect(hop1.final).toBe(false);
160
+
161
+ expect(() => OfflineTransactionManager.csvMultisigFinalize(hop1.state)).toThrow(
162
+ /needs 2 signatures, got 1/,
163
+ );
164
+ });
165
+ });
166
+
167
+ // ----------------------------------------------------------------
168
+ // addCSVMultisigSignature edge cases
169
+ // ----------------------------------------------------------------
170
+ describe('addCSVMultisigSignature', () => {
171
+ it('is idempotent — re-signing with the same cosigner does not double-count', async () => {
172
+ const addr = buildAddr([signerA, signerB, signerC], 5, 2);
173
+ const utxo = makeUtxo(addr, 200_000n);
174
+ const state = fundingState(addr, utxo, signerA);
175
+
176
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
177
+ expect(hop1.perInput[0]!.collected).toBe(1);
178
+
179
+ const hop2 = await OfflineTransactionManager.addCSVMultisigSignature(
180
+ hop1.state,
181
+ signerA,
182
+ );
183
+ expect(hop2.perInput[0]!.collected).toBe(1);
184
+ expect(hop2.final).toBe(false);
185
+ });
186
+
187
+ it('non-cosigner on a non-first hop leaves the partial PSBT unchanged', async () => {
188
+ const addr = buildAddr([signerA, signerB], 5, 2);
189
+ const utxo = makeUtxo(addr, 200_000n);
190
+ const state = fundingState(addr, utxo, signerA);
191
+
192
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
193
+ expect(hop1.perInput[0]!.collected).toBe(1);
194
+
195
+ // signerD is in neither the tapscript nor the original signer slot
196
+ const hop2 = await OfflineTransactionManager.addCSVMultisigSignature(
197
+ hop1.state,
198
+ signerD,
199
+ );
200
+ expect(hop2.perInput[0]!.collected).toBe(1);
201
+ expect(hop2.final).toBe(false);
202
+ });
203
+
204
+ it('reaches threshold across three distinct cosigners (2-of-3 with C+B)', async () => {
205
+ const addr = buildAddr([signerA, signerB, signerC], 5, 2);
206
+ const utxo = makeUtxo(addr, 200_000n);
207
+ // Placeholder signer is A — but the actual cosigners are C then B.
208
+ const state = fundingState(addr, utxo, signerA);
209
+
210
+ // Build PSBT using A as the placeholder for the first hop;
211
+ // immediately overlay C's signature in a second hop.
212
+ const hopA = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
213
+ expect(hopA.perInput[0]!.collected).toBe(1);
214
+
215
+ const hopC = await OfflineTransactionManager.addCSVMultisigSignature(
216
+ hopA.state,
217
+ signerC,
218
+ );
219
+ expect(hopC.perInput[0]!.collected).toBe(2);
220
+ expect(hopC.final).toBe(true);
221
+
222
+ // Finalization succeeds even though signerB never participated.
223
+ const rawTxHex = OfflineTransactionManager.csvMultisigFinalize(hopC.state);
224
+ expect(rawTxHex).toMatch(/^[0-9a-f]+$/);
225
+ });
226
+ });
227
+
228
+ // ----------------------------------------------------------------
229
+ // Serializer v2 round-trip
230
+ // ----------------------------------------------------------------
231
+ describe('serializer v2 — partialPsbtBase64 round-trip', () => {
232
+ it('omits the field on a freshly exported state', () => {
233
+ const addr = buildAddr([signerA, signerB], 5, 2);
234
+ const utxo = makeUtxo(addr, 200_000n);
235
+ const state = fundingState(addr, utxo, signerA);
236
+
237
+ const decoded = TransactionSerializer.fromBase64(state);
238
+ expect(decoded.partialPsbtBase64).toBeUndefined();
239
+ });
240
+
241
+ it('round-trips the partial PSBT verbatim after a signing hop', async () => {
242
+ const addr = buildAddr([signerA, signerB], 5, 2);
243
+ const utxo = makeUtxo(addr, 200_000n);
244
+ const state = fundingState(addr, utxo, signerA);
245
+
246
+ const hop1 = await OfflineTransactionManager.addCSVMultisigSignature(state, signerA);
247
+
248
+ const decoded = TransactionSerializer.fromBase64(hop1.state);
249
+ expect(decoded.partialPsbtBase64).toBeDefined();
250
+
251
+ // Sanity: the carried PSBT actually parses and has one tapScriptSig.
252
+ const psbt = Psbt.fromBase64(decoded.partialPsbtBase64!, { network });
253
+ expect(psbt.data.inputs[0]!.tapScriptSig).toHaveLength(1);
254
+
255
+ // Round-trip via toBase64 yields a byte-identical payload.
256
+ const reEncoded = TransactionSerializer.toBase64(decoded);
257
+ expect(reEncoded).toBe(hop1.state);
258
+ });
259
+ });
260
+
261
+ // ----------------------------------------------------------------
262
+ // signPSBT semantic shift: returns the (possibly partial) PSBT
263
+ // ----------------------------------------------------------------
264
+ describe('TransactionBuilder.signPSBT — partial PSBT semantics', () => {
265
+ it('returns a PSBT with the tapScriptSig but no finalScriptWitness for under-threshold CSV input', async () => {
266
+ const addr = buildAddr([signerA, signerB, signerC], 5, 2);
267
+ const utxo = makeUtxo(addr, 200_000n);
268
+ const recipient = payments.p2tr({
269
+ internalPubkey: toXOnly(signerA.publicKey) as XOnlyPublicKey,
270
+ network,
271
+ }).address as string;
272
+
273
+ const tx = new FundingTransaction({
274
+ signer: signerA,
275
+ mldsaSigner: null,
276
+ network,
277
+ utxos: [utxo],
278
+ to: recipient,
279
+ amount: TransactionBuilder.MINIMUM_DUST,
280
+ feeRate: 1,
281
+ priorityFee: 0n,
282
+ gasSatFee: 0n,
283
+ });
284
+
285
+ const psbt = await tx.signPSBT();
286
+ const input = psbt.data.inputs[0]!;
287
+
288
+ expect(input.tapScriptSig).toBeDefined();
289
+ expect(input.tapScriptSig).toHaveLength(1);
290
+ expect(input.finalScriptWitness).toBeUndefined();
291
+ });
292
+ });
293
+ });