@atomicfinance/bitcoin-dlc-provider 3.6.1 → 4.0.1
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.
- package/.nvmrc +1 -1
- package/.turbo/turbo-lint.log +1 -0
- package/.yalc/@node-dlc/bitcoin/.nyc_output/982e80bf-a70c-452f-b63d-d749ae385531.json +1 -0
- package/.yalc/@node-dlc/bitcoin/.nyc_output/processinfo/982e80bf-a70c-452f-b63d-d749ae385531.json +1 -0
- package/.yalc/@node-dlc/bitcoin/.nyc_output/processinfo/index.json +1 -0
- package/.yalc/@node-dlc/bitcoin/README.md +11 -0
- package/.yalc/@node-dlc/bitcoin/__tests__/bitcoin/amount.spec.ts +330 -0
- package/.yalc/@node-dlc/bitcoin/__tests__/bitcoin/value.spec.ts +320 -0
- package/.yalc/@node-dlc/bitcoin/__tests__/tsconfig.json +8 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Amount.ts.html +290 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Base58.ts.html +269 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Base58Check.ts.html +182 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/BitcoinError.ts.html +173 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/BitcoinErrorCode.ts.html +110 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/HashByteOrder.ts.html +143 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/HashValue.ts.html +350 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/LexicographicalSorters.ts.html +191 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/LockTime.ts.html +386 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/OpCodes.ts.html +437 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/OutPoint.ts.html +383 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Script.ts.html +1607 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Sequence.ts.html +713 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/SigHashType.ts.html +137 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Stack.ts.html +323 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/TimeLockMode.ts.html +128 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Tx.ts.html +1520 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/TxBuilder.ts.html +971 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/TxIn.ts.html +425 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/TxOut.ts.html +341 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Value.ts.html +683 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Wif.ts.html +311 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/Witness.ts.html +275 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/base.css +224 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/block-navigation.js +79 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/favicon.png +0 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/index.html +126 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/index.ts.html +164 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/prettify.css +1 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/prettify.js +2 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov-report/sorter.js +170 -0
- package/.yalc/@node-dlc/bitcoin/coverage/lcov.info +123 -0
- package/.yalc/@node-dlc/bitcoin/dist/Amount.d.ts +48 -0
- package/.yalc/@node-dlc/bitcoin/dist/Amount.js +68 -0
- package/.yalc/@node-dlc/bitcoin/dist/Amount.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58.d.ts +22 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58.js +62 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58Check.d.ts +14 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58Check.js +36 -0
- package/.yalc/@node-dlc/bitcoin/dist/Base58Check.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinError.d.ts +6 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinError.js +36 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinError.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinErrorCode.d.ts +10 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinErrorCode.js +15 -0
- package/.yalc/@node-dlc/bitcoin/dist/BitcoinErrorCode.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Block.d.ts +19 -0
- package/.yalc/@node-dlc/bitcoin/dist/Block.js +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/Block.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashByteOrder.d.ts +20 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashByteOrder.js +25 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashByteOrder.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashValue.d.ts +55 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashValue.js +82 -0
- package/.yalc/@node-dlc/bitcoin/dist/HashValue.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/ICloneable.d.ts +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/ICloneable.js +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/ICloneable.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/LexicographicalSorters.d.ts +18 -0
- package/.yalc/@node-dlc/bitcoin/dist/LexicographicalSorters.js +41 -0
- package/.yalc/@node-dlc/bitcoin/dist/LexicographicalSorters.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/LockTime.d.ts +61 -0
- package/.yalc/@node-dlc/bitcoin/dist/LockTime.js +94 -0
- package/.yalc/@node-dlc/bitcoin/dist/LockTime.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/OpCodes.d.ts +102 -0
- package/.yalc/@node-dlc/bitcoin/dist/OpCodes.js +116 -0
- package/.yalc/@node-dlc/bitcoin/dist/OpCodes.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/OutPoint.d.ts +57 -0
- package/.yalc/@node-dlc/bitcoin/dist/OutPoint.js +88 -0
- package/.yalc/@node-dlc/bitcoin/dist/OutPoint.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Script.d.ts +185 -0
- package/.yalc/@node-dlc/bitcoin/dist/Script.js +404 -0
- package/.yalc/@node-dlc/bitcoin/dist/Script.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/ScriptCmd.d.ts +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/ScriptCmd.js +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/ScriptCmd.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sequence.d.ts +116 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sequence.js +187 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sequence.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/SigHashType.d.ts +7 -0
- package/.yalc/@node-dlc/bitcoin/dist/SigHashType.js +27 -0
- package/.yalc/@node-dlc/bitcoin/dist/SigHashType.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/SizeResult.d.ts +5 -0
- package/.yalc/@node-dlc/bitcoin/dist/SizeResult.js +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/SizeResult.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sorter.d.ts +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sorter.js +3 -0
- package/.yalc/@node-dlc/bitcoin/dist/Sorter.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Stack.d.ts +15 -0
- package/.yalc/@node-dlc/bitcoin/dist/Stack.js +77 -0
- package/.yalc/@node-dlc/bitcoin/dist/Stack.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/TimeLockMode.d.ts +15 -0
- package/.yalc/@node-dlc/bitcoin/dist/TimeLockMode.js +20 -0
- package/.yalc/@node-dlc/bitcoin/dist/TimeLockMode.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Tx.d.ts +150 -0
- package/.yalc/@node-dlc/bitcoin/dist/Tx.js +408 -0
- package/.yalc/@node-dlc/bitcoin/dist/Tx.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxBuilder.d.ts +110 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxBuilder.js +238 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxBuilder.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxIn.d.ts +71 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxIn.js +79 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxIn.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxOut.d.ts +57 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxOut.js +68 -0
- package/.yalc/@node-dlc/bitcoin/dist/TxOut.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Value.d.ts +122 -0
- package/.yalc/@node-dlc/bitcoin/dist/Value.js +180 -0
- package/.yalc/@node-dlc/bitcoin/dist/Value.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Wif.d.ts +41 -0
- package/.yalc/@node-dlc/bitcoin/dist/Wif.js +62 -0
- package/.yalc/@node-dlc/bitcoin/dist/Wif.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/Witness.d.ts +41 -0
- package/.yalc/@node-dlc/bitcoin/dist/Witness.js +63 -0
- package/.yalc/@node-dlc/bitcoin/dist/Witness.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/dist/index.d.ts +28 -0
- package/.yalc/@node-dlc/bitcoin/dist/index.js +45 -0
- package/.yalc/@node-dlc/bitcoin/dist/index.js.map +1 -0
- package/.yalc/@node-dlc/bitcoin/lib/Amount.ts +70 -0
- package/.yalc/@node-dlc/bitcoin/lib/Base58.ts +63 -0
- package/.yalc/@node-dlc/bitcoin/lib/Base58Check.ts +34 -0
- package/.yalc/@node-dlc/bitcoin/lib/BitcoinError.ts +31 -0
- package/.yalc/@node-dlc/bitcoin/lib/BitcoinErrorCode.ts +10 -0
- package/.yalc/@node-dlc/bitcoin/lib/Block.ts +20 -0
- package/.yalc/@node-dlc/bitcoin/lib/HashByteOrder.ts +21 -0
- package/.yalc/@node-dlc/bitcoin/lib/HashValue.ts +90 -0
- package/.yalc/@node-dlc/bitcoin/lib/ICloneable.ts +3 -0
- package/.yalc/@node-dlc/bitcoin/lib/LexicographicalSorters.ts +37 -0
- package/.yalc/@node-dlc/bitcoin/lib/LockTime.ts +102 -0
- package/.yalc/@node-dlc/bitcoin/lib/OpCodes.ts +119 -0
- package/.yalc/@node-dlc/bitcoin/lib/OutPoint.ts +101 -0
- package/.yalc/@node-dlc/bitcoin/lib/Script.ts +509 -0
- package/.yalc/@node-dlc/bitcoin/lib/ScriptCmd.ts +3 -0
- package/.yalc/@node-dlc/bitcoin/lib/Sequence.ts +211 -0
- package/.yalc/@node-dlc/bitcoin/lib/SigHashType.ts +19 -0
- package/.yalc/@node-dlc/bitcoin/lib/SizeResult.ts +5 -0
- package/.yalc/@node-dlc/bitcoin/lib/Sorter.ts +1 -0
- package/.yalc/@node-dlc/bitcoin/lib/Stack.ts +81 -0
- package/.yalc/@node-dlc/bitcoin/lib/TimeLockMode.ts +16 -0
- package/.yalc/@node-dlc/bitcoin/lib/Tx.ts +480 -0
- package/.yalc/@node-dlc/bitcoin/lib/TxBuilder.ts +297 -0
- package/.yalc/@node-dlc/bitcoin/lib/TxIn.ts +115 -0
- package/.yalc/@node-dlc/bitcoin/lib/TxOut.ts +87 -0
- package/.yalc/@node-dlc/bitcoin/lib/Value.ts +201 -0
- package/.yalc/@node-dlc/bitcoin/lib/Wif.ts +77 -0
- package/.yalc/@node-dlc/bitcoin/lib/Witness.ts +65 -0
- package/.yalc/@node-dlc/bitcoin/lib/index.ts +28 -0
- package/.yalc/@node-dlc/bitcoin/package.json +31 -0
- package/.yalc/@node-dlc/bitcoin/tsconfig.json +8 -0
- package/.yalc/@node-dlc/bitcoin/yalc.sig +1 -0
- package/.yalc/@node-dlc/bufio/.eslintrc +6 -0
- package/.yalc/@node-dlc/bufio/.nyc_output/3c26c5b3-2a5e-4a53-88d4-06f4a5c339f7.json +1 -0
- package/.yalc/@node-dlc/bufio/.nyc_output/processinfo/3c26c5b3-2a5e-4a53-88d4-06f4a5c339f7.json +1 -0
- package/.yalc/@node-dlc/bufio/.nyc_output/processinfo/index.json +1 -0
- package/.yalc/@node-dlc/bufio/README.md +68 -0
- package/.yalc/@node-dlc/bufio/__tests__/BufferReader.spec.ts +548 -0
- package/.yalc/@node-dlc/bufio/__tests__/BufferWriter.spec.ts +530 -0
- package/.yalc/@node-dlc/bufio/__tests__/Hex.spec.ts +51 -0
- package/.yalc/@node-dlc/bufio/__tests__/StreamReader.spec.ts +133 -0
- package/.yalc/@node-dlc/bufio/__tests__/bigFromBufBE.spec.ts +14 -0
- package/.yalc/@node-dlc/bufio/__tests__/bigFromBufLE.spec.ts +14 -0
- package/.yalc/@node-dlc/bufio/__tests__/bigToBufBE.spec.ts +15 -0
- package/.yalc/@node-dlc/bufio/__tests__/bigToBufLE.spec.ts +14 -0
- package/.yalc/@node-dlc/bufio/__tests__/encodeVarInt.spec.ts +25 -0
- package/.yalc/@node-dlc/bufio/__tests__/tsconfig.json +7 -0
- package/.yalc/@node-dlc/bufio/__tests__/varIntBytes.spec.ts +34 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/BufferReader.ts.html +1142 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/BufferWriter.ts.html +953 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/Hex.ts.html +323 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/StreamReader.ts.html +620 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/base.css +224 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/bigFromBufBE.ts.html +89 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/bigFromBufLE.ts.html +95 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/bigToBufBE.ts.html +98 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/bigToBufLE.ts.html +95 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/block-navigation.js +79 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/bufToStream.ts.html +113 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/encodeVarInt.ts.html +203 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/favicon.png +0 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/index.html +261 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/prettify.css +1 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/prettify.js +2 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/sorter.js +170 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov-report/varIntBytes.ts.html +116 -0
- package/.yalc/@node-dlc/bufio/coverage/lcov.info +747 -0
- package/.yalc/@node-dlc/bufio/dist/BufferReader.d.ts +155 -0
- package/.yalc/@node-dlc/bufio/dist/BufferReader.js +346 -0
- package/.yalc/@node-dlc/bufio/dist/BufferReader.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/BufferWriter.d.ts +143 -0
- package/.yalc/@node-dlc/bufio/dist/BufferWriter.js +279 -0
- package/.yalc/@node-dlc/bufio/dist/BufferWriter.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/Hex.d.ts +13 -0
- package/.yalc/@node-dlc/bufio/dist/Hex.js +78 -0
- package/.yalc/@node-dlc/bufio/dist/Hex.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/StreamReader.d.ts +111 -0
- package/.yalc/@node-dlc/bufio/dist/StreamReader.js +180 -0
- package/.yalc/@node-dlc/bufio/dist/StreamReader.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufBE.d.ts +2 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufBE.js +8 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufBE.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufLE.d.ts +2 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufLE.js +9 -0
- package/.yalc/@node-dlc/bufio/dist/bigFromBufLE.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufBE.d.ts +2 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufBE.js +13 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufBE.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufLE.d.ts +2 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufLE.js +9 -0
- package/.yalc/@node-dlc/bufio/dist/bigToBufLE.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/bufToStream.d.ts +7 -0
- package/.yalc/@node-dlc/bufio/dist/bufToStream.js +15 -0
- package/.yalc/@node-dlc/bufio/dist/bufToStream.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/encodeVarInt.d.ts +12 -0
- package/.yalc/@node-dlc/bufio/dist/encodeVarInt.js +46 -0
- package/.yalc/@node-dlc/bufio/dist/encodeVarInt.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/index.d.ts +11 -0
- package/.yalc/@node-dlc/bufio/dist/index.js +28 -0
- package/.yalc/@node-dlc/bufio/dist/index.js.map +1 -0
- package/.yalc/@node-dlc/bufio/dist/varIntBytes.d.ts +5 -0
- package/.yalc/@node-dlc/bufio/dist/varIntBytes.js +22 -0
- package/.yalc/@node-dlc/bufio/dist/varIntBytes.js.map +1 -0
- package/.yalc/@node-dlc/bufio/lib/BufferReader.ts +354 -0
- package/.yalc/@node-dlc/bufio/lib/BufferWriter.ts +291 -0
- package/.yalc/@node-dlc/bufio/lib/Hex.ts +81 -0
- package/.yalc/@node-dlc/bufio/lib/StreamReader.ts +180 -0
- package/.yalc/@node-dlc/bufio/lib/bigFromBufBE.ts +3 -0
- package/.yalc/@node-dlc/bufio/lib/bigFromBufLE.ts +5 -0
- package/.yalc/@node-dlc/bufio/lib/bigToBufBE.ts +6 -0
- package/.yalc/@node-dlc/bufio/lib/bigToBufLE.ts +5 -0
- package/.yalc/@node-dlc/bufio/lib/bufToStream.ts +11 -0
- package/.yalc/@node-dlc/bufio/lib/encodeVarInt.ts +41 -0
- package/.yalc/@node-dlc/bufio/lib/index.ts +11 -0
- package/.yalc/@node-dlc/bufio/lib/varIntBytes.ts +12 -0
- package/.yalc/@node-dlc/bufio/package.json +27 -0
- package/.yalc/@node-dlc/bufio/tsconfig-build.json +7 -0
- package/.yalc/@node-dlc/bufio/tsconfig.json +7 -0
- package/.yalc/@node-dlc/bufio/yalc.sig +1 -0
- package/.yalc/@node-dlc/core/.nyc_output/687a3c14-9765-45fd-a1fe-f7db3d56fee4.json +1 -0
- package/.yalc/@node-dlc/core/.nyc_output/processinfo/687a3c14-9765-45fd-a1fe-f7db3d56fee4.json +1 -0
- package/.yalc/@node-dlc/core/.nyc_output/processinfo/index.json +1 -0
- package/.yalc/@node-dlc/core/README.md +11 -0
- package/.yalc/@node-dlc/core/__tests__/core.spec.ts +7 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/CETCalculator.spec.ts +1029 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/CoinSelect.spec.ts +179 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/PolynomialPayoutCurve.spec.ts +345 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/TxBuilder.spec.ts +424 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/Builder.spec.ts +492 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/CoveredCall.spec.ts +112 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/CsoInfo.spec.ts +1124 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/LongCall.spec.ts +55 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/LongPut.spec.ts +55 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/OptionInfo.spec.ts +226 -0
- package/.yalc/@node-dlc/core/__tests__/dlc/finance/ShortPut.spec.ts +62 -0
- package/.yalc/@node-dlc/core/__tests__/tsconfig.json +8 -0
- package/.yalc/@node-dlc/core/__tests__/utils/precision.spec.ts +40 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/base.css +224 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/block-navigation.js +79 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/favicon.png +0 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/index.html +171 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/AsyncProcessingQueue.ts.html +269 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/Base32.ts.html +86 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/BigIntUtils.ts.html +86 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/BitField.ts.html +86 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/ChannelId.ts.html +86 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/LinkedList.ts.html +413 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/LinkedListNode.ts.html +122 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/Queue.ts.html +188 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/ShortChannelId.ts.html +86 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/ShortChannelIdUtils.ts.html +107 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/CETCalculator.ts.html +1430 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/CoinSelect.ts.html +431 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/HyperbolaPayoutCurve.ts.html +644 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/PolynomialPayoutCurve.ts.html +878 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/TxBuilder.ts.html +1088 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/TxFinalizer.ts.html +731 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/Builder.ts.html +2270 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/CoveredCall.ts.html +410 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/CsoInfo.ts.html +1574 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/LinearPayout.ts.html +362 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/LongCall.ts.html +302 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/LongPut.ts.html +302 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/OptionInfo.ts.html +626 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/ShortPut.ts.html +305 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/finance/index.html +216 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/dlc/index.html +186 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/index.html +261 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/index.ts.html +278 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/ChannelId.ts.html +242 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/ChannelKeys.ts.html +407 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/CommitmentNumber.ts.html +362 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/CommitmentSecret.ts.html +203 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/CommitmentSecretStore.ts.html +332 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/Htlc.ts.html +236 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/HtlcDirection.ts.html +131 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/ScriptFactory.ts.html +530 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/TxFactory.ts.html +1094 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/lightning/index.html +231 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/utils/BigIntUtils.ts.html +272 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/utils/Precision.ts.html +149 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/lib/utils/index.html +126 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/prettify.css +1 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/prettify.js +2 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.yalc/@node-dlc/core/coverage/lcov-report/sorter.js +170 -0
- package/.yalc/@node-dlc/core/coverage/lcov.info +2426 -0
- package/.yalc/@node-dlc/core/dist/AsyncProcessingQueue.d.ts +22 -0
- package/.yalc/@node-dlc/core/dist/AsyncProcessingQueue.js +55 -0
- package/.yalc/@node-dlc/core/dist/AsyncProcessingQueue.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/Base32.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/Base32.js +7 -0
- package/.yalc/@node-dlc/core/dist/Base32.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/BigIntUtils.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/BigIntUtils.js +8 -0
- package/.yalc/@node-dlc/core/dist/BigIntUtils.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/BitField.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/BitField.js +7 -0
- package/.yalc/@node-dlc/core/dist/BitField.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/ChannelId.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/ChannelId.js +7 -0
- package/.yalc/@node-dlc/core/dist/ChannelId.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/LinkedList.d.ts +30 -0
- package/.yalc/@node-dlc/core/dist/LinkedList.js +104 -0
- package/.yalc/@node-dlc/core/dist/LinkedList.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/LinkedListNode.d.ts +9 -0
- package/.yalc/@node-dlc/core/dist/LinkedListNode.js +15 -0
- package/.yalc/@node-dlc/core/dist/LinkedListNode.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/Queue.d.ts +22 -0
- package/.yalc/@node-dlc/core/dist/Queue.js +38 -0
- package/.yalc/@node-dlc/core/dist/Queue.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelId.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelId.js +7 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelId.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelIdUtils.d.ts +1 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelIdUtils.js +12 -0
- package/.yalc/@node-dlc/core/dist/ShortChannelIdUtils.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/CETCalculator.d.ts +50 -0
- package/.yalc/@node-dlc/core/dist/dlc/CETCalculator.js +332 -0
- package/.yalc/@node-dlc/core/dist/dlc/CETCalculator.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/CoinSelect.d.ts +23 -0
- package/.yalc/@node-dlc/core/dist/dlc/CoinSelect.js +77 -0
- package/.yalc/@node-dlc/core/dist/dlc/CoinSelect.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/HyperbolaPayoutCurve.d.ts +20 -0
- package/.yalc/@node-dlc/core/dist/dlc/HyperbolaPayoutCurve.js +117 -0
- package/.yalc/@node-dlc/core/dist/dlc/HyperbolaPayoutCurve.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/PayoutCurve.d.ts +5 -0
- package/.yalc/@node-dlc/core/dist/dlc/PayoutCurve.js +3 -0
- package/.yalc/@node-dlc/core/dist/dlc/PayoutCurve.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/PolynomialPayoutCurve.d.ts +52 -0
- package/.yalc/@node-dlc/core/dist/dlc/PolynomialPayoutCurve.js +173 -0
- package/.yalc/@node-dlc/core/dist/dlc/PolynomialPayoutCurve.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxBuilder.d.ts +55 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxBuilder.js +217 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxBuilder.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxFinalizer.d.ts +40 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxFinalizer.js +146 -0
- package/.yalc/@node-dlc/core/dist/dlc/TxFinalizer.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/Builder.d.ts +193 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/Builder.js +422 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/Builder.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CoveredCall.d.ts +13 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CoveredCall.js +67 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CoveredCall.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CsoInfo.d.ts +114 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CsoInfo.js +290 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/CsoInfo.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LinearPayout.d.ts +6 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LinearPayout.js +79 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LinearPayout.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongCall.d.ts +13 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongCall.js +47 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongCall.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongPut.d.ts +13 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongPut.js +47 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/LongPut.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/OptionInfo.d.ts +20 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/OptionInfo.js +101 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/OptionInfo.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/ShortPut.d.ts +12 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/ShortPut.js +46 -0
- package/.yalc/@node-dlc/core/dist/dlc/finance/ShortPut.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/index.d.ts +39 -0
- package/.yalc/@node-dlc/core/dist/index.js +78 -0
- package/.yalc/@node-dlc/core/dist/index.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelId.d.ts +31 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelId.js +52 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelId.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelKeys.d.ts +55 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelKeys.js +105 -0
- package/.yalc/@node-dlc/core/dist/lightning/ChannelKeys.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentNumber.d.ts +55 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentNumber.js +76 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentNumber.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecret.d.ts +26 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecret.js +44 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecret.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecretStore.d.ts +41 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecretStore.js +79 -0
- package/.yalc/@node-dlc/core/dist/lightning/CommitmentSecretStore.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/Htlc.d.ts +46 -0
- package/.yalc/@node-dlc/core/dist/lightning/Htlc.js +46 -0
- package/.yalc/@node-dlc/core/dist/lightning/Htlc.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/HtlcDirection.d.ts +16 -0
- package/.yalc/@node-dlc/core/dist/lightning/HtlcDirection.js +21 -0
- package/.yalc/@node-dlc/core/dist/lightning/HtlcDirection.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/ScriptFactory.d.ts +76 -0
- package/.yalc/@node-dlc/core/dist/lightning/ScriptFactory.js +102 -0
- package/.yalc/@node-dlc/core/dist/lightning/ScriptFactory.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/lightning/TxFactory.d.ts +83 -0
- package/.yalc/@node-dlc/core/dist/lightning/TxFactory.js +222 -0
- package/.yalc/@node-dlc/core/dist/lightning/TxFactory.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/utils/BigIntUtils.d.ts +9 -0
- package/.yalc/@node-dlc/core/dist/utils/BigIntUtils.js +59 -0
- package/.yalc/@node-dlc/core/dist/utils/BigIntUtils.js.map +1 -0
- package/.yalc/@node-dlc/core/dist/utils/Precision.d.ts +13 -0
- package/.yalc/@node-dlc/core/dist/utils/Precision.js +28 -0
- package/.yalc/@node-dlc/core/dist/utils/Precision.js.map +1 -0
- package/.yalc/@node-dlc/core/lib/AsyncProcessingQueue.ts +63 -0
- package/.yalc/@node-dlc/core/lib/Base32.ts +2 -0
- package/.yalc/@node-dlc/core/lib/BigIntUtils.ts +2 -0
- package/.yalc/@node-dlc/core/lib/BitField.ts +2 -0
- package/.yalc/@node-dlc/core/lib/ChannelId.ts +2 -0
- package/.yalc/@node-dlc/core/lib/LinkedList.ts +111 -0
- package/.yalc/@node-dlc/core/lib/LinkedListNode.ts +14 -0
- package/.yalc/@node-dlc/core/lib/Queue.ts +36 -0
- package/.yalc/@node-dlc/core/lib/ShortChannelId.ts +2 -0
- package/.yalc/@node-dlc/core/lib/ShortChannelIdUtils.ts +9 -0
- package/.yalc/@node-dlc/core/lib/dlc/CETCalculator.ts +450 -0
- package/.yalc/@node-dlc/core/lib/dlc/CoinSelect.ts +117 -0
- package/.yalc/@node-dlc/core/lib/dlc/HyperbolaPayoutCurve.ts +188 -0
- package/.yalc/@node-dlc/core/lib/dlc/PayoutCurve.ts +6 -0
- package/.yalc/@node-dlc/core/lib/dlc/PolynomialPayoutCurve.ts +266 -0
- package/.yalc/@node-dlc/core/lib/dlc/TxBuilder.ts +336 -0
- package/.yalc/@node-dlc/core/lib/dlc/TxFinalizer.ts +217 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/Builder.ts +730 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/CoveredCall.ts +110 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/CsoInfo.ts +498 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/LinearPayout.ts +94 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/LongCall.ts +74 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/LongPut.ts +74 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/OptionInfo.ts +182 -0
- package/.yalc/@node-dlc/core/lib/dlc/finance/ShortPut.ts +75 -0
- package/.yalc/@node-dlc/core/lib/index.ts +66 -0
- package/.yalc/@node-dlc/core/lib/lightning/ChannelId.ts +54 -0
- package/.yalc/@node-dlc/core/lib/lightning/ChannelKeys.ts +109 -0
- package/.yalc/@node-dlc/core/lib/lightning/CommitmentNumber.ts +94 -0
- package/.yalc/@node-dlc/core/lib/lightning/CommitmentSecret.ts +41 -0
- package/.yalc/@node-dlc/core/lib/lightning/CommitmentSecretStore.ts +84 -0
- package/.yalc/@node-dlc/core/lib/lightning/Htlc.ts +52 -0
- package/.yalc/@node-dlc/core/lib/lightning/HtlcDirection.ts +17 -0
- package/.yalc/@node-dlc/core/lib/lightning/ScriptFactory.ts +150 -0
- package/.yalc/@node-dlc/core/lib/lightning/TxFactory.ts +338 -0
- package/.yalc/@node-dlc/core/lib/utils/BigIntUtils.ts +64 -0
- package/.yalc/@node-dlc/core/lib/utils/Precision.ts +23 -0
- package/.yalc/@node-dlc/core/package.json +38 -0
- package/.yalc/@node-dlc/core/tsconfig.json +8 -0
- package/.yalc/@node-dlc/core/yalc.sig +1 -0
- package/.yalc/@node-dlc/crypto/.eslintrc +6 -0
- package/.yalc/@node-dlc/crypto/.nyc_output/de03e0b4-d482-4f61-b680-59411360f56e.json +1 -0
- package/.yalc/@node-dlc/crypto/.nyc_output/processinfo/de03e0b4-d482-4f61-b680-59411360f56e.json +1 -0
- package/.yalc/@node-dlc/crypto/.nyc_output/processinfo/index.json +1 -0
- package/.yalc/@node-dlc/crypto/README.md +13 -0
- package/.yalc/@node-dlc/crypto/__tests__/chacha.spec.ts +29 -0
- package/.yalc/@node-dlc/crypto/__tests__/chachapoly.spec.ts +78 -0
- package/.yalc/@node-dlc/crypto/__tests__/hkdf.spec.ts +131 -0
- package/.yalc/@node-dlc/crypto/__tests__/key.spec.ts +125 -0
- package/.yalc/@node-dlc/crypto/__tests__/secp256k1.spec.ts +194 -0
- package/.yalc/@node-dlc/crypto/__tests__/xor.spec.ts +28 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/base.css +224 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/block-navigation.js +79 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/chacha.ts.html +119 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/chachapoly.ts.html +275 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/favicon.png +0 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/hkdf.ts.html +236 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/index.html +186 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/key.ts.html +272 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/prettify.css +1 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/prettify.js +2 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/secp256k1.ts.html +680 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/sorter.js +170 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov-report/xor.ts.html +116 -0
- package/.yalc/@node-dlc/crypto/coverage/lcov.info +221 -0
- package/.yalc/@node-dlc/crypto/dist/aes-key.d.ts +6 -0
- package/.yalc/@node-dlc/crypto/dist/aes-key.js +3 -0
- package/.yalc/@node-dlc/crypto/dist/aes-key.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/aes.d.ts +34 -0
- package/.yalc/@node-dlc/crypto/dist/aes.js +62 -0
- package/.yalc/@node-dlc/crypto/dist/aes.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/chacha.d.ts +4 -0
- package/.yalc/@node-dlc/crypto/dist/chacha.js +40 -0
- package/.yalc/@node-dlc/crypto/dist/chacha.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/chachapoly.d.ts +24 -0
- package/.yalc/@node-dlc/crypto/dist/chachapoly.js +61 -0
- package/.yalc/@node-dlc/crypto/dist/chachapoly.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/hash.d.ts +29 -0
- package/.yalc/@node-dlc/crypto/dist/hash.js +51 -0
- package/.yalc/@node-dlc/crypto/dist/hash.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/hkdf.d.ts +20 -0
- package/.yalc/@node-dlc/crypto/dist/hkdf.js +50 -0
- package/.yalc/@node-dlc/crypto/dist/hkdf.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/hmac.d.ts +3 -0
- package/.yalc/@node-dlc/crypto/dist/hmac.js +14 -0
- package/.yalc/@node-dlc/crypto/dist/hmac.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/index.d.ts +11 -0
- package/.yalc/@node-dlc/crypto/dist/index.js +30 -0
- package/.yalc/@node-dlc/crypto/dist/index.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/key.d.ts +37 -0
- package/.yalc/@node-dlc/crypto/dist/key.js +72 -0
- package/.yalc/@node-dlc/crypto/dist/key.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/secp256k1.d.ts +120 -0
- package/.yalc/@node-dlc/crypto/dist/secp256k1.js +184 -0
- package/.yalc/@node-dlc/crypto/dist/secp256k1.js.map +1 -0
- package/.yalc/@node-dlc/crypto/dist/xor.d.ts +8 -0
- package/.yalc/@node-dlc/crypto/dist/xor.js +17 -0
- package/.yalc/@node-dlc/crypto/dist/xor.js.map +1 -0
- package/.yalc/@node-dlc/crypto/lib/aes-key.ts +4 -0
- package/.yalc/@node-dlc/crypto/lib/aes.ts +81 -0
- package/.yalc/@node-dlc/crypto/lib/chacha.ts +13 -0
- package/.yalc/@node-dlc/crypto/lib/chachapoly.ts +65 -0
- package/.yalc/@node-dlc/crypto/lib/hash.ts +44 -0
- package/.yalc/@node-dlc/crypto/lib/hkdf.ts +52 -0
- package/.yalc/@node-dlc/crypto/lib/hmac.ts +7 -0
- package/.yalc/@node-dlc/crypto/lib/index.ts +11 -0
- package/.yalc/@node-dlc/crypto/lib/key.ts +64 -0
- package/.yalc/@node-dlc/crypto/lib/secp256k1.ts +200 -0
- package/.yalc/@node-dlc/crypto/lib/xor.ts +12 -0
- package/.yalc/@node-dlc/crypto/package.json +34 -0
- package/.yalc/@node-dlc/crypto/tsconfig-build.json +7 -0
- package/.yalc/@node-dlc/crypto/tsconfig.json +4 -0
- package/.yalc/@node-dlc/crypto/yalc.sig +1 -0
- package/.yalc/@node-dlc/messaging/.nyc_output/83d37f9d-cecf-4c52-a753-115ff80bbca0.json +1 -0
- package/.yalc/@node-dlc/messaging/.nyc_output/processinfo/83d37f9d-cecf-4c52-a753-115ff80bbca0.json +1 -0
- package/.yalc/@node-dlc/messaging/.nyc_output/processinfo/index.json +1 -0
- package/.yalc/@node-dlc/messaging/README.md +24 -0
- package/.yalc/@node-dlc/messaging/__tests__/_test-utils.ts +13 -0
- package/.yalc/@node-dlc/messaging/__tests__/chain/ChainManager.spec.ts +178 -0
- package/.yalc/@node-dlc/messaging/__tests__/compatibility/dlcspecs-compatibility.spec.ts +439 -0
- package/.yalc/@node-dlc/messaging/__tests__/compatibility/rust-dlc-cross-language.spec.ts +255 -0
- package/.yalc/@node-dlc/messaging/__tests__/compatibility/true-serialization-compatibility.spec.ts +342 -0
- package/.yalc/@node-dlc/messaging/__tests__/dlc_message_test.json +155 -0
- package/.yalc/@node-dlc/messaging/__tests__/irc/IrcMessage.spec.ts +94 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/AddressCache.spec.ts +79 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/BatchFundingGroup.spec.ts +72 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/CetAdaptorSignatures.spec.ts +57 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/ContractDescriptor.spec.ts +266 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/ContractInfo.spec.ts +419 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DigitDecompositionEventDescriptor.spec.ts +59 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcAccept.spec.ts +314 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcCancel.spec.ts +42 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcClose.spec.ts +315 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcInput.spec.ts +111 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcOffer.spec.ts +589 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcSign.spec.ts +118 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/DlcTransactions.spec.ts +157 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/EnumEventDescriptor.spec.ts +50 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/EventDescriptor.spec.ts +93 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/FundingInput.spec.ts +169 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/FundingSignatures.spec.ts +83 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/NegotiationFields.spec.ts +328 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/NodeAnnouncementMessage.spec.ts +115 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleAnnouncement.spec.ts +415 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleAttestation.spec.ts +324 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleEvent.spec.ts +143 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleEventContainer.spec.ts +95 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleIdentifier.spec.ts +48 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OracleInfo.spec.ts +116 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OrderAccept.spec.ts +75 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OrderNegotiationFields.spec.ts +299 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OrderOffer.spec.ts +121 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/OrderPositionInfo.spec.ts +75 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/PayoutCurvePiece.spec.ts +220 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/PayoutFunction.spec.ts +101 -0
- package/.yalc/@node-dlc/messaging/__tests__/messages/RoundingIntervals.spec.ts +75 -0
- package/.yalc/@node-dlc/messaging/__tests__/serialize/F64.spec.ts +261 -0
- package/.yalc/@node-dlc/messaging/__tests__/tsconfig.json +8 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/base.css +224 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/block-navigation.js +79 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/favicon.png +0 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/index.html +201 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/MessageType.ts.html +500 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/chain/ChainManager.ts.html +1061 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/chain/ChainMemoryStore.ts.html +182 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/chain/index.html +126 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/domain/Address.ts.html +272 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/domain/index.html +111 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/index.html +141 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/index.ts.html +215 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/irc/IrcMessage.ts.html +563 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/irc/index.html +111 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/AddressCache.ts.html +302 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/BatchFundingGroup.ts.html +503 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/CetAdaptorSignatures.ts.html +347 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/CetAdaptorSignaturesV0.ts.html +356 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/CloseTLV.ts.html +344 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/ContractDescriptor.ts.html +1031 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/ContractInfo.ts.html +1397 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcAccept.ts.html +1997 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcCancel.ts.html +251 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcClose.ts.html +995 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcCloseMetadata.ts.html +434 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcIds.ts.html +281 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcInfo.ts.html +323 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcInput.ts.html +581 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcMessage.ts.html +341 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcOffer.ts.html +2075 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcSign.ts.html +1157 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/DlcTransactions.ts.html +719 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/EventDescriptor.ts.html +962 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/FundingInput.ts.html +860 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/FundingSignatures.ts.html +374 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/FundingSignaturesV0.ts.html +344 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/NegotiationFields.ts.html +848 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/NodeAnnouncementMessage.ts.html +515 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleAnnouncement.ts.html +608 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleAnnouncementV0.ts.html +383 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleAttestation.ts.html +956 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleAttestationV0.ts.html +479 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleEvent.ts.html +830 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleEventContainer.ts.html +347 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleEventContainerV0.ts.html +347 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleEventV0.ts.html +503 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleIdentifier.ts.html +314 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleIdentifierV0.ts.html +314 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleInfo.ts.html +1658 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OracleInfoV0.ts.html +308 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderAccept.ts.html +602 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderIrcInfo.ts.html +380 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderMetadata.ts.html +437 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderNegotiationFields.ts.html +710 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderOffer.ts.html +1334 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/OrderPositionInfo.ts.html +521 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/PayoutCurvePiece.ts.html +1442 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/PayoutFunction.ts.html +806 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/RoundingIntervals.ts.html +464 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/RoundingIntervalsV0.ts.html +428 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/ScriptWitnessV0.ts.html +269 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/messages/index.html +651 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/serialize/F64.ts.html +1091 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/serialize/deserializeTlv.ts.html +125 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/serialize/getTlv.ts.html +143 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/serialize/index.html +141 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/util.ts.html +191 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/validation/index.html +111 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/lib/validation/validate.ts.html +182 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/prettify.css +1 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/prettify.js +2 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov-report/sorter.js +170 -0
- package/.yalc/@node-dlc/messaging/coverage/lcov.info +5617 -0
- package/.yalc/@node-dlc/messaging/dist/MessageType.d.ts +101 -0
- package/.yalc/@node-dlc/messaging/dist/MessageType.js +118 -0
- package/.yalc/@node-dlc/messaging/dist/MessageType.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainManager.d.ts +50 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainManager.js +212 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainManager.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainMemoryStore.d.ts +14 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainMemoryStore.js +28 -0
- package/.yalc/@node-dlc/messaging/dist/chain/ChainMemoryStore.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/chain/DlcStore.d.ts +11 -0
- package/.yalc/@node-dlc/messaging/dist/chain/DlcStore.js +3 -0
- package/.yalc/@node-dlc/messaging/dist/chain/DlcStore.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/chain/IChainFilterChainClient.d.ts +48 -0
- package/.yalc/@node-dlc/messaging/dist/chain/IChainFilterChainClient.js +3 -0
- package/.yalc/@node-dlc/messaging/dist/chain/IChainFilterChainClient.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/domain/Address.d.ts +24 -0
- package/.yalc/@node-dlc/messaging/dist/domain/Address.js +46 -0
- package/.yalc/@node-dlc/messaging/dist/domain/Address.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/index.d.ts +45 -0
- package/.yalc/@node-dlc/messaging/dist/index.js +64 -0
- package/.yalc/@node-dlc/messaging/dist/index.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/irc/IrcMessage.d.ts +43 -0
- package/.yalc/@node-dlc/messaging/dist/irc/IrcMessage.js +116 -0
- package/.yalc/@node-dlc/messaging/dist/irc/IrcMessage.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/AddressCache.d.ts +15 -0
- package/.yalc/@node-dlc/messaging/dist/messages/AddressCache.js +51 -0
- package/.yalc/@node-dlc/messaging/dist/messages/AddressCache.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/BatchFundingGroup.d.ts +61 -0
- package/.yalc/@node-dlc/messaging/dist/messages/BatchFundingGroup.js +113 -0
- package/.yalc/@node-dlc/messaging/dist/messages/BatchFundingGroup.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignatures.d.ts +40 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignatures.js +67 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignatures.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignaturesV0.d.ts +42 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignaturesV0.js +68 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CetAdaptorSignaturesV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CloseTLV.d.ts +38 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CloseTLV.js +59 -0
- package/.yalc/@node-dlc/messaging/dist/messages/CloseTLV.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractDescriptor.d.ts +121 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractDescriptor.js +221 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractDescriptor.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractInfo.d.ts +135 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractInfo.js +308 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ContractInfo.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcAccept.d.ts +160 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcAccept.js +469 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcAccept.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCancel.d.ts +31 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCancel.js +51 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCancel.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcClose.d.ts +68 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcClose.js +214 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcClose.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCloseMetadata.d.ts +44 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCloseMetadata.js +74 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcCloseMetadata.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcIds.d.ts +26 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcIds.js +58 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcIds.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInfo.d.ts +31 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInfo.js +61 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInfo.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInput.d.ts +56 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInput.js +135 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcInput.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcMessage.d.ts +23 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcMessage.js +54 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcMessage.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcOffer.d.ts +146 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcOffer.js +463 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcOffer.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcSign.d.ts +96 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcSign.js +275 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcSign.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcTransactions.d.ts +69 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcTransactions.js +149 -0
- package/.yalc/@node-dlc/messaging/dist/messages/DlcTransactions.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/EventDescriptor.d.ts +107 -0
- package/.yalc/@node-dlc/messaging/dist/messages/EventDescriptor.js +212 -0
- package/.yalc/@node-dlc/messaging/dist/messages/EventDescriptor.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingInput.d.ts +69 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingInput.js +193 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingInput.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignatures.d.ts +36 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignatures.js +78 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignatures.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignaturesV0.d.ts +34 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignaturesV0.js +72 -0
- package/.yalc/@node-dlc/messaging/dist/messages/FundingSignaturesV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/IWireMessage.d.ts +6 -0
- package/.yalc/@node-dlc/messaging/dist/messages/IWireMessage.js +3 -0
- package/.yalc/@node-dlc/messaging/dist/messages/IWireMessage.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NegotiationFields.d.ts +86 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NegotiationFields.js +189 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NegotiationFields.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NodeAnnouncementMessage.d.ts +57 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NodeAnnouncementMessage.js +127 -0
- package/.yalc/@node-dlc/messaging/dist/messages/NodeAnnouncementMessage.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncement.d.ts +76 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncement.js +131 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncement.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncementV0.d.ts +47 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncementV0.js +76 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAnnouncementV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestation.d.ts +68 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestation.js +239 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestation.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestationV0.d.ts +48 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestationV0.js +100 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleAttestationV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEvent.d.ts +90 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEvent.js +189 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEvent.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainer.d.ts +32 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainer.js +67 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainer.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainerV0.d.ts +32 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainerV0.js +67 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventContainerV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventV0.d.ts +54 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventV0.js +100 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleEventV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifier.d.ts +32 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifier.js +58 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifier.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifierV0.d.ts +32 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifierV0.js +58 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleIdentifierV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfo.d.ts +163 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfo.js +393 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfo.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfoV0.d.ts +35 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfoV0.js +58 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OracleInfoV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderAccept.d.ts +66 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderAccept.js +140 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderAccept.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderIrcInfo.d.ts +42 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderIrcInfo.js +74 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderIrcInfo.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderMetadata.d.ts +56 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderMetadata.js +87 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderMetadata.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderNegotiationFields.d.ts +81 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderNegotiationFields.js +161 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderNegotiationFields.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderOffer.d.ts +97 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderOffer.js +296 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderOffer.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderPositionInfo.d.ts +44 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderPositionInfo.js +111 -0
- package/.yalc/@node-dlc/messaging/dist/messages/OrderPositionInfo.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutCurvePiece.d.ts +129 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutCurvePiece.js +332 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutCurvePiece.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutFunction.d.ts +66 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutFunction.js +173 -0
- package/.yalc/@node-dlc/messaging/dist/messages/PayoutFunction.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervals.d.ts +52 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervals.js +96 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervals.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervalsV0.d.ts +47 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervalsV0.js +86 -0
- package/.yalc/@node-dlc/messaging/dist/messages/RoundingIntervalsV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ScriptWitnessV0.d.ts +29 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ScriptWitnessV0.js +50 -0
- package/.yalc/@node-dlc/messaging/dist/messages/ScriptWitnessV0.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/messages/Tlv.d.ts +15 -0
- package/.yalc/@node-dlc/messaging/dist/messages/Tlv.js +32 -0
- package/.yalc/@node-dlc/messaging/dist/messages/Tlv.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/F64.d.ts +146 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/F64.js +294 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/F64.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/deserializeTlv.d.ts +9 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/deserializeTlv.js +11 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/deserializeTlv.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/getTlv.d.ts +4 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/getTlv.js +23 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/getTlv.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/readTlvs.d.ts +8 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/readTlvs.js +33 -0
- package/.yalc/@node-dlc/messaging/dist/serialize/readTlvs.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/util.d.ts +13 -0
- package/.yalc/@node-dlc/messaging/dist/util.js +42 -0
- package/.yalc/@node-dlc/messaging/dist/util.js.map +1 -0
- package/.yalc/@node-dlc/messaging/dist/validation/validate.d.ts +4 -0
- package/.yalc/@node-dlc/messaging/dist/validation/validate.js +31 -0
- package/.yalc/@node-dlc/messaging/dist/validation/validate.js.map +1 -0
- package/.yalc/@node-dlc/messaging/lib/MessageType.ts +140 -0
- package/.yalc/@node-dlc/messaging/lib/chain/ChainManager.ts +327 -0
- package/.yalc/@node-dlc/messaging/lib/chain/ChainMemoryStore.ts +34 -0
- package/.yalc/@node-dlc/messaging/lib/chain/DlcStore.ts +11 -0
- package/.yalc/@node-dlc/messaging/lib/chain/IChainFilterChainClient.ts +57 -0
- package/.yalc/@node-dlc/messaging/lib/domain/Address.ts +64 -0
- package/.yalc/@node-dlc/messaging/lib/index.ts +45 -0
- package/.yalc/@node-dlc/messaging/lib/irc/IrcMessage.ts +161 -0
- package/.yalc/@node-dlc/messaging/lib/messages/AddressCache.ts +74 -0
- package/.yalc/@node-dlc/messaging/lib/messages/BatchFundingGroup.ts +141 -0
- package/.yalc/@node-dlc/messaging/lib/messages/CetAdaptorSignatures.ts +89 -0
- package/.yalc/@node-dlc/messaging/lib/messages/ContractDescriptor.ts +317 -0
- package/.yalc/@node-dlc/messaging/lib/messages/ContractInfo.ts +439 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcAccept.ts +639 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcCancel.ts +57 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcClose.ts +305 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcCloseMetadata.ts +118 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcIds.ts +67 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcInfo.ts +81 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcInput.ts +167 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcMessage.ts +87 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcOffer.ts +665 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcSign.ts +359 -0
- package/.yalc/@node-dlc/messaging/lib/messages/DlcTransactions.ts +213 -0
- package/.yalc/@node-dlc/messaging/lib/messages/EventDescriptor.ts +294 -0
- package/.yalc/@node-dlc/messaging/lib/messages/FundingInput.ts +260 -0
- package/.yalc/@node-dlc/messaging/lib/messages/FundingSignatures.ts +98 -0
- package/.yalc/@node-dlc/messaging/lib/messages/IWireMessage.ts +6 -0
- package/.yalc/@node-dlc/messaging/lib/messages/NegotiationFields.ts +256 -0
- package/.yalc/@node-dlc/messaging/lib/messages/NodeAnnouncementMessage.ts +145 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleAnnouncement.ts +176 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleAttestation.ts +292 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleEvent.ts +250 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleEventContainer.ts +89 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleIdentifier.ts +78 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OracleInfo.ts +526 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderAccept.ts +174 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderIrcInfo.ts +100 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderMetadata.ts +119 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderNegotiationFields.ts +210 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderOffer.ts +418 -0
- package/.yalc/@node-dlc/messaging/lib/messages/OrderPositionInfo.ts +147 -0
- package/.yalc/@node-dlc/messaging/lib/messages/PayoutCurvePiece.ts +454 -0
- package/.yalc/@node-dlc/messaging/lib/messages/PayoutFunction.ts +242 -0
- package/.yalc/@node-dlc/messaging/lib/messages/RoundingIntervals.ts +128 -0
- package/.yalc/@node-dlc/messaging/lib/messages/ScriptWitnessV0.ts +63 -0
- package/.yalc/@node-dlc/messaging/lib/messages/Tlv.ts +40 -0
- package/.yalc/@node-dlc/messaging/lib/serialize/F64.ts +337 -0
- package/.yalc/@node-dlc/messaging/lib/serialize/deserializeTlv.ts +15 -0
- package/.yalc/@node-dlc/messaging/lib/serialize/getTlv.ts +21 -0
- package/.yalc/@node-dlc/messaging/lib/serialize/readTlvs.ts +37 -0
- package/.yalc/@node-dlc/messaging/lib/util.ts +37 -0
- package/.yalc/@node-dlc/messaging/lib/validation/validate.ts +34 -0
- package/.yalc/@node-dlc/messaging/package.json +42 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_3_of_3_test.json +212 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_3_of_5_test.json +470 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_and_numerical_3_of_5_test.json +1519 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_and_numerical_5_of_5_test.json +547 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_and_numerical_with_diff_3_of_5_test.json +4763 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_and_numerical_with_diff_5_of_5_test.json +2171 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/enum_single_oracle_test.json +166 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/single_oracle_numerical_hyperbola_test.json +504 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/single_oracle_numerical_test.json +264 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/three_of_five_oracle_numerical_with_diff_test.json +4384 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/three_of_three_oracle_numerical_test.json +326 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/three_of_three_oracle_numerical_with_diff_test.json +654 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/two_of_five_oracle_numerical_test.json +1140 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs/two_of_five_oracle_numerical_with_diff_test.json +2224 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_3_of_3_test.json +210 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_3_of_5_test.json +468 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_and_numerical_3_of_5_test.json +1517 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_and_numerical_5_of_5_test.json +545 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_and_numerical_with_diff_3_of_5_test.json +4761 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_and_numerical_with_diff_5_of_5_test.json +2169 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/enum_single_oracle_test.json +164 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/single_oracle_numerical_hyperbola_test.json +502 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/single_oracle_numerical_test.json +262 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/three_of_five_oracle_numerical_with_diff_test.json +4382 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/three_of_three_oracle_numerical_test.json +324 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/three_of_three_oracle_numerical_with_diff_test.json +652 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/two_of_five_oracle_numerical_test.json +1138 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250718_132453/two_of_five_oracle_numerical_with_diff_test.json +2222 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_3_of_3_test.json +212 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_3_of_5_test.json +470 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_and_numerical_3_of_5_test.json +1519 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_and_numerical_5_of_5_test.json +547 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_and_numerical_with_diff_3_of_5_test.json +4763 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_and_numerical_with_diff_5_of_5_test.json +2171 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/enum_single_oracle_test.json +166 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/single_oracle_numerical_hyperbola_test.json +504 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/single_oracle_numerical_test.json +264 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/three_of_five_oracle_numerical_with_diff_test.json +4384 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/three_of_three_oracle_numerical_test.json +326 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/three_of_three_oracle_numerical_with_diff_test.json +654 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/two_of_five_oracle_numerical_test.json +1140 -0
- package/.yalc/@node-dlc/messaging/test_vectors/dlcspecs_backup_20250719_185952/two_of_five_oracle_numerical_with_diff_test.json +2224 -0
- package/.yalc/@node-dlc/messaging/test_vectors/oracle/external_oracle_announcements.json +0 -0
- package/.yalc/@node-dlc/messaging/test_vectors/oracle/oracle_message_test_vectors.json +115 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/accept_msg.json +1465 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/dlc_fee_test.json +12362 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/dlc_fee_test_scripts.json +57 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/dlc_test.json +2766 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/dlc_tx_test.json +2899 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/offer_msg.json +163 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/offer_msg_disjoint.json +352 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/segment_chunk_msg.json +12635 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/segment_start_msg.json +4022 -0
- package/.yalc/@node-dlc/messaging/test_vectors/rust-dlc/sign_msg.json +383 -0
- package/.yalc/@node-dlc/messaging/tsconfig.json +7 -0
- package/.yalc/@node-dlc/messaging/yalc.sig +1 -0
- package/CHANGELOG.md +114 -0
- package/README.md +48 -0
- package/dist/BitcoinDlcProvider.d.ts +51 -21
- package/dist/BitcoinDlcProvider.js +956 -459
- package/dist/BitcoinDlcProvider.js.map +1 -1
- package/dist/utils/Utils.d.ts +6 -6
- package/dist/utils/Utils.js +9 -5
- package/dist/utils/Utils.js.map +1 -1
- package/lib/BitcoinDlcProvider.ts +1525 -818
- package/lib/utils/Utils.ts +21 -24
- package/package.json +10 -10
- package/yalc.lock +30 -0
|
@@ -28,19 +28,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const provider_1 = __importDefault(require("@atomicfinance/provider"));
|
|
30
30
|
const types_1 = require("@atomicfinance/types");
|
|
31
|
+
const Input_1 = require("@atomicfinance/types/lib/models/Input");
|
|
31
32
|
const utils_1 = require("@atomicfinance/utils");
|
|
32
33
|
const bitcoin_1 = require("@node-dlc/bitcoin");
|
|
33
34
|
const bufio_1 = require("@node-dlc/bufio");
|
|
34
35
|
const core_1 = require("@node-dlc/core");
|
|
36
|
+
const core_2 = require("@node-dlc/core");
|
|
35
37
|
const crypto_1 = require("@node-dlc/crypto");
|
|
36
38
|
const messaging_1 = require("@node-dlc/messaging");
|
|
37
39
|
const assert_1 = __importDefault(require("assert"));
|
|
38
40
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
39
41
|
const bitcoin_networks_1 = require("bitcoin-networks");
|
|
40
42
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
43
|
+
const crypto_2 = __importDefault(require("crypto"));
|
|
41
44
|
const ecc = __importStar(require("tiny-secp256k1"));
|
|
42
45
|
const Utils_1 = require("./utils/Utils");
|
|
43
46
|
class BitcoinDlcProvider extends provider_1.default {
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
48
|
constructor(network, cfdDlcJs) {
|
|
45
49
|
super();
|
|
46
50
|
this._network = network;
|
|
@@ -51,17 +55,83 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
51
55
|
await (0, utils_1.sleep)(10);
|
|
52
56
|
}
|
|
53
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Find private key for DLC funding pubkey by deriving wallet addresses
|
|
60
|
+
*/
|
|
61
|
+
async findDlcFundingPrivateKey(localFundPubkey, remoteFundPubkey) {
|
|
62
|
+
const targetPubkeys = [localFundPubkey, remoteFundPubkey];
|
|
63
|
+
// First check existing wallet addresses
|
|
64
|
+
const addresses = await this.getMethod('getAddresses')();
|
|
65
|
+
for (const addressInfo of addresses) {
|
|
66
|
+
if (addressInfo.derivationPath) {
|
|
67
|
+
try {
|
|
68
|
+
const keyPair = await this.getMethod('keyPair')(addressInfo.derivationPath);
|
|
69
|
+
const pubkey = Buffer.from(keyPair.publicKey);
|
|
70
|
+
const pubkeyHex = pubkey.toString('hex');
|
|
71
|
+
if (targetPubkeys.includes(pubkeyHex)) {
|
|
72
|
+
return Buffer.from(keyPair.privateKey).toString('hex');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// If not found in existing addresses, do comprehensive search
|
|
81
|
+
// For DLC splicing, funding pubkeys can be at much higher derivation paths
|
|
82
|
+
console.log('Searching extensively for DLC funding private key...');
|
|
83
|
+
for (const isChange of [false, true]) {
|
|
84
|
+
for (let i = 0; i < 1000; i++) {
|
|
85
|
+
// Search up to 1000 addresses for DLC keys
|
|
86
|
+
try {
|
|
87
|
+
const address = await this.client.wallet.getAddresses(i, 1, isChange);
|
|
88
|
+
if (address && address.length > 0) {
|
|
89
|
+
const addressInfo = address[0];
|
|
90
|
+
if (addressInfo.derivationPath) {
|
|
91
|
+
const keyPair = await this.getMethod('keyPair')(addressInfo.derivationPath);
|
|
92
|
+
const pubkey = Buffer.from(keyPair.publicKey);
|
|
93
|
+
const pubkeyHex = pubkey.toString('hex');
|
|
94
|
+
if (targetPubkeys.includes(pubkeyHex)) {
|
|
95
|
+
console.log(`Found DLC funding key at derivation path: ${addressInfo.derivationPath}`);
|
|
96
|
+
return Buffer.from(keyPair.privateKey).toString('hex');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Could not find private key for DLC funding pubkeys: local=${localFundPubkey}, remote=${remoteFundPubkey}`);
|
|
107
|
+
}
|
|
54
108
|
async GetPrivKeysForInputs(inputs) {
|
|
55
109
|
const privKeys = [];
|
|
56
110
|
for (let i = 0; i < inputs.length; i++) {
|
|
57
111
|
const input = inputs[i];
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
112
|
+
if (input.isDlcInput()) {
|
|
113
|
+
// Handle DLC input - use the dedicated method to find the funding private key
|
|
114
|
+
const dlcInput = input.dlcInput;
|
|
115
|
+
const foundPrivKey = await this.findDlcFundingPrivateKey(dlcInput.localFundPubkey, dlcInput.remoteFundPubkey);
|
|
116
|
+
privKeys.push(foundPrivKey);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Handle regular input
|
|
120
|
+
let derivationPath = input.derivationPath;
|
|
121
|
+
if (!derivationPath) {
|
|
122
|
+
try {
|
|
123
|
+
derivationPath = (await this.getMethod('getWalletAddress')(input.address)).derivationPath;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new Error(`Unable to find address ${input.address} in wallet. ` +
|
|
127
|
+
`This may happen when using derivation paths outside the normal range. ` +
|
|
128
|
+
`Error: ${error.message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const keyPair = await this.getMethod('keyPair')(derivationPath);
|
|
132
|
+
const privKey = Buffer.from(keyPair.__D).toString('hex');
|
|
133
|
+
privKeys.push(privKey);
|
|
61
134
|
}
|
|
62
|
-
const keyPair = await this.getMethod('keyPair')(derivationPath);
|
|
63
|
-
const privKey = Buffer.from(keyPair.__D).toString('hex');
|
|
64
|
-
privKeys.push(privKey);
|
|
65
135
|
}
|
|
66
136
|
return privKeys;
|
|
67
137
|
}
|
|
@@ -76,6 +146,34 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
76
146
|
return 'bitcoin';
|
|
77
147
|
}
|
|
78
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Get inputs for amount with explicit supplementation control
|
|
151
|
+
*/
|
|
152
|
+
async GetInputsForAmountWithMode(amounts, feeRatePerVb, fixedInputs = [], supplementation = Input_1.InputSupplementationMode.Required) {
|
|
153
|
+
if (amounts.length === 0)
|
|
154
|
+
return [];
|
|
155
|
+
// For "none" mode, use exactly the provided inputs
|
|
156
|
+
if (supplementation === Input_1.InputSupplementationMode.None) {
|
|
157
|
+
return fixedInputs;
|
|
158
|
+
}
|
|
159
|
+
// For "required" and "optional" modes, attempt supplementation
|
|
160
|
+
const fixedUtxos = fixedInputs.map((input) => input.toUtxo());
|
|
161
|
+
try {
|
|
162
|
+
const inputsForAmount = await this.getMethod('getInputsForDualFunding')(amounts, feeRatePerVb, fixedUtxos);
|
|
163
|
+
// Convert UTXO objects to Input class instances
|
|
164
|
+
return inputsForAmount.inputs.map((utxo) => types_1.Input.fromUTXO(utxo));
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
const errorMessage = e instanceof Error ? e.message : 'Unknown error';
|
|
168
|
+
if (supplementation === Input_1.InputSupplementationMode.Required) {
|
|
169
|
+
throw Error(`Not enough balance GetInputsForAmountWithMode. Error: ${errorMessage}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Optional mode: fallback to provided inputs
|
|
173
|
+
return fixedInputs;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
79
177
|
async GetInputsForAmount(amounts, feeRatePerVb, fixedInputs = []) {
|
|
80
178
|
if (amounts.length === 0)
|
|
81
179
|
return [];
|
|
@@ -83,7 +181,8 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
83
181
|
let inputs;
|
|
84
182
|
try {
|
|
85
183
|
const inputsForAmount = await this.getMethod('getInputsForDualFunding')(amounts, feeRatePerVb, fixedUtxos);
|
|
86
|
-
|
|
184
|
+
// Convert UTXO objects to Input class instances
|
|
185
|
+
inputs = inputsForAmount.inputs.map((utxo) => types_1.Input.fromUTXO(utxo));
|
|
87
186
|
}
|
|
88
187
|
catch (e) {
|
|
89
188
|
const errorMessage = e instanceof Error ? e.message : 'Unknown error';
|
|
@@ -96,7 +195,7 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
96
195
|
}
|
|
97
196
|
return inputs;
|
|
98
197
|
}
|
|
99
|
-
async Initialize(collateral, feeRatePerVb, fixedInputs) {
|
|
198
|
+
async Initialize(collateral, feeRatePerVb, fixedInputs, inputSupplementationMode = Input_1.InputSupplementationMode.Required) {
|
|
100
199
|
const network = await this.getConnectedNetwork();
|
|
101
200
|
const payoutAddress = await this.client.wallet.getUnusedAddress(false);
|
|
102
201
|
const payoutSPK = bitcoinjs_lib_1.address.toOutputScript(payoutAddress.address, network);
|
|
@@ -106,7 +205,7 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
106
205
|
const fundingPubKey = Buffer.from(fundingAddress.publicKey, 'hex');
|
|
107
206
|
if (fundingAddress.address === payoutAddress.address)
|
|
108
207
|
throw Error('Address reuse');
|
|
109
|
-
const inputs = await this.
|
|
208
|
+
const inputs = await this.GetInputsForAmountWithMode([collateral], feeRatePerVb, fixedInputs, inputSupplementationMode);
|
|
110
209
|
const fundingInputs = await Promise.all(inputs.map(async (input) => {
|
|
111
210
|
return this.inputToFundingInput(input);
|
|
112
211
|
}));
|
|
@@ -123,7 +222,7 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
123
222
|
}
|
|
124
223
|
async BatchInitialize(collaterals, feeRatePerVb, fixedInputs) {
|
|
125
224
|
const network = await this.getConnectedNetwork();
|
|
126
|
-
const inputs = await this.
|
|
225
|
+
const inputs = await this.GetInputsForAmountWithMode(collaterals, feeRatePerVb, fixedInputs, Input_1.InputSupplementationMode.Required);
|
|
127
226
|
const fundingInputs = await Promise.all(inputs.map(async (input) => {
|
|
128
227
|
return this.inputToFundingInput(input);
|
|
129
228
|
}));
|
|
@@ -155,73 +254,63 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
155
254
|
* totalCollateral: bigint,
|
|
156
255
|
* ): PayoutRequest[] {}
|
|
157
256
|
*/
|
|
158
|
-
GetPayoutsFromPayoutFunction(
|
|
159
|
-
if (_dlcOffer.type !== messaging_1.MessageType.DlcOfferV0)
|
|
160
|
-
throw Error('DlcOffer must be V0');
|
|
161
|
-
const dlcOffer = _dlcOffer;
|
|
162
|
-
if (contractDescriptor.payoutFunction.type !== messaging_1.MessageType.PayoutFunctionV0)
|
|
163
|
-
throw Error('PayoutFunction must be V0');
|
|
257
|
+
GetPayoutsFromPayoutFunction(dlcOffer, contractDescriptor, oracleInfo, totalCollateral) {
|
|
164
258
|
const payoutFunction = contractDescriptor.payoutFunction;
|
|
165
|
-
if (payoutFunction.
|
|
259
|
+
if (payoutFunction.payoutFunctionPieces.length === 0)
|
|
166
260
|
throw Error('PayoutFunction must have at least once PayoutCurvePiece');
|
|
167
|
-
if (payoutFunction.
|
|
261
|
+
if (payoutFunction.payoutFunctionPieces.length > 1)
|
|
168
262
|
throw Error('More than one PayoutCurvePiece not supported');
|
|
169
|
-
const payoutCurvePiece = payoutFunction.
|
|
263
|
+
const payoutCurvePiece = payoutFunction.payoutFunctionPieces[0]
|
|
170
264
|
.payoutCurvePiece;
|
|
171
|
-
if (payoutCurvePiece.
|
|
172
|
-
payoutCurvePiece.type !== messaging_1.MessageType.OldHyperbolaPayoutCurvePiece)
|
|
265
|
+
if (payoutCurvePiece.payoutCurvePieceType !== messaging_1.PayoutCurvePieceType.Hyperbola)
|
|
173
266
|
throw Error('Must be HyperbolaPayoutCurvePiece');
|
|
174
|
-
if (payoutCurvePiece.b
|
|
267
|
+
if (!payoutCurvePiece.b.eq(messaging_1.F64.ZERO) || !payoutCurvePiece.c.eq(messaging_1.F64.ZERO))
|
|
175
268
|
throw Error('b and c HyperbolaPayoutCurvePiece values must be 0');
|
|
176
|
-
|
|
269
|
+
// Cast to SingleOracleInfo to access announcement property
|
|
270
|
+
const singleOracleInfo = oracleInfo;
|
|
271
|
+
const eventDescriptor = singleOracleInfo.announcement.oracleEvent
|
|
177
272
|
.eventDescriptor;
|
|
178
|
-
if (eventDescriptor.type !== messaging_1.MessageType.
|
|
273
|
+
if (eventDescriptor.type !== messaging_1.MessageType.DigitDecompositionEventDescriptor)
|
|
179
274
|
throw Error('Only DigitDecomposition Oracle Events supported');
|
|
180
275
|
const roundingIntervals = contractDescriptor.roundingIntervals;
|
|
181
|
-
const cetPayouts =
|
|
276
|
+
const cetPayouts = core_2.HyperbolaPayoutCurve.computePayouts(payoutFunction, totalCollateral, roundingIntervals);
|
|
182
277
|
const payoutGroups = [];
|
|
183
278
|
cetPayouts.forEach((p) => {
|
|
184
279
|
payoutGroups.push({
|
|
185
280
|
payout: p.payout,
|
|
186
|
-
groups: (0,
|
|
281
|
+
groups: (0, core_2.groupByIgnoringDigits)(p.indexFrom, p.indexTo, eventDescriptor.base, contractDescriptor.numDigits),
|
|
187
282
|
});
|
|
188
283
|
});
|
|
189
|
-
const rValuesMessagesList = this.GenerateMessages(
|
|
190
|
-
const { payouts, messagesList } = (0, Utils_1.outputsToPayouts)(payoutGroups, rValuesMessagesList, dlcOffer.
|
|
284
|
+
const rValuesMessagesList = this.GenerateMessages(singleOracleInfo);
|
|
285
|
+
const { payouts, messagesList } = (0, Utils_1.outputsToPayouts)(payoutGroups, rValuesMessagesList, dlcOffer.offerCollateral, dlcOffer.contractInfo.totalCollateral - dlcOffer.offerCollateral, true);
|
|
191
286
|
return { payouts, payoutGroups, messagesList };
|
|
192
287
|
}
|
|
193
|
-
GetPayoutsFromPolynomialPayoutFunction(
|
|
194
|
-
if (_dlcOffer.type !== messaging_1.MessageType.DlcOfferV0)
|
|
195
|
-
throw Error('DlcOffer must be V0');
|
|
196
|
-
const dlcOffer = _dlcOffer;
|
|
197
|
-
if (contractDescriptor.payoutFunction.type !== messaging_1.MessageType.PayoutFunctionV0)
|
|
198
|
-
throw Error('PayoutFunction must be V0');
|
|
288
|
+
GetPayoutsFromPolynomialPayoutFunction(dlcOffer, contractDescriptor, oracleInfo, totalCollateral) {
|
|
199
289
|
const payoutFunction = contractDescriptor.payoutFunction;
|
|
200
|
-
if (payoutFunction.
|
|
290
|
+
if (payoutFunction.payoutFunctionPieces.length === 0)
|
|
201
291
|
throw Error('PayoutFunction must have at least once PayoutCurvePiece');
|
|
202
|
-
for (const piece of payoutFunction.
|
|
292
|
+
for (const piece of payoutFunction.payoutFunctionPieces) {
|
|
203
293
|
if (piece.payoutCurvePiece.type !== messaging_1.MessageType.PolynomialPayoutCurvePiece)
|
|
204
294
|
throw Error('Must be PolynomialPayoutCurvePiece');
|
|
205
295
|
}
|
|
206
296
|
const eventDescriptor = oracleInfo.announcement.oracleEvent
|
|
207
297
|
.eventDescriptor;
|
|
208
|
-
if (eventDescriptor.type !== messaging_1.MessageType.
|
|
298
|
+
if (eventDescriptor.type !== messaging_1.MessageType.DigitDecompositionEventDescriptor)
|
|
209
299
|
throw Error('Only DigitDecomposition Oracle Events supported');
|
|
210
300
|
const roundingIntervals = contractDescriptor.roundingIntervals;
|
|
211
|
-
const cetPayouts =
|
|
301
|
+
const cetPayouts = core_2.PolynomialPayoutCurve.computePayouts(payoutFunction, totalCollateral, roundingIntervals);
|
|
212
302
|
const payoutGroups = [];
|
|
213
303
|
cetPayouts.forEach((p) => {
|
|
214
304
|
payoutGroups.push({
|
|
215
305
|
payout: p.payout,
|
|
216
|
-
groups: (0,
|
|
306
|
+
groups: (0, core_2.groupByIgnoringDigits)(p.indexFrom, p.indexTo, eventDescriptor.base, contractDescriptor.numDigits),
|
|
217
307
|
});
|
|
218
308
|
});
|
|
219
309
|
const rValuesMessagesList = this.GenerateMessages(oracleInfo);
|
|
220
|
-
const { payouts, messagesList } = (0, Utils_1.outputsToPayouts)(payoutGroups, rValuesMessagesList, dlcOffer.
|
|
310
|
+
const { payouts, messagesList } = (0, Utils_1.outputsToPayouts)(payoutGroups, rValuesMessagesList, dlcOffer.offerCollateral, dlcOffer.contractInfo.totalCollateral - dlcOffer.offerCollateral, true);
|
|
221
311
|
return { payouts, payoutGroups, messagesList };
|
|
222
312
|
}
|
|
223
|
-
GetPayouts(
|
|
224
|
-
const { dlcOffer } = (0, Utils_1.checkTypes)({ _dlcOffer });
|
|
313
|
+
GetPayouts(dlcOffer) {
|
|
225
314
|
const contractInfo = dlcOffer.contractInfo;
|
|
226
315
|
const totalCollateral = contractInfo.totalCollateral;
|
|
227
316
|
const contractOraclePairs = this.GetContractOraclePairs(contractInfo);
|
|
@@ -247,127 +336,200 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
247
336
|
});
|
|
248
337
|
}, [{ startingMessagesIndex: 0, startingPayoutGroupsIndex: 0 }]);
|
|
249
338
|
}
|
|
339
|
+
GetPayoutsFromEnumeratedDescriptor(dlcOffer, contractDescriptor, oracleInfo, totalCollateral) {
|
|
340
|
+
const payoutGroups = [];
|
|
341
|
+
const rValuesMessagesList = this.GenerateMessages(oracleInfo);
|
|
342
|
+
// For enumerated descriptors, each outcome creates one payout
|
|
343
|
+
// Each outcome maps to one index in the oracle's possible outcomes
|
|
344
|
+
contractDescriptor.outcomes.forEach((outcome, index) => {
|
|
345
|
+
payoutGroups.push({
|
|
346
|
+
payout: outcome.localPayout,
|
|
347
|
+
groups: [[index]], // Simple index-based grouping for enum outcomes
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
const { payouts, messagesList } = (0, Utils_1.outputsToPayouts)(payoutGroups, rValuesMessagesList, dlcOffer.offerCollateral, totalCollateral - dlcOffer.offerCollateral, true);
|
|
351
|
+
return { payouts, payoutGroups, messagesList };
|
|
352
|
+
}
|
|
250
353
|
GetPayoutsFromContractDescriptor(dlcOffer, contractDescriptor, oracleInfo, totalCollateral) {
|
|
251
|
-
switch (contractDescriptor.
|
|
252
|
-
case messaging_1.
|
|
253
|
-
|
|
354
|
+
switch (contractDescriptor.contractDescriptorType) {
|
|
355
|
+
case messaging_1.ContractDescriptorType.Enumerated: {
|
|
356
|
+
return this.GetPayoutsFromEnumeratedDescriptor(dlcOffer, contractDescriptor, oracleInfo, totalCollateral);
|
|
254
357
|
}
|
|
255
|
-
case messaging_1.
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
return this.GetPayoutsFromPayoutFunction(dlcOffer, contractDescriptor, oracleInfo, totalCollateral);
|
|
266
|
-
case messaging_1.MessageType.PolynomialPayoutCurvePiece:
|
|
267
|
-
return this.GetPayoutsFromPolynomialPayoutFunction(dlcOffer, contractDescriptor, oracleInfo, totalCollateral);
|
|
268
|
-
}
|
|
358
|
+
case messaging_1.ContractDescriptorType.NumericOutcome: {
|
|
359
|
+
const numericalDescriptor = contractDescriptor;
|
|
360
|
+
const payoutFunction = numericalDescriptor.payoutFunction;
|
|
361
|
+
// TODO: add a better check for this
|
|
362
|
+
const payoutCurvePiece = payoutFunction.payoutFunctionPieces[0].payoutCurvePiece;
|
|
363
|
+
switch (payoutCurvePiece.payoutCurvePieceType) {
|
|
364
|
+
case messaging_1.PayoutCurvePieceType.Hyperbola:
|
|
365
|
+
return this.GetPayoutsFromPayoutFunction(dlcOffer, numericalDescriptor, oracleInfo, totalCollateral);
|
|
366
|
+
case messaging_1.PayoutCurvePieceType.Polynomial:
|
|
367
|
+
return this.GetPayoutsFromPolynomialPayoutFunction(dlcOffer, numericalDescriptor, oracleInfo, totalCollateral);
|
|
269
368
|
}
|
|
270
|
-
break;
|
|
271
|
-
default: {
|
|
272
|
-
throw Error('ContractDescriptor must be V0 or V1');
|
|
273
369
|
}
|
|
274
370
|
}
|
|
275
371
|
}
|
|
276
|
-
async createDlcTxs(
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
const
|
|
285
|
-
const
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
372
|
+
async createDlcTxs(dlcOffer, dlcAccept) {
|
|
373
|
+
const localFundPubkey = dlcOffer.fundingPubkey.toString('hex');
|
|
374
|
+
const remoteFundPubkey = dlcAccept.fundingPubkey.toString('hex');
|
|
375
|
+
const localFinalScriptPubkey = dlcOffer.payoutSpk.toString('hex');
|
|
376
|
+
const remoteFinalScriptPubkey = dlcAccept.payoutSpk.toString('hex');
|
|
377
|
+
const localChangeScriptPubkey = dlcOffer.changeSpk.toString('hex');
|
|
378
|
+
const remoteChangeScriptPubkey = dlcAccept.changeSpk.toString('hex');
|
|
379
|
+
// Separate regular inputs from DLC inputs (only from offeror side)
|
|
380
|
+
const localRegularInputs = [];
|
|
381
|
+
const localDlcInputs = [];
|
|
382
|
+
for (const fundingInput of dlcOffer.fundingInputs) {
|
|
383
|
+
if (fundingInput.dlcInput) {
|
|
384
|
+
// This is a DLC input for splicing
|
|
385
|
+
// The pubkeys should be from the original DLC to correctly spend its funding output
|
|
386
|
+
localDlcInputs.push({
|
|
387
|
+
fundTxid: fundingInput.prevTx.txId.toString(),
|
|
388
|
+
fundVout: fundingInput.prevTxVout,
|
|
389
|
+
fundAmount: Number(fundingInput.prevTx.outputs[fundingInput.prevTxVout].value.sats),
|
|
390
|
+
localFundPubkey: fundingInput.dlcInput.localFundPubkey.toString('hex'),
|
|
391
|
+
remoteFundPubkey: fundingInput.dlcInput.remoteFundPubkey.toString('hex'),
|
|
392
|
+
contractId: fundingInput.dlcInput.contractId.toString('hex'),
|
|
393
|
+
maxWitnessLength: fundingInput.maxWitnessLen,
|
|
394
|
+
inputSerialId: fundingInput.inputSerialId,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
// Regular input
|
|
399
|
+
const input = await this.fundingInputToInput(fundingInput, false);
|
|
400
|
+
localRegularInputs.push(input.toUtxo());
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Process remote inputs (no DLC inputs from acceptor side)
|
|
291
404
|
const remoteInputs = await Promise.all(dlcAccept.fundingInputs.map(async (fundingInput) => {
|
|
292
405
|
const input = await this.fundingInputToInput(fundingInput, false);
|
|
293
406
|
return input.toUtxo();
|
|
294
407
|
}));
|
|
295
|
-
|
|
408
|
+
// Calculate input amounts
|
|
409
|
+
const localInputAmount = localRegularInputs.reduce((prev, cur) => prev + cur.amount.GetSatoshiAmount(), 0);
|
|
296
410
|
const remoteInputAmount = remoteInputs.reduce((prev, cur) => prev + cur.amount.GetSatoshiAmount(), 0);
|
|
297
411
|
let payouts = [];
|
|
298
412
|
let messagesList = [];
|
|
299
|
-
if (dlcOffer.contractInfo.type === messaging_1.MessageType.
|
|
413
|
+
if (dlcOffer.contractInfo.type === messaging_1.MessageType.SingleContractInfo &&
|
|
300
414
|
dlcOffer.contractInfo.contractDescriptor.type ===
|
|
301
|
-
messaging_1.
|
|
415
|
+
messaging_1.ContractDescriptorType.Enumerated) {
|
|
302
416
|
for (const outcome of dlcOffer.contractInfo
|
|
303
417
|
.contractDescriptor.outcomes) {
|
|
304
418
|
payouts.push({
|
|
305
419
|
local: outcome.localPayout,
|
|
306
|
-
remote: dlcOffer.
|
|
307
|
-
dlcAccept.
|
|
420
|
+
remote: dlcOffer.offerCollateral +
|
|
421
|
+
dlcAccept.acceptCollateral -
|
|
308
422
|
outcome.localPayout,
|
|
309
423
|
});
|
|
310
|
-
messagesList.push({ messages: [outcome.outcome
|
|
424
|
+
messagesList.push({ messages: [outcome.outcome] });
|
|
311
425
|
}
|
|
312
426
|
}
|
|
313
427
|
else {
|
|
314
428
|
const payoutResponses = this.GetPayouts(dlcOffer);
|
|
315
|
-
const { payouts: tempPayouts, messagesList: tempMessagesList
|
|
429
|
+
const { payouts: tempPayouts, messagesList: tempMessagesList } = this.FlattenPayouts(payoutResponses);
|
|
316
430
|
payouts = tempPayouts;
|
|
317
431
|
messagesList = tempMessagesList;
|
|
318
432
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
433
|
+
// Determine whether to use regular or spliced DLC transactions
|
|
434
|
+
const hasDlcInputs = localDlcInputs.length > 0;
|
|
435
|
+
let dlcTxs;
|
|
436
|
+
if (hasDlcInputs) {
|
|
437
|
+
// Use spliced DLC transactions when DLC inputs are present
|
|
438
|
+
const splicedDlcTxRequest = {
|
|
439
|
+
payouts,
|
|
440
|
+
localFundPubkey,
|
|
441
|
+
localFinalScriptPubkey,
|
|
442
|
+
remoteFundPubkey,
|
|
443
|
+
remoteFinalScriptPubkey,
|
|
444
|
+
localInputAmount,
|
|
445
|
+
localCollateralAmount: dlcOffer.offerCollateral,
|
|
446
|
+
localPayoutSerialId: dlcOffer.payoutSerialId,
|
|
447
|
+
localChangeSerialId: dlcOffer.changeSerialId,
|
|
448
|
+
remoteInputAmount,
|
|
449
|
+
remoteCollateralAmount: dlcAccept.acceptCollateral,
|
|
450
|
+
remotePayoutSerialId: dlcAccept.payoutSerialId,
|
|
451
|
+
remoteChangeSerialId: dlcAccept.changeSerialId,
|
|
452
|
+
refundLocktime: dlcOffer.refundLocktime,
|
|
453
|
+
localInputs: localRegularInputs,
|
|
454
|
+
localDlcInputs: localDlcInputs,
|
|
455
|
+
remoteInputs,
|
|
456
|
+
localChangeScriptPubkey,
|
|
457
|
+
remoteChangeScriptPubkey,
|
|
458
|
+
feeRate: Number(dlcOffer.feeRatePerVb),
|
|
459
|
+
cetLockTime: dlcOffer.cetLocktime,
|
|
460
|
+
fundOutputSerialId: dlcOffer.fundOutputSerialId,
|
|
461
|
+
};
|
|
462
|
+
dlcTxs = await this.CreateSplicedDlcTransactions(splicedDlcTxRequest);
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
// Use regular DLC transactions when no DLC inputs
|
|
466
|
+
const dlcTxRequest = {
|
|
467
|
+
payouts,
|
|
468
|
+
localFundPubkey,
|
|
469
|
+
localFinalScriptPubkey,
|
|
470
|
+
remoteFundPubkey,
|
|
471
|
+
remoteFinalScriptPubkey,
|
|
472
|
+
localInputAmount,
|
|
473
|
+
localCollateralAmount: dlcOffer.offerCollateral,
|
|
474
|
+
localPayoutSerialId: dlcOffer.payoutSerialId,
|
|
475
|
+
localChangeSerialId: dlcOffer.changeSerialId,
|
|
476
|
+
remoteInputAmount,
|
|
477
|
+
remoteCollateralAmount: dlcAccept.acceptCollateral,
|
|
478
|
+
remotePayoutSerialId: dlcAccept.payoutSerialId,
|
|
479
|
+
remoteChangeSerialId: dlcAccept.changeSerialId,
|
|
480
|
+
refundLocktime: dlcOffer.refundLocktime,
|
|
481
|
+
localInputs: localRegularInputs,
|
|
482
|
+
remoteInputs,
|
|
483
|
+
localChangeScriptPubkey,
|
|
484
|
+
remoteChangeScriptPubkey,
|
|
485
|
+
feeRate: Number(dlcOffer.feeRatePerVb),
|
|
486
|
+
cetLockTime: dlcOffer.cetLocktime,
|
|
487
|
+
fundOutputSerialId: dlcOffer.fundOutputSerialId,
|
|
488
|
+
};
|
|
489
|
+
dlcTxs = await this.CreateDlcTransactions(dlcTxRequest);
|
|
490
|
+
}
|
|
491
|
+
const dlcTransactions = new messaging_1.DlcTransactions();
|
|
344
492
|
dlcTransactions.fundTx = bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(dlcTxs.fundTxHex));
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
493
|
+
// Build serial IDs based on actual outputs in the transaction
|
|
494
|
+
const actualOutputs = dlcTransactions.fundTx.outputs;
|
|
495
|
+
const serialIds = [];
|
|
496
|
+
// Always include the funding output serial ID
|
|
497
|
+
serialIds.push(BigInt(dlcOffer.fundOutputSerialId));
|
|
498
|
+
// Only include change serial IDs if there are actually change outputs
|
|
499
|
+
// For exact amount DLCs with no change, there will be only 1 output (the funding output)
|
|
500
|
+
if (actualOutputs.length > 1) {
|
|
501
|
+
// Multiple outputs means there are change outputs
|
|
502
|
+
if (dlcOffer.offerCollateral > 0n) {
|
|
503
|
+
serialIds.push(BigInt(dlcOffer.changeSerialId));
|
|
504
|
+
}
|
|
505
|
+
if (dlcAccept.acceptCollateral > 0n) {
|
|
506
|
+
serialIds.push(BigInt(dlcAccept.changeSerialId));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
dlcTransactions.fundTxVout = serialIds
|
|
350
510
|
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
|
|
351
|
-
.findIndex((i) => BigInt(i) === BigInt(
|
|
511
|
+
.findIndex((i) => BigInt(i) === BigInt(dlcOffer.fundOutputSerialId));
|
|
512
|
+
// Validate that the calculated fundTxVout is valid
|
|
513
|
+
if (dlcTransactions.fundTxVout < 0 ||
|
|
514
|
+
dlcTransactions.fundTxVout >= dlcTransactions.fundTx.outputs.length) {
|
|
515
|
+
throw new Error(`Invalid fundTxVout calculation: calculated=${dlcTransactions.fundTxVout}, ` +
|
|
516
|
+
`fundTx.outputs.length=${dlcTransactions.fundTx.outputs.length}, ` +
|
|
517
|
+
`fundOutputSerialId=${dlcOffer.fundOutputSerialId}, ` +
|
|
518
|
+
`serialIds=[${serialIds.join(', ')}], ` +
|
|
519
|
+
`offerCollateral=${dlcOffer.offerCollateral}, ` +
|
|
520
|
+
`acceptCollateral=${dlcAccept.acceptCollateral}`);
|
|
521
|
+
}
|
|
522
|
+
dlcTransactions.cets = dlcTxs.cetsHex.map((cetHex) => bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(cetHex)));
|
|
352
523
|
dlcTransactions.refundTx = bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(dlcTxs.refundTxHex));
|
|
353
|
-
dlcTransactions.cets = dlcTxs.cetsHex.map((cetHex) => {
|
|
354
|
-
return bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(cetHex));
|
|
355
|
-
});
|
|
356
524
|
return { dlcTransactions, messagesList };
|
|
357
525
|
}
|
|
358
|
-
async createBatchDlcTxs(
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
const localFundPubkeys = dlcOffers.map((dlcOffer) => dlcOffer.fundingPubKey.toString('hex'));
|
|
366
|
-
const remoteFundPubkeys = dlcAccepts.map((dlcAccept) => dlcAccept.fundingPubKey.toString('hex'));
|
|
367
|
-
const localFinalScriptPubkeys = dlcOffers.map((dlcOffer) => dlcOffer.payoutSPK.toString('hex'));
|
|
368
|
-
const remoteFinalScriptPubkeys = dlcAccepts.map((dlcAccept) => dlcAccept.payoutSPK.toString('hex'));
|
|
369
|
-
const localChangeScriptPubkey = dlcOffers[0].changeSPK.toString('hex');
|
|
370
|
-
const remoteChangeScriptPubkey = dlcAccepts[0].changeSPK.toString('hex');
|
|
526
|
+
async createBatchDlcTxs(dlcOffers, dlcAccepts) {
|
|
527
|
+
const localFundPubkeys = dlcOffers.map((dlcOffer) => dlcOffer.fundingPubkey.toString('hex'));
|
|
528
|
+
const remoteFundPubkeys = dlcAccepts.map((dlcAccept) => dlcAccept.fundingPubkey.toString('hex'));
|
|
529
|
+
const localFinalScriptPubkeys = dlcOffers.map((dlcOffer) => dlcOffer.payoutSpk.toString('hex'));
|
|
530
|
+
const remoteFinalScriptPubkeys = dlcAccepts.map((dlcAccept) => dlcAccept.payoutSpk.toString('hex'));
|
|
531
|
+
const localChangeScriptPubkey = dlcOffers[0].changeSpk.toString('hex');
|
|
532
|
+
const remoteChangeScriptPubkey = dlcAccepts[0].changeSpk.toString('hex');
|
|
371
533
|
const localInputs = await Promise.all(dlcOffers[0].fundingInputs.map(async (fundingInput) => {
|
|
372
534
|
const input = await this.fundingInputToInput(fundingInput, false);
|
|
373
535
|
return input.toUtxo();
|
|
@@ -402,11 +564,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
402
564
|
remoteFundPubkeys,
|
|
403
565
|
remoteFinalScriptPubkeys,
|
|
404
566
|
localInputAmount,
|
|
405
|
-
localCollateralAmounts: dlcOffers.map((dlcOffer) => dlcOffer.
|
|
567
|
+
localCollateralAmounts: dlcOffers.map((dlcOffer) => dlcOffer.offerCollateral),
|
|
406
568
|
localPayoutSerialIds: dlcOffers.map((dlcOffer) => dlcOffer.payoutSerialId),
|
|
407
569
|
localChangeSerialId: dlcOffers[0].changeSerialId,
|
|
408
570
|
remoteInputAmount,
|
|
409
|
-
remoteCollateralAmounts: dlcAccepts.map((dlcAccept) => dlcAccept.
|
|
571
|
+
remoteCollateralAmounts: dlcAccepts.map((dlcAccept) => dlcAccept.acceptCollateral),
|
|
410
572
|
remotePayoutSerialIds: dlcAccepts.map((dlcAccept) => dlcAccept.payoutSerialId),
|
|
411
573
|
remoteChangeSerialId: dlcAccepts[0].changeSerialId,
|
|
412
574
|
refundLocktimes: dlcOffers.map((dlcOffer) => dlcOffer.refundLocktime),
|
|
@@ -422,7 +584,7 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
422
584
|
const dlcTransactionsList = [];
|
|
423
585
|
let start = 0;
|
|
424
586
|
for (let i = 0; i < dlcTxs.refundTxHexList.length; i++) {
|
|
425
|
-
const dlcTransactions = new messaging_1.
|
|
587
|
+
const dlcTransactions = new messaging_1.DlcTransactions();
|
|
426
588
|
dlcTransactions.fundTx = bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(dlcTxs.fundTxHex));
|
|
427
589
|
dlcTransactions.fundTxVout = [
|
|
428
590
|
BigInt(dlcOffers[i].changeSerialId),
|
|
@@ -444,7 +606,13 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
444
606
|
return { dlcTransactionsList, nestedMessagesList };
|
|
445
607
|
}
|
|
446
608
|
GenerateEnumMessages(oracleEvent) {
|
|
447
|
-
|
|
609
|
+
const eventDescriptor = oracleEvent.eventDescriptor;
|
|
610
|
+
// For enum events, each oracle has one nonce and can attest to one of the possible outcomes
|
|
611
|
+
const messagesList = [];
|
|
612
|
+
// For enum events, hash the outcomes to match the contract descriptor format
|
|
613
|
+
const messages = eventDescriptor.outcomes.map((outcome) => (0, crypto_1.sha256)(Buffer.from(outcome)).toString('hex'));
|
|
614
|
+
messagesList.push({ messages });
|
|
615
|
+
return messagesList;
|
|
448
616
|
}
|
|
449
617
|
GenerateDigitDecompositionMessages(oracleEvent) {
|
|
450
618
|
const oracleNonces = oracleEvent.oracleNonces;
|
|
@@ -461,33 +629,61 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
461
629
|
return messagesList;
|
|
462
630
|
}
|
|
463
631
|
GenerateMessages(oracleInfo) {
|
|
464
|
-
|
|
632
|
+
// Handle both SingleOracleInfo and MultiOracleInfo using type property instead of instanceof
|
|
633
|
+
let oracleEvent;
|
|
634
|
+
if (oracleInfo.type === messaging_1.MessageType.SingleOracleInfo) {
|
|
635
|
+
const singleOracleInfo = oracleInfo;
|
|
636
|
+
oracleEvent = singleOracleInfo.announcement.oracleEvent;
|
|
637
|
+
}
|
|
638
|
+
else if (oracleInfo.type === messaging_1.MessageType.MultiOracleInfo) {
|
|
639
|
+
const multiOracleInfo = oracleInfo;
|
|
640
|
+
// For multi-oracle, use the first announcement for now
|
|
641
|
+
// TODO: This might need more sophisticated handling for multi-oracle scenarios
|
|
642
|
+
if (multiOracleInfo.announcements.length === 0) {
|
|
643
|
+
throw Error('MultiOracleInfo must have at least one announcement');
|
|
644
|
+
}
|
|
645
|
+
oracleEvent = multiOracleInfo.announcements[0].oracleEvent;
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
throw Error(`OracleInfo must be SingleOracleInfo or MultiOracleInfo, got type: ${oracleInfo.type}`);
|
|
649
|
+
}
|
|
465
650
|
switch (oracleEvent.eventDescriptor.type) {
|
|
466
|
-
case messaging_1.MessageType.
|
|
651
|
+
case messaging_1.MessageType.EnumEventDescriptor:
|
|
467
652
|
return this.GenerateEnumMessages(oracleEvent);
|
|
468
|
-
case messaging_1.MessageType.
|
|
653
|
+
case messaging_1.MessageType.DigitDecompositionEventDescriptor:
|
|
469
654
|
return this.GenerateDigitDecompositionMessages(oracleEvent);
|
|
470
655
|
default:
|
|
471
656
|
throw Error('EventDescriptor must be Enum or DigitDecomposition');
|
|
472
657
|
}
|
|
473
658
|
}
|
|
474
659
|
GetContractOraclePairs(_contractInfo) {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
660
|
+
// Use contractInfoType property instead of instanceof for more reliable type checking
|
|
661
|
+
if (_contractInfo.contractInfoType === messaging_1.ContractInfoType.Single) {
|
|
662
|
+
const singleInfo = _contractInfo;
|
|
663
|
+
return [
|
|
664
|
+
{
|
|
665
|
+
contractDescriptor: singleInfo.contractDescriptor,
|
|
666
|
+
oracleInfo: singleInfo.oracleInfo,
|
|
667
|
+
},
|
|
668
|
+
];
|
|
669
|
+
}
|
|
670
|
+
else if (_contractInfo.contractInfoType === messaging_1.ContractInfoType.Disjoint) {
|
|
671
|
+
const disjointInfo = _contractInfo;
|
|
672
|
+
return disjointInfo.contractOraclePairs;
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
throw Error('ContractInfo must be Single or Disjoint');
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
getFundOutputValueSats(dlcTxs) {
|
|
679
|
+
const fundOutput = dlcTxs.fundTx.outputs[dlcTxs.fundTxVout];
|
|
680
|
+
if (!fundOutput || !fundOutput.value) {
|
|
681
|
+
throw new Error(`Invalid fund output at vout ${dlcTxs.fundTxVout}: ` +
|
|
682
|
+
`outputs.length=${dlcTxs.fundTx.outputs.length}, ` +
|
|
683
|
+
`output exists=${!!fundOutput}, ` +
|
|
684
|
+
`output.value exists=${!!(fundOutput && fundOutput.value)}`);
|
|
490
685
|
}
|
|
686
|
+
return fundOutput.value.sats;
|
|
491
687
|
}
|
|
492
688
|
async CreateCetAdaptorAndRefundSigs(_dlcOffer, _dlcAccept, _dlcTxs, messagesList, isOfferer) {
|
|
493
689
|
const { dlcOffer, dlcAccept, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
@@ -497,7 +693,7 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
497
693
|
});
|
|
498
694
|
const network = await this.getConnectedNetwork();
|
|
499
695
|
const cetsHex = dlcTxs.cets.map((cet) => cet.serialize().toString('hex'));
|
|
500
|
-
const fundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(isOfferer ? dlcOffer.
|
|
696
|
+
const fundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(isOfferer ? dlcOffer.fundingPubkey : dlcAccept.fundingPubkey))
|
|
501
697
|
.serialize()
|
|
502
698
|
.slice(1);
|
|
503
699
|
const fundingAddress = bitcoinjs_lib_1.address.fromOutputScript(fundingSPK, network);
|
|
@@ -508,11 +704,15 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
508
704
|
const fundPrivateKey = Buffer.from(fundPrivateKeyPair.__D).toString('hex');
|
|
509
705
|
const contractOraclePairs = this.GetContractOraclePairs(dlcOffer.contractInfo);
|
|
510
706
|
const sigs = [];
|
|
511
|
-
if (dlcOffer.contractInfo.
|
|
707
|
+
if (dlcOffer.contractInfo.contractInfoType === messaging_1.ContractInfoType.Single &&
|
|
512
708
|
dlcOffer.contractInfo.contractDescriptor.type ===
|
|
513
709
|
messaging_1.MessageType.ContractDescriptorV0) {
|
|
514
|
-
for (const
|
|
515
|
-
|
|
710
|
+
for (const { oracleInfo } of contractOraclePairs) {
|
|
711
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
712
|
+
throw new Error('Only SingleOracleInfo supported in this context');
|
|
713
|
+
}
|
|
714
|
+
const oracleAnnouncement = oracleInfo
|
|
715
|
+
.announcement;
|
|
516
716
|
const adaptorSigRequestPromises = [];
|
|
517
717
|
const tempMessagesList = messagesList;
|
|
518
718
|
const tempCetsHex = cetsHex;
|
|
@@ -522,9 +722,9 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
522
722
|
privkey: fundPrivateKey,
|
|
523
723
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
524
724
|
fundVout: dlcTxs.fundTxVout,
|
|
525
|
-
localFundPubkey: dlcOffer.
|
|
526
|
-
remoteFundPubkey: dlcAccept.
|
|
527
|
-
fundInputAmount:
|
|
725
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
726
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
727
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
528
728
|
oraclePubkey: oracleAnnouncement.oraclePubkey.toString('hex'),
|
|
529
729
|
oracleRValues: oracleAnnouncement.oracleEvent.oracleNonces.map((nonce) => nonce.toString('hex')),
|
|
530
730
|
};
|
|
@@ -544,7 +744,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
544
744
|
else {
|
|
545
745
|
const indices = this.GetIndicesFromPayouts(this.GetPayouts(_dlcOffer));
|
|
546
746
|
for (const [index, { oracleInfo }] of contractOraclePairs.entries()) {
|
|
547
|
-
|
|
747
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
748
|
+
throw new Error('Only SingleOracleInfo supported in this context');
|
|
749
|
+
}
|
|
750
|
+
const oracleAnnouncement = oracleInfo
|
|
751
|
+
.announcement;
|
|
548
752
|
const startingIndex = indices[index].startingMessagesIndex, endingIndex = indices[index + 1].startingMessagesIndex;
|
|
549
753
|
const oracleEventMessagesList = messagesList.slice(startingIndex, endingIndex);
|
|
550
754
|
const oracleEventCetsHex = cetsHex.slice(startingIndex, endingIndex);
|
|
@@ -559,9 +763,9 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
559
763
|
privkey: fundPrivateKey,
|
|
560
764
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
561
765
|
fundVout: dlcTxs.fundTxVout,
|
|
562
|
-
localFundPubkey: dlcOffer.
|
|
563
|
-
remoteFundPubkey: dlcAccept.
|
|
564
|
-
fundInputAmount:
|
|
766
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
767
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
768
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
565
769
|
oraclePubkey: oracleAnnouncement.oraclePubkey.toString('hex'),
|
|
566
770
|
oracleRValues: oracleAnnouncement.oracleEvent.oracleNonces.map((nonce) => nonce.toString('hex')),
|
|
567
771
|
};
|
|
@@ -584,12 +788,12 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
584
788
|
privkey: fundPrivateKey,
|
|
585
789
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
586
790
|
fundVout: dlcTxs.fundTxVout,
|
|
587
|
-
localFundPubkey: dlcOffer.
|
|
588
|
-
remoteFundPubkey: dlcAccept.
|
|
589
|
-
fundInputAmount:
|
|
791
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
792
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
793
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
590
794
|
};
|
|
591
795
|
const refundSignature = Buffer.from((await this.GetRawRefundTxSignature(refundSignRequest)).hex, 'hex');
|
|
592
|
-
const cetSignatures = new messaging_1.
|
|
796
|
+
const cetSignatures = new messaging_1.CetAdaptorSignatures();
|
|
593
797
|
cetSignatures.sigs = sigs.flat();
|
|
594
798
|
return { cetSignatures, refundSignature };
|
|
595
799
|
}
|
|
@@ -602,15 +806,19 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
602
806
|
});
|
|
603
807
|
const cetsHex = dlcTxs.cets.map((cet) => cet.serialize().toString('hex'));
|
|
604
808
|
const contractOraclePairs = this.GetContractOraclePairs(dlcOffer.contractInfo);
|
|
605
|
-
if (dlcOffer.contractInfo.type === messaging_1.MessageType.
|
|
809
|
+
if (dlcOffer.contractInfo.type === messaging_1.MessageType.SingleContractInfo &&
|
|
606
810
|
dlcOffer.contractInfo.contractDescriptor.type ===
|
|
607
811
|
messaging_1.MessageType.ContractDescriptorV0) {
|
|
608
|
-
for (const
|
|
609
|
-
|
|
812
|
+
for (const { oracleInfo } of contractOraclePairs) {
|
|
813
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
814
|
+
throw new Error('Only SingleOracleInfo supported in this context');
|
|
815
|
+
}
|
|
816
|
+
const oracleAnnouncement = oracleInfo
|
|
817
|
+
.announcement;
|
|
610
818
|
const oracleEventCetsHex = cetsHex;
|
|
611
819
|
const oracleEventSigs = isOfferer
|
|
612
|
-
? dlcAccept.
|
|
613
|
-
: dlcSign.
|
|
820
|
+
? dlcAccept.cetAdaptorSignatures.sigs
|
|
821
|
+
: dlcSign.cetAdaptorSignatures.sigs;
|
|
614
822
|
const sigsValidity = [];
|
|
615
823
|
const tempMessagesList = messagesList;
|
|
616
824
|
const tempCetsHex = oracleEventCetsHex;
|
|
@@ -627,11 +835,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
627
835
|
oraclePubkey: oracleAnnouncement.oraclePubkey.toString('hex'),
|
|
628
836
|
oracleRValues: oracleAnnouncement.oracleEvent.oracleNonces.map((nonce) => nonce.toString('hex')),
|
|
629
837
|
adaptorPairs: tempAdaptorPairs,
|
|
630
|
-
localFundPubkey: dlcOffer.
|
|
631
|
-
remoteFundPubkey: dlcAccept.
|
|
838
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
839
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
632
840
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
633
841
|
fundVout: dlcTxs.fundTxVout,
|
|
634
|
-
fundInputAmount:
|
|
842
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
635
843
|
verifyRemote: isOfferer,
|
|
636
844
|
};
|
|
637
845
|
sigsValidity.push((async () => {
|
|
@@ -644,11 +852,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
644
852
|
signature: isOfferer
|
|
645
853
|
? dlcAccept.refundSignature.toString('hex')
|
|
646
854
|
: dlcSign.refundSignature.toString('hex'),
|
|
647
|
-
localFundPubkey: dlcOffer.
|
|
648
|
-
remoteFundPubkey: dlcAccept.
|
|
855
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
856
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
649
857
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
650
858
|
fundVout: dlcTxs.fundTxVout,
|
|
651
|
-
fundInputAmount:
|
|
859
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
652
860
|
verifyRemote: isOfferer,
|
|
653
861
|
};
|
|
654
862
|
areSigsValid =
|
|
@@ -663,13 +871,17 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
663
871
|
const chunk = 100;
|
|
664
872
|
const indices = this.GetIndicesFromPayouts(this.GetPayouts(_dlcOffer));
|
|
665
873
|
for (const [index, { oracleInfo }] of contractOraclePairs.entries()) {
|
|
666
|
-
|
|
874
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
875
|
+
throw new Error('Only SingleOracleInfo supported in this context');
|
|
876
|
+
}
|
|
877
|
+
const oracleAnnouncement = oracleInfo
|
|
878
|
+
.announcement;
|
|
667
879
|
const startingIndex = indices[index].startingMessagesIndex, endingIndex = indices[index + 1].startingMessagesIndex;
|
|
668
880
|
const oracleEventMessagesList = messagesList.slice(startingIndex, endingIndex);
|
|
669
881
|
const oracleEventCetsHex = cetsHex.slice(startingIndex, endingIndex);
|
|
670
882
|
const oracleEventSigs = (isOfferer
|
|
671
|
-
? dlcAccept.
|
|
672
|
-
: dlcSign.
|
|
883
|
+
? dlcAccept.cetAdaptorSignatures.sigs
|
|
884
|
+
: dlcSign.cetAdaptorSignatures.sigs).slice(startingIndex, endingIndex);
|
|
673
885
|
const sigsValidity = [];
|
|
674
886
|
for (let i = 0, j = oracleEventMessagesList.length; i < j; i += chunk) {
|
|
675
887
|
const tempMessagesList = oracleEventMessagesList.slice(i, i + chunk);
|
|
@@ -687,11 +899,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
687
899
|
oraclePubkey: oracleAnnouncement.oraclePubkey.toString('hex'),
|
|
688
900
|
oracleRValues: oracleAnnouncement.oracleEvent.oracleNonces.map((nonce) => nonce.toString('hex')),
|
|
689
901
|
adaptorPairs: tempAdaptorPairs,
|
|
690
|
-
localFundPubkey: dlcOffer.
|
|
691
|
-
remoteFundPubkey: dlcAccept.
|
|
902
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
903
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
692
904
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
693
905
|
fundVout: dlcTxs.fundTxVout,
|
|
694
|
-
fundInputAmount:
|
|
906
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
695
907
|
verifyRemote: isOfferer,
|
|
696
908
|
};
|
|
697
909
|
sigsValidity.push((async () => {
|
|
@@ -705,11 +917,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
705
917
|
signature: isOfferer
|
|
706
918
|
? dlcAccept.refundSignature.toString('hex')
|
|
707
919
|
: dlcSign.refundSignature.toString('hex'),
|
|
708
|
-
localFundPubkey: dlcOffer.
|
|
709
|
-
remoteFundPubkey: dlcAccept.
|
|
920
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
921
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
710
922
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
711
923
|
fundVout: dlcTxs.fundTxVout,
|
|
712
|
-
fundInputAmount:
|
|
924
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
713
925
|
verifyRemote: isOfferer,
|
|
714
926
|
};
|
|
715
927
|
areSigsValid =
|
|
@@ -735,14 +947,32 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
735
947
|
}));
|
|
736
948
|
const inputPrivKeys = await this.GetPrivKeysForInputs(inputs);
|
|
737
949
|
const fundTxSigs = await Promise.all(inputs.map(async (input, index) => {
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
950
|
+
// Use DLC-specific signing for DLC inputs
|
|
951
|
+
if (input.isDlcInput()) {
|
|
952
|
+
const dlcInputInfo = input.dlcInput;
|
|
953
|
+
const dlcSignRequest = {
|
|
954
|
+
fundTxHex: dlcTxs.fundTx.serialize().toString('hex'),
|
|
955
|
+
fundTxid: input.txid,
|
|
956
|
+
fundVout: input.vout,
|
|
957
|
+
fundAmount: input.value,
|
|
958
|
+
localFundPubkey: dlcInputInfo.localFundPubkey,
|
|
959
|
+
remoteFundPubkey: dlcInputInfo.remoteFundPubkey,
|
|
960
|
+
privkey: inputPrivKeys[index],
|
|
961
|
+
};
|
|
962
|
+
return (await this.GetRawDlcFundingInputSignature(dlcSignRequest))
|
|
963
|
+
.hex;
|
|
964
|
+
}
|
|
965
|
+
else {
|
|
966
|
+
// Use regular signing for non-DLC inputs
|
|
967
|
+
const fundTxSignRequest = {
|
|
968
|
+
fundTxHex: dlcTxs.fundTx.serialize().toString('hex'),
|
|
969
|
+
privkey: inputPrivKeys[index],
|
|
970
|
+
prevTxId: input.txid,
|
|
971
|
+
prevVout: input.vout,
|
|
972
|
+
amount: input.value,
|
|
973
|
+
};
|
|
974
|
+
return (await this.GetRawFundTxSignature(fundTxSignRequest)).hex;
|
|
975
|
+
}
|
|
746
976
|
}));
|
|
747
977
|
const inputPubKeys = await Promise.all(inputPrivKeys.map(async (privkey) => {
|
|
748
978
|
const reqPrivKey = {
|
|
@@ -760,17 +990,11 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
760
990
|
pubKeyWitness.witness = Buffer.from(inputPubKeys[i], 'hex');
|
|
761
991
|
witnessElements.push([sigWitness, pubKeyWitness]);
|
|
762
992
|
}
|
|
763
|
-
const fundingSignatures = new messaging_1.
|
|
993
|
+
const fundingSignatures = new messaging_1.FundingSignatures();
|
|
764
994
|
fundingSignatures.witnessElements = witnessElements;
|
|
765
995
|
return fundingSignatures;
|
|
766
996
|
}
|
|
767
|
-
async VerifyFundingSigs(
|
|
768
|
-
const { dlcOffer, dlcAccept, dlcSign, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
769
|
-
_dlcOffer,
|
|
770
|
-
_dlcAccept,
|
|
771
|
-
_dlcSign,
|
|
772
|
-
_dlcTxs,
|
|
773
|
-
});
|
|
997
|
+
async VerifyFundingSigs(dlcOffer, dlcAccept, dlcSign, dlcTxs, isOfferer) {
|
|
774
998
|
const sigsValidity = [];
|
|
775
999
|
for (let i = 0; i < dlcSign.fundingSignatures.witnessElements.length; i++) {
|
|
776
1000
|
const witnessElement = dlcSign.fundingSignatures.witnessElements[i];
|
|
@@ -779,31 +1003,46 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
779
1003
|
const fundingInput = isOfferer
|
|
780
1004
|
? dlcAccept.fundingInputs[i]
|
|
781
1005
|
: dlcOffer.fundingInputs[i];
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
1006
|
+
// Check if this is a DLC input and use appropriate verification
|
|
1007
|
+
if (fundingInput.dlcInput) {
|
|
1008
|
+
const dlcInput = fundingInput.dlcInput;
|
|
1009
|
+
const verifyDlcSigRequest = {
|
|
1010
|
+
fundTxHex: dlcTxs.fundTx.serialize().toString('hex'),
|
|
1011
|
+
fundTxid: fundingInput.prevTx.txId.toString(),
|
|
1012
|
+
fundVout: fundingInput.prevTxVout,
|
|
1013
|
+
fundAmount: Number(fundingInput.prevTx.outputs[fundingInput.prevTxVout].value.sats),
|
|
1014
|
+
localFundPubkey: dlcInput.localFundPubkey.toString('hex'),
|
|
1015
|
+
remoteFundPubkey: dlcInput.remoteFundPubkey.toString('hex'),
|
|
1016
|
+
signature,
|
|
1017
|
+
pubkey,
|
|
1018
|
+
};
|
|
1019
|
+
sigsValidity.push((async () => {
|
|
1020
|
+
const response = await this.VerifyDlcFundingInputSignature(verifyDlcSigRequest);
|
|
1021
|
+
return response.valid;
|
|
1022
|
+
})());
|
|
1023
|
+
}
|
|
1024
|
+
else {
|
|
1025
|
+
// Regular input verification
|
|
1026
|
+
const verifyFundSigRequest = {
|
|
1027
|
+
fundTxHex: dlcTxs.fundTx.serialize().toString('hex'),
|
|
1028
|
+
signature,
|
|
1029
|
+
pubkey,
|
|
1030
|
+
prevTxId: fundingInput.prevTx.txId.toString(),
|
|
1031
|
+
prevVout: fundingInput.prevTxVout,
|
|
1032
|
+
fundInputAmount: fundingInput.prevTx.outputs[fundingInput.prevTxVout].value.sats,
|
|
1033
|
+
};
|
|
1034
|
+
sigsValidity.push((async () => {
|
|
1035
|
+
const response = await this.VerifyFundTxSignature(verifyFundSigRequest);
|
|
1036
|
+
return response.valid;
|
|
1037
|
+
})());
|
|
1038
|
+
}
|
|
794
1039
|
}
|
|
795
1040
|
const areSigsValid = (await Promise.all(sigsValidity)).every((b) => b);
|
|
796
1041
|
if (!areSigsValid) {
|
|
797
1042
|
throw new Error('Invalid signatures received');
|
|
798
1043
|
}
|
|
799
1044
|
}
|
|
800
|
-
async CreateFundingTx(
|
|
801
|
-
const { dlcOffer, dlcAccept, dlcSign, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
802
|
-
_dlcOffer,
|
|
803
|
-
_dlcAccept,
|
|
804
|
-
_dlcSign,
|
|
805
|
-
_dlcTxs,
|
|
806
|
-
});
|
|
1045
|
+
async CreateFundingTx(dlcOffer, dlcAccept, dlcSign, dlcTxs, fundingSignatures) {
|
|
807
1046
|
const witnessElements = [
|
|
808
1047
|
...dlcSign.fundingSignatures.witnessElements,
|
|
809
1048
|
...fundingSignatures.witnessElements,
|
|
@@ -813,39 +1052,67 @@ class BitcoinDlcProvider extends provider_1.default {
|
|
|
813
1052
|
...dlcAccept.fundingInputs,
|
|
814
1053
|
];
|
|
815
1054
|
let fundTxHex = dlcTxs.fundTx.serialize().toString('hex');
|
|
1055
|
+
// Track processed DLC inputs to avoid double processing
|
|
1056
|
+
const processedDlcInputs = new Set();
|
|
816
1057
|
await (0, Utils_1.asyncForEach)(witnessElements, async (witnessElement, i) => {
|
|
817
1058
|
const signature = witnessElement[0].witness.toString('hex');
|
|
818
1059
|
const pubkey = witnessElement[1].witness.toString('hex');
|
|
819
1060
|
const fundingInput = fundingInputs[i];
|
|
820
|
-
const
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
1061
|
+
const inputKey = `${fundingInput.prevTx.txId.toString()}:${fundingInput.prevTxVout}`;
|
|
1062
|
+
// Check if this is a DLC input
|
|
1063
|
+
if (fundingInput.dlcInput && !processedDlcInputs.has(inputKey)) {
|
|
1064
|
+
// Mark as processed to avoid double processing
|
|
1065
|
+
processedDlcInputs.add(inputKey);
|
|
1066
|
+
// For DLC inputs, use SignDlcFundingInput which properly combines signatures
|
|
1067
|
+
// This is the correct CFD method for DLC funding inputs
|
|
1068
|
+
const dlcInput = fundingInput.dlcInput;
|
|
1069
|
+
// Find the private key for this DLC input
|
|
1070
|
+
const privateKey = await this.findDlcFundingPrivateKey(dlcInput.localFundPubkey.toString('hex'), dlcInput.remoteFundPubkey.toString('hex'));
|
|
1071
|
+
const signDlcRequest = {
|
|
1072
|
+
fundTxHex,
|
|
1073
|
+
fundTxid: fundingInput.prevTx.txId.toString(),
|
|
1074
|
+
fundVout: fundingInput.prevTxVout,
|
|
1075
|
+
fundAmount: Number(fundingInput.prevTx.outputs[fundingInput.prevTxVout].value.sats),
|
|
1076
|
+
localFundPubkey: dlcInput.localFundPubkey.toString('hex'),
|
|
1077
|
+
remoteFundPubkey: dlcInput.remoteFundPubkey.toString('hex'),
|
|
1078
|
+
localPrivkey: privateKey,
|
|
1079
|
+
remoteSignature: signature,
|
|
1080
|
+
};
|
|
1081
|
+
fundTxHex = (await this.SignDlcFundingInput(signDlcRequest)).hex;
|
|
1082
|
+
}
|
|
1083
|
+
else if (!fundingInput.dlcInput) {
|
|
1084
|
+
// Regular input - use standard signing
|
|
1085
|
+
const addSignRequest = {
|
|
1086
|
+
fundTxHex,
|
|
1087
|
+
signature,
|
|
1088
|
+
prevTxId: fundingInput.prevTx.txId.toString(),
|
|
1089
|
+
prevVout: fundingInput.prevTxVout,
|
|
1090
|
+
pubkey,
|
|
1091
|
+
};
|
|
1092
|
+
fundTxHex = (await this.AddSignatureToFundTransaction(addSignRequest))
|
|
1093
|
+
.hex;
|
|
1094
|
+
}
|
|
1095
|
+
// If it's a DLC input but already processed, skip it
|
|
829
1096
|
});
|
|
830
1097
|
const fundTx = bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(fundTxHex));
|
|
831
1098
|
return fundTx;
|
|
832
1099
|
}
|
|
833
|
-
async FindOutcomeIndexFromPolynomialPayoutCurvePiece(
|
|
834
|
-
const
|
|
835
|
-
const polynomialCurve = core_1.PolynomialPayoutCurve.fromPayoutCurvePiece(polynomialPayoutCurvePiece);
|
|
1100
|
+
async FindOutcomeIndexFromPolynomialPayoutCurvePiece(dlcOffer, contractDescriptor, contractOraclePairIndex, polynomialPayoutCurvePiece, oracleAttestation, outcome) {
|
|
1101
|
+
const polynomialCurve = core_2.PolynomialPayoutCurve.fromPayoutCurvePiece(polynomialPayoutCurvePiece);
|
|
836
1102
|
const payouts = polynomialPayoutCurvePiece.points.map((point) => Number(point.outcomePayout));
|
|
837
1103
|
const minPayout = Math.min(...payouts);
|
|
838
1104
|
const maxPayout = Math.max(...payouts);
|
|
839
1105
|
const clampBN = (val) => bignumber_js_1.default.max(minPayout, bignumber_js_1.default.min(val, maxPayout));
|
|
840
1106
|
const payout = clampBN(polynomialCurve.getPayout(outcome));
|
|
841
1107
|
const payoutResponses = this.GetPayouts(dlcOffer);
|
|
842
|
-
const payoutIndexOffset = this.GetIndicesFromPayouts(payoutResponses)[contractOraclePairIndex]
|
|
1108
|
+
const payoutIndexOffset = this.GetIndicesFromPayouts(payoutResponses)[contractOraclePairIndex]
|
|
1109
|
+
.startingMessagesIndex;
|
|
843
1110
|
const { payoutGroups } = payoutResponses[contractOraclePairIndex];
|
|
844
1111
|
const intervalsSorted = [
|
|
845
1112
|
...contractDescriptor.roundingIntervals.intervals,
|
|
846
1113
|
].sort((a, b) => Number(b.beginInterval) - Number(a.beginInterval));
|
|
847
1114
|
const interval = intervalsSorted.find((interval) => Number(outcome) >= Number(interval.beginInterval));
|
|
848
|
-
const roundedPayout = BigInt(clampBN(new bignumber_js_1.default((0,
|
|
1115
|
+
const roundedPayout = BigInt(clampBN(new bignumber_js_1.default((0, core_2.roundPayout)(payout, interval.roundingMod).toString())).toString());
|
|
849
1116
|
const outcomesFormatted = oracleAttestation.outcomes.map((outcome) => parseInt(outcome));
|
|
850
1117
|
let index = 0;
|
|
851
1118
|
let groupIndex = -1;
|
|
@@ -873,17 +1140,18 @@ Payout Group not found');
|
|
|
873
1140
|
}
|
|
874
1141
|
async FindOutcomeIndexFromHyperbolaPayoutCurvePiece(_dlcOffer, contractDescriptor, contractOraclePairIndex, hyperbolaPayoutCurvePiece, oracleAttestation, outcome) {
|
|
875
1142
|
const { dlcOffer } = (0, Utils_1.checkTypes)({ _dlcOffer });
|
|
876
|
-
const hyperbolaCurve =
|
|
1143
|
+
const hyperbolaCurve = core_2.HyperbolaPayoutCurve.fromPayoutCurvePiece(hyperbolaPayoutCurvePiece);
|
|
877
1144
|
const clampBN = (val) => bignumber_js_1.default.max(0, bignumber_js_1.default.min(val, dlcOffer.contractInfo.totalCollateral.toString()));
|
|
878
1145
|
const payout = clampBN(hyperbolaCurve.getPayout(outcome));
|
|
879
1146
|
const payoutResponses = this.GetPayouts(dlcOffer);
|
|
880
|
-
const payoutIndexOffset = this.GetIndicesFromPayouts(payoutResponses)[contractOraclePairIndex]
|
|
1147
|
+
const payoutIndexOffset = this.GetIndicesFromPayouts(payoutResponses)[contractOraclePairIndex]
|
|
1148
|
+
.startingMessagesIndex;
|
|
881
1149
|
const { payoutGroups } = payoutResponses[contractOraclePairIndex];
|
|
882
1150
|
const intervalsSorted = [
|
|
883
1151
|
...contractDescriptor.roundingIntervals.intervals,
|
|
884
1152
|
].sort((a, b) => Number(b.beginInterval) - Number(a.beginInterval));
|
|
885
1153
|
const interval = intervalsSorted.find((interval) => Number(outcome) >= Number(interval.beginInterval));
|
|
886
|
-
const roundedPayout = BigInt(clampBN(new bignumber_js_1.default((0,
|
|
1154
|
+
const roundedPayout = BigInt(clampBN(new bignumber_js_1.default((0, core_2.roundPayout)(payout, interval.roundingMod).toString())).toString());
|
|
887
1155
|
const outcomesFormatted = oracleAttestation.outcomes.map((outcome) => parseInt(outcome));
|
|
888
1156
|
let index = 0;
|
|
889
1157
|
let groupIndex = -1;
|
|
@@ -921,32 +1189,59 @@ Payout Group not found');
|
|
|
921
1189
|
}
|
|
922
1190
|
}
|
|
923
1191
|
if (groupIndex === -1) {
|
|
924
|
-
|
|
925
|
-
|
|
1192
|
+
// Fallback to brute force search if payout-based search fails
|
|
1193
|
+
index = 0;
|
|
1194
|
+
groupLength = 0;
|
|
1195
|
+
for (const [, payoutGroup] of payoutGroups.entries()) {
|
|
1196
|
+
groupIndex = payoutGroup.groups.findIndex((group) => {
|
|
1197
|
+
return group.every((msg, j) => msg === outcomesFormatted[j]);
|
|
1198
|
+
});
|
|
1199
|
+
if (groupIndex !== -1) {
|
|
1200
|
+
index += groupIndex;
|
|
1201
|
+
groupLength = payoutGroup.groups[groupIndex].length;
|
|
1202
|
+
break;
|
|
1203
|
+
}
|
|
1204
|
+
else {
|
|
1205
|
+
index += payoutGroup.groups.length;
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
if (groupIndex === -1) {
|
|
1209
|
+
throw Error('Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \
|
|
1210
|
+
Payout Group not found even with brute force search');
|
|
1211
|
+
}
|
|
926
1212
|
}
|
|
927
1213
|
return { index: payoutIndexOffset + index, groupLength };
|
|
928
1214
|
}
|
|
929
|
-
async FindOutcomeIndex(
|
|
930
|
-
const { dlcOffer } = (0, Utils_1.checkTypes)({ _dlcOffer });
|
|
1215
|
+
async FindOutcomeIndex(dlcOffer, oracleAttestation) {
|
|
931
1216
|
const contractOraclePairs = this.GetContractOraclePairs(dlcOffer.contractInfo);
|
|
932
|
-
const contractOraclePairIndex = contractOraclePairs.findIndex(({ oracleInfo }) =>
|
|
933
|
-
|
|
1217
|
+
const contractOraclePairIndex = contractOraclePairs.findIndex(({ oracleInfo }) => {
|
|
1218
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo)
|
|
1219
|
+
return false;
|
|
1220
|
+
const singleOracleInfo = oracleInfo;
|
|
1221
|
+
return (singleOracleInfo.announcement.oracleEvent.eventId ===
|
|
1222
|
+
oracleAttestation.eventId);
|
|
1223
|
+
});
|
|
934
1224
|
(0, assert_1.default)(contractOraclePairIndex !== -1, 'OracleAttestation must be for an existing OracleEvent');
|
|
935
1225
|
const contractOraclePair = contractOraclePairs[contractOraclePairIndex];
|
|
936
|
-
const { contractDescriptor: _contractDescriptor, oracleInfo
|
|
937
|
-
(0, assert_1.default)(_contractDescriptor.
|
|
1226
|
+
const { contractDescriptor: _contractDescriptor, oracleInfo } = contractOraclePair;
|
|
1227
|
+
(0, assert_1.default)(_contractDescriptor.contractDescriptorType ===
|
|
1228
|
+
messaging_1.ContractDescriptorType.NumericOutcome, 'ContractDescriptor must be NumericOutcome');
|
|
938
1229
|
const contractDescriptor = _contractDescriptor;
|
|
939
1230
|
const _payoutFunction = contractDescriptor.payoutFunction;
|
|
940
|
-
(0, assert_1.default)(_payoutFunction.type === messaging_1.MessageType.
|
|
941
|
-
|
|
1231
|
+
(0, assert_1.default)(_payoutFunction.type === messaging_1.MessageType.PayoutFunction, 'PayoutFunction must be V0');
|
|
1232
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
1233
|
+
throw new Error('Only SingleOracleInfo supported in this context');
|
|
1234
|
+
}
|
|
1235
|
+
const singleOracleInfo = oracleInfo;
|
|
1236
|
+
const eventDescriptor = singleOracleInfo.announcement.oracleEvent
|
|
942
1237
|
.eventDescriptor;
|
|
943
1238
|
const payoutFunction = _payoutFunction;
|
|
944
1239
|
const base = eventDescriptor.base;
|
|
945
1240
|
const outcome = [...oracleAttestation.outcomes]
|
|
946
1241
|
.reverse()
|
|
947
1242
|
.reduce((acc, val, i) => acc + Number(val) * base ** i, 0);
|
|
948
|
-
const piecesSorted = payoutFunction.
|
|
949
|
-
const piece = piecesSorted.find((piece) => outcome < piece.
|
|
1243
|
+
const piecesSorted = payoutFunction.payoutFunctionPieces.sort((a, b) => Number(a.endPoint.eventOutcome) - Number(b.endPoint.eventOutcome));
|
|
1244
|
+
const piece = piecesSorted.find((piece) => outcome < piece.endPoint.eventOutcome);
|
|
950
1245
|
switch (piece.payoutCurvePiece.type) {
|
|
951
1246
|
case messaging_1.MessageType.PolynomialPayoutCurvePiece:
|
|
952
1247
|
return this.FindOutcomeIndexFromPolynomialPayoutCurvePiece(dlcOffer, contractDescriptor, contractOraclePairIndex, piece.payoutCurvePiece, oracleAttestation, BigInt(outcome));
|
|
@@ -958,24 +1253,29 @@ Payout Group not found');
|
|
|
958
1253
|
throw Error('Must be Hyperbola or Polynomial curve piece');
|
|
959
1254
|
}
|
|
960
1255
|
}
|
|
961
|
-
ValidateEvent(
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
});
|
|
965
|
-
switch (dlcOffer.contractInfo.type) {
|
|
966
|
-
case messaging_1.MessageType.ContractInfoV0: {
|
|
1256
|
+
ValidateEvent(dlcOffer, oracleAttestation) {
|
|
1257
|
+
switch (dlcOffer.contractInfo.contractInfoType) {
|
|
1258
|
+
case messaging_1.ContractInfoType.Single: {
|
|
967
1259
|
const contractInfo = dlcOffer.contractInfo;
|
|
968
|
-
switch (contractInfo.contractDescriptor.
|
|
969
|
-
case messaging_1.
|
|
1260
|
+
switch (contractInfo.contractDescriptor.contractDescriptorType) {
|
|
1261
|
+
case messaging_1.ContractDescriptorType.Enumerated: {
|
|
970
1262
|
const oracleInfo = contractInfo.oracleInfo;
|
|
971
|
-
if (oracleInfo.
|
|
1263
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
1264
|
+
throw Error('Only SingleOracleInfo supported in this context');
|
|
1265
|
+
}
|
|
1266
|
+
const singleOracleInfo = oracleInfo;
|
|
1267
|
+
if (singleOracleInfo.announcement.oracleEvent.eventId !==
|
|
972
1268
|
oracleAttestation.eventId)
|
|
973
1269
|
throw Error('Incorrect Oracle Attestation. Event Id must match.');
|
|
974
1270
|
break;
|
|
975
1271
|
}
|
|
976
|
-
case messaging_1.
|
|
1272
|
+
case messaging_1.ContractDescriptorType.NumericOutcome: {
|
|
977
1273
|
const oracleInfo = contractInfo.oracleInfo;
|
|
978
|
-
if (oracleInfo.
|
|
1274
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo) {
|
|
1275
|
+
throw Error('Only SingleOracleInfo supported in this context');
|
|
1276
|
+
}
|
|
1277
|
+
const singleOracleInfo = oracleInfo;
|
|
1278
|
+
if (singleOracleInfo.announcement.oracleEvent.eventId !==
|
|
979
1279
|
oracleAttestation.eventId)
|
|
980
1280
|
throw Error('Incorrect Oracle Attestation. Event Id must match.');
|
|
981
1281
|
break;
|
|
@@ -985,10 +1285,15 @@ Payout Group not found');
|
|
|
985
1285
|
}
|
|
986
1286
|
break;
|
|
987
1287
|
}
|
|
988
|
-
case messaging_1.
|
|
1288
|
+
case messaging_1.ContractInfoType.Disjoint: {
|
|
989
1289
|
const contractInfo = dlcOffer.contractInfo;
|
|
990
|
-
const attestedOracleEvent = contractInfo.contractOraclePairs.find(({ oracleInfo }) =>
|
|
991
|
-
|
|
1290
|
+
const attestedOracleEvent = contractInfo.contractOraclePairs.find(({ oracleInfo }) => {
|
|
1291
|
+
if (oracleInfo.type !== messaging_1.MessageType.SingleOracleInfo)
|
|
1292
|
+
return false;
|
|
1293
|
+
const singleOracleInfo = oracleInfo;
|
|
1294
|
+
return (singleOracleInfo.announcement.oracleEvent.eventId ===
|
|
1295
|
+
oracleAttestation.eventId);
|
|
1296
|
+
});
|
|
992
1297
|
if (!attestedOracleEvent)
|
|
993
1298
|
throw Error('Oracle event of attestation not found.');
|
|
994
1299
|
break;
|
|
@@ -997,35 +1302,29 @@ Payout Group not found');
|
|
|
997
1302
|
throw Error('ContractInfo must be V0 or V1');
|
|
998
1303
|
}
|
|
999
1304
|
}
|
|
1000
|
-
async FindAndSignCet(
|
|
1001
|
-
const { dlcOffer, dlcAccept, dlcSign, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
1002
|
-
_dlcOffer,
|
|
1003
|
-
_dlcAccept,
|
|
1004
|
-
_dlcSign,
|
|
1005
|
-
_dlcTxs,
|
|
1006
|
-
});
|
|
1305
|
+
async FindAndSignCet(dlcOffer, dlcAccept, dlcSign, dlcTxs, oracleAttestation, isOfferer) {
|
|
1007
1306
|
if (isOfferer === undefined)
|
|
1008
1307
|
isOfferer = await this.isOfferer(dlcOffer, dlcAccept);
|
|
1009
1308
|
const fundPrivateKey = await this.GetFundPrivateKey(dlcOffer, dlcAccept, isOfferer);
|
|
1010
1309
|
let signCetRequest;
|
|
1011
|
-
if (dlcOffer.contractInfo.
|
|
1012
|
-
dlcOffer.contractInfo.contractDescriptor
|
|
1013
|
-
messaging_1.
|
|
1310
|
+
if (dlcOffer.contractInfo.contractInfoType === messaging_1.ContractInfoType.Single &&
|
|
1311
|
+
dlcOffer.contractInfo.contractDescriptor
|
|
1312
|
+
.contractDescriptorType === messaging_1.ContractDescriptorType.Enumerated) {
|
|
1014
1313
|
const outcomeIndex = dlcOffer.contractInfo
|
|
1015
|
-
.contractDescriptor.outcomes.findIndex((outcome) => outcome.outcome
|
|
1314
|
+
.contractDescriptor.outcomes.findIndex((outcome) => outcome.outcome ===
|
|
1016
1315
|
(0, crypto_1.sha256)(Buffer.from(oracleAttestation.outcomes[0])).toString('hex'));
|
|
1017
1316
|
signCetRequest = {
|
|
1018
1317
|
cetHex: dlcTxs.cets[outcomeIndex].serialize().toString('hex'),
|
|
1019
1318
|
fundPrivkey: fundPrivateKey,
|
|
1020
1319
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
1021
1320
|
fundVout: dlcTxs.fundTxVout,
|
|
1022
|
-
localFundPubkey: dlcOffer.
|
|
1023
|
-
remoteFundPubkey: dlcAccept.
|
|
1321
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
1322
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
1024
1323
|
oracleSignatures: oracleAttestation.signatures.map((sig) => sig.toString('hex')),
|
|
1025
|
-
fundInputAmount:
|
|
1324
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
1026
1325
|
adaptorSignature: isOfferer
|
|
1027
|
-
? dlcAccept.
|
|
1028
|
-
: dlcSign.
|
|
1326
|
+
? dlcAccept.cetAdaptorSignatures.sigs[outcomeIndex].encryptedSig.toString('hex')
|
|
1327
|
+
: dlcSign.cetAdaptorSignatures.sigs[outcomeIndex].encryptedSig.toString('hex'),
|
|
1029
1328
|
};
|
|
1030
1329
|
}
|
|
1031
1330
|
else {
|
|
@@ -1039,13 +1338,13 @@ Payout Group not found');
|
|
|
1039
1338
|
fundPrivkey: fundPrivateKey,
|
|
1040
1339
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
1041
1340
|
fundVout: dlcTxs.fundTxVout,
|
|
1042
|
-
localFundPubkey: dlcOffer.
|
|
1043
|
-
remoteFundPubkey: dlcAccept.
|
|
1341
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
1342
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
1044
1343
|
oracleSignatures: oracleSignatures.map((sig) => sig.toString('hex')),
|
|
1045
|
-
fundInputAmount:
|
|
1344
|
+
fundInputAmount: this.getFundOutputValueSats(dlcTxs),
|
|
1046
1345
|
adaptorSignature: isOfferer
|
|
1047
|
-
? dlcAccept.
|
|
1048
|
-
: dlcSign.
|
|
1346
|
+
? dlcAccept.cetAdaptorSignatures.sigs[outcomeIndex].encryptedSig.toString('hex')
|
|
1347
|
+
: dlcSign.cetAdaptorSignatures.sigs[outcomeIndex].encryptedSig.toString('hex'),
|
|
1049
1348
|
};
|
|
1050
1349
|
}
|
|
1051
1350
|
const finalCet = (await this.SignCet(signCetRequest)).hex;
|
|
@@ -1053,7 +1352,7 @@ Payout Group not found');
|
|
|
1053
1352
|
}
|
|
1054
1353
|
async GetFundAddress(dlcOffer, dlcAccept, isOfferer) {
|
|
1055
1354
|
const network = await this.getConnectedNetwork();
|
|
1056
|
-
const fundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(isOfferer ? dlcOffer.
|
|
1355
|
+
const fundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(isOfferer ? dlcOffer.fundingPubkey : dlcAccept.fundingPubkey))
|
|
1057
1356
|
.serialize()
|
|
1058
1357
|
.slice(1);
|
|
1059
1358
|
const fundingAddress = bitcoinjs_lib_1.address.fromOutputScript(fundingSPK, network);
|
|
@@ -1069,16 +1368,11 @@ Payout Group not found');
|
|
|
1069
1368
|
const fundPrivateKeyPair = await this.GetFundKeyPair(dlcOffer, dlcAccept, isOfferer);
|
|
1070
1369
|
return Buffer.from(fundPrivateKeyPair.privateKey).toString('hex');
|
|
1071
1370
|
}
|
|
1072
|
-
async CreateCloseRawTxs(
|
|
1073
|
-
const { dlcOffer, dlcAccept, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
1074
|
-
_dlcOffer,
|
|
1075
|
-
_dlcAccept,
|
|
1076
|
-
_dlcTxs,
|
|
1077
|
-
});
|
|
1371
|
+
async CreateCloseRawTxs(dlcOffer, dlcAccept, dlcTxs, closeInputAmount, isOfferer, _dlcCloses = [], fundingInputs, initiatorPayouts) {
|
|
1078
1372
|
const network = await this.getConnectedNetwork();
|
|
1079
1373
|
let finalizer;
|
|
1080
1374
|
if (_dlcCloses.length === 0) {
|
|
1081
|
-
finalizer = new
|
|
1375
|
+
finalizer = new core_2.DualClosingTxFinalizer(fundingInputs, dlcOffer.payoutSpk, dlcAccept.payoutSpk, dlcOffer.feeRatePerVb);
|
|
1082
1376
|
}
|
|
1083
1377
|
const rawTransactionRequestPromises = [];
|
|
1084
1378
|
const rawCloseTxs = [];
|
|
@@ -1109,13 +1403,13 @@ Payout Group not found');
|
|
|
1109
1403
|
const txOuts = [];
|
|
1110
1404
|
if (Number(offerPayoutValue) > 0) {
|
|
1111
1405
|
txOuts.push({
|
|
1112
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(dlcOffer.
|
|
1406
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(dlcOffer.payoutSpk, network),
|
|
1113
1407
|
amount: Number(offerPayoutValue),
|
|
1114
1408
|
});
|
|
1115
1409
|
}
|
|
1116
1410
|
if (Number(acceptPayoutValue) > 0) {
|
|
1117
1411
|
txOuts.push({
|
|
1118
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(dlcAccept.
|
|
1412
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(dlcAccept.payoutSpk, network),
|
|
1119
1413
|
amount: Number(acceptPayoutValue),
|
|
1120
1414
|
});
|
|
1121
1415
|
}
|
|
@@ -1149,9 +1443,9 @@ Payout Group not found');
|
|
|
1149
1443
|
_dlcTxs,
|
|
1150
1444
|
});
|
|
1151
1445
|
const network = await this.getConnectedNetwork();
|
|
1152
|
-
const fundingPubKeys = Buffer.compare(dlcOffer.
|
|
1153
|
-
? [dlcOffer.
|
|
1154
|
-
: [dlcAccept.
|
|
1446
|
+
const fundingPubKeys = Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) === -1
|
|
1447
|
+
? [dlcOffer.fundingPubkey, dlcAccept.fundingPubkey]
|
|
1448
|
+
: [dlcAccept.fundingPubkey, dlcOffer.fundingPubkey];
|
|
1155
1449
|
const p2ms = bitcoinjs_lib_1.payments.p2ms({
|
|
1156
1450
|
m: 2,
|
|
1157
1451
|
pubkeys: fundingPubKeys,
|
|
@@ -1174,7 +1468,7 @@ Payout Group not found');
|
|
|
1174
1468
|
hex: paymentVariant.redeem.output.toString('hex'),
|
|
1175
1469
|
type: 'redeem_script',
|
|
1176
1470
|
},
|
|
1177
|
-
amount: Number(
|
|
1471
|
+
amount: Number(this.getFundOutputValueSats(dlcTxs)),
|
|
1178
1472
|
hashType: 'p2wsh',
|
|
1179
1473
|
sighashType: 'all',
|
|
1180
1474
|
sighashAnyoneCanPay: false,
|
|
@@ -1219,9 +1513,9 @@ Payout Group not found');
|
|
|
1219
1513
|
});
|
|
1220
1514
|
const dlcCloses = _dlcCloses.map((_dlcClose) => (0, Utils_1.checkTypes)({ _dlcClose }).dlcClose);
|
|
1221
1515
|
const network = await this.getConnectedNetwork();
|
|
1222
|
-
const fundingPubKeys = Buffer.compare(dlcOffer.
|
|
1223
|
-
? [dlcOffer.
|
|
1224
|
-
: [dlcAccept.
|
|
1516
|
+
const fundingPubKeys = Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) === -1
|
|
1517
|
+
? [dlcOffer.fundingPubkey, dlcAccept.fundingPubkey]
|
|
1518
|
+
: [dlcAccept.fundingPubkey, dlcOffer.fundingPubkey];
|
|
1225
1519
|
const p2ms = bitcoinjs_lib_1.payments.p2ms({
|
|
1226
1520
|
m: 2,
|
|
1227
1521
|
pubkeys: fundingPubKeys,
|
|
@@ -1231,7 +1525,7 @@ Payout Group not found');
|
|
|
1231
1525
|
redeem: p2ms,
|
|
1232
1526
|
network,
|
|
1233
1527
|
});
|
|
1234
|
-
const pubkey = isOfferer ? dlcAccept.
|
|
1528
|
+
const pubkey = isOfferer ? dlcAccept.fundingPubkey : dlcOffer.fundingPubkey;
|
|
1235
1529
|
const sigsValidity = [];
|
|
1236
1530
|
for (let i = 0; i < rawCloseTxs.length; i++) {
|
|
1237
1531
|
const rawTx = rawCloseTxs[i];
|
|
@@ -1247,7 +1541,7 @@ Payout Group not found');
|
|
|
1247
1541
|
hashType: 'p2wsh',
|
|
1248
1542
|
sighashType: 'all',
|
|
1249
1543
|
sighashAnyoneCanPay: false,
|
|
1250
|
-
amount: Number(
|
|
1544
|
+
amount: Number(this.getFundOutputValueSats(dlcTxs)),
|
|
1251
1545
|
},
|
|
1252
1546
|
};
|
|
1253
1547
|
sigsValidity.push((async () => {
|
|
@@ -1270,10 +1564,10 @@ Payout Group not found');
|
|
|
1270
1564
|
_dlcAccept,
|
|
1271
1565
|
});
|
|
1272
1566
|
const network = await this.getConnectedNetwork();
|
|
1273
|
-
const offerFundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(dlcOffer.
|
|
1567
|
+
const offerFundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(dlcOffer.fundingPubkey))
|
|
1274
1568
|
.serialize()
|
|
1275
1569
|
.slice(1);
|
|
1276
|
-
const acceptFundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(dlcAccept.
|
|
1570
|
+
const acceptFundingSPK = bitcoin_1.Script.p2wpkhLock((0, crypto_1.hash160)(dlcAccept.fundingPubkey))
|
|
1277
1571
|
.serialize()
|
|
1278
1572
|
.slice(1);
|
|
1279
1573
|
const offerFundingAddress = bitcoinjs_lib_1.address.fromOutputScript(offerFundingSPK, network);
|
|
@@ -1297,14 +1591,50 @@ Payout Group not found');
|
|
|
1297
1591
|
* @param feeRatePerVb Fee rate in satoshi per virtual byte that both sides use to compute fees in funding tx
|
|
1298
1592
|
* @param cetLocktime The nLockTime to be put on CETs
|
|
1299
1593
|
* @param refundLocktime The nLockTime to be put on the refund transaction
|
|
1594
|
+
* @param fixedInputs Optional fixed inputs - can be Input[] for regular inputs or FundingInput[] for DLC inputs
|
|
1300
1595
|
* @returns {Promise<DlcOffer>}
|
|
1301
1596
|
*/
|
|
1302
|
-
async createDlcOffer(contractInfo, offerCollateralSatoshis, feeRatePerVb, cetLocktime, refundLocktime, fixedInputs) {
|
|
1597
|
+
async createDlcOffer(contractInfo, offerCollateralSatoshis, feeRatePerVb, cetLocktime, refundLocktime, fixedInputs, inputSupplementationMode) {
|
|
1303
1598
|
contractInfo.validate();
|
|
1304
1599
|
const network = await this.getConnectedNetwork();
|
|
1305
|
-
const dlcOffer = new messaging_1.
|
|
1306
|
-
|
|
1307
|
-
|
|
1600
|
+
const dlcOffer = new messaging_1.DlcOffer();
|
|
1601
|
+
// Generate a random 32-byte temporary contract ID
|
|
1602
|
+
dlcOffer.temporaryContractId = crypto_2.default.randomBytes(32);
|
|
1603
|
+
// Check if we have FundingInput[] (DLC inputs) or Input[] (regular inputs)
|
|
1604
|
+
const hasFundingInputs = fixedInputs && fixedInputs.length > 0 && 'prevTx' in fixedInputs[0]; // FundingInput has prevTx, Input doesn't
|
|
1605
|
+
let fundingPubKey;
|
|
1606
|
+
let payoutSPK;
|
|
1607
|
+
let payoutSerialId;
|
|
1608
|
+
let _fundingInputs;
|
|
1609
|
+
let changeSPK;
|
|
1610
|
+
let changeSerialId;
|
|
1611
|
+
if (hasFundingInputs) {
|
|
1612
|
+
// Handle FundingInput[] directly (for DLC inputs)
|
|
1613
|
+
const fundingInputs = fixedInputs;
|
|
1614
|
+
// Generate addresses directly since we're bypassing Initialize()
|
|
1615
|
+
const payoutAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1616
|
+
payoutSPK = bitcoinjs_lib_1.address.toOutputScript(payoutAddress.address, network);
|
|
1617
|
+
const changeAddress = await this.client.wallet.getUnusedAddress(true);
|
|
1618
|
+
changeSPK = bitcoinjs_lib_1.address.toOutputScript(changeAddress.address, network);
|
|
1619
|
+
const fundingAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1620
|
+
fundingPubKey = Buffer.from(fundingAddress.publicKey, 'hex');
|
|
1621
|
+
if (fundingAddress.address === payoutAddress.address)
|
|
1622
|
+
throw Error('Address reuse');
|
|
1623
|
+
payoutSerialId = (0, Utils_1.generateSerialId)();
|
|
1624
|
+
changeSerialId = (0, Utils_1.generateSerialId)();
|
|
1625
|
+
_fundingInputs = fundingInputs;
|
|
1626
|
+
}
|
|
1627
|
+
else {
|
|
1628
|
+
// Handle Input[] through existing Initialize() flow
|
|
1629
|
+
const initResult = await this.Initialize(offerCollateralSatoshis, feeRatePerVb, fixedInputs, inputSupplementationMode || Input_1.InputSupplementationMode.Required);
|
|
1630
|
+
fundingPubKey = initResult.fundingPubKey;
|
|
1631
|
+
payoutSPK = initResult.payoutSPK;
|
|
1632
|
+
payoutSerialId = initResult.payoutSerialId;
|
|
1633
|
+
_fundingInputs = initResult.fundingInputs;
|
|
1634
|
+
changeSPK = initResult.changeSPK;
|
|
1635
|
+
changeSerialId = initResult.changeSerialId;
|
|
1636
|
+
}
|
|
1637
|
+
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.FundingInput, 'FundingInput must be V0'));
|
|
1308
1638
|
const fundingInputs = _fundingInputs.map((input) => input);
|
|
1309
1639
|
fundingInputs.sort((a, b) => Number(a.inputSerialId) - Number(b.inputSerialId));
|
|
1310
1640
|
const fundOutputSerialId = (0, Utils_1.generateSerialId)();
|
|
@@ -1312,19 +1642,23 @@ Payout Group not found');
|
|
|
1312
1642
|
dlcOffer.contractFlags = Buffer.from('00', 'hex');
|
|
1313
1643
|
dlcOffer.chainHash = (0, bitcoin_networks_1.chainHashFromNetwork)(network);
|
|
1314
1644
|
dlcOffer.contractInfo = contractInfo;
|
|
1315
|
-
dlcOffer.
|
|
1316
|
-
dlcOffer.
|
|
1645
|
+
dlcOffer.fundingPubkey = fundingPubKey;
|
|
1646
|
+
dlcOffer.payoutSpk = payoutSPK;
|
|
1317
1647
|
dlcOffer.payoutSerialId = payoutSerialId;
|
|
1318
|
-
dlcOffer.
|
|
1648
|
+
dlcOffer.offerCollateral = offerCollateralSatoshis;
|
|
1319
1649
|
dlcOffer.fundingInputs = fundingInputs;
|
|
1320
|
-
dlcOffer.
|
|
1650
|
+
dlcOffer.changeSpk = changeSPK;
|
|
1321
1651
|
dlcOffer.changeSerialId = changeSerialId;
|
|
1322
|
-
dlcOffer.fundOutputSerialId = dlcOffer.fundOutputSerialId =
|
|
1652
|
+
dlcOffer.fundOutputSerialId = dlcOffer.fundOutputSerialId =
|
|
1653
|
+
fundOutputSerialId;
|
|
1323
1654
|
dlcOffer.feeRatePerVb = feeRatePerVb;
|
|
1324
1655
|
dlcOffer.cetLocktime = cetLocktime;
|
|
1325
1656
|
dlcOffer.refundLocktime = refundLocktime;
|
|
1657
|
+
if (offerCollateralSatoshis === dlcOffer.contractInfo.totalCollateral) {
|
|
1658
|
+
dlcOffer.markAsSingleFunded();
|
|
1659
|
+
}
|
|
1326
1660
|
(0, assert_1.default)((() => {
|
|
1327
|
-
const finalizer = new
|
|
1661
|
+
const finalizer = new core_2.DualFundingTxFinalizer(dlcOffer.fundingInputs, dlcOffer.payoutSpk, dlcOffer.changeSpk, null, null, null, dlcOffer.feeRatePerVb);
|
|
1328
1662
|
const funding = fundingInputs.reduce((total, input) => {
|
|
1329
1663
|
return total + input.prevTx.outputs[input.prevTxVout].value.sats;
|
|
1330
1664
|
}, BigInt(0));
|
|
@@ -1344,7 +1678,7 @@ Payout Group not found');
|
|
|
1344
1678
|
}
|
|
1345
1679
|
const network = await this.getConnectedNetwork();
|
|
1346
1680
|
const { fundingInputs: _fundingInputs, changeSPK, changeSerialId, initializeResponses, } = await this.BatchInitialize(offerCollaterals, feeRatePerVb, fixedInputs);
|
|
1347
|
-
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.
|
|
1681
|
+
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.FundingInput, 'FundingInput must be V0'));
|
|
1348
1682
|
const fundingInputs = _fundingInputs.map((input) => input);
|
|
1349
1683
|
fundingInputs.sort((a, b) => Number(a.inputSerialId) - Number(b.inputSerialId));
|
|
1350
1684
|
const fundOutputsSerialIds = (0, Utils_1.generateSerialIds)(contractInfos.length);
|
|
@@ -1354,23 +1688,28 @@ Payout Group not found');
|
|
|
1354
1688
|
const fundOutputSerialId = fundOutputsSerialIds[i];
|
|
1355
1689
|
const { fundingPubKey, payoutSPK, payoutSerialId } = initializeResponses[i];
|
|
1356
1690
|
const refundLocktime = refundLocktimes[i];
|
|
1357
|
-
const dlcOffer = new messaging_1.
|
|
1691
|
+
const dlcOffer = new messaging_1.DlcOffer();
|
|
1692
|
+
// Generate a random 32-byte temporary contract ID
|
|
1693
|
+
dlcOffer.temporaryContractId = crypto_2.default.randomBytes(32);
|
|
1358
1694
|
dlcOffer.contractFlags = Buffer.from('00', 'hex');
|
|
1359
1695
|
dlcOffer.chainHash = (0, bitcoin_networks_1.chainHashFromNetwork)(network);
|
|
1360
1696
|
dlcOffer.contractInfo = contractInfo;
|
|
1361
|
-
dlcOffer.
|
|
1362
|
-
dlcOffer.
|
|
1697
|
+
dlcOffer.fundingPubkey = fundingPubKey;
|
|
1698
|
+
dlcOffer.payoutSpk = payoutSPK;
|
|
1363
1699
|
dlcOffer.payoutSerialId = payoutSerialId;
|
|
1364
|
-
dlcOffer.
|
|
1700
|
+
dlcOffer.offerCollateral = offerCollateralSatoshis;
|
|
1365
1701
|
dlcOffer.fundingInputs = fundingInputs;
|
|
1366
|
-
dlcOffer.
|
|
1702
|
+
dlcOffer.changeSpk = changeSPK;
|
|
1367
1703
|
dlcOffer.changeSerialId = changeSerialId;
|
|
1368
1704
|
dlcOffer.fundOutputSerialId = fundOutputSerialId;
|
|
1369
1705
|
dlcOffer.feeRatePerVb = feeRatePerVb;
|
|
1370
1706
|
dlcOffer.cetLocktime = cetLocktime;
|
|
1371
1707
|
dlcOffer.refundLocktime = refundLocktime;
|
|
1708
|
+
if (offerCollateralSatoshis === dlcOffer.contractInfo.totalCollateral) {
|
|
1709
|
+
dlcOffer.markAsSingleFunded();
|
|
1710
|
+
}
|
|
1372
1711
|
(0, assert_1.default)((() => {
|
|
1373
|
-
const finalizer = new
|
|
1712
|
+
const finalizer = new core_2.DualFundingTxFinalizer(dlcOffer.fundingInputs, dlcOffer.payoutSpk, dlcOffer.changeSpk, null, null, null, dlcOffer.feeRatePerVb);
|
|
1374
1713
|
const funding = fundingInputs.reduce((total, input) => {
|
|
1375
1714
|
return total + input.prevTx.outputs[input.prevTxVout].value.sats;
|
|
1376
1715
|
}, BigInt(0));
|
|
@@ -1382,7 +1721,7 @@ Payout Group not found');
|
|
|
1382
1721
|
return dlcOffers;
|
|
1383
1722
|
}
|
|
1384
1723
|
/**
|
|
1385
|
-
* Accept DLC Offer
|
|
1724
|
+
* Accept DLC Offer (supports single-funded DLCs when accept collateral is 0)
|
|
1386
1725
|
* @param _dlcOffer Dlc Offer Message
|
|
1387
1726
|
* @param fixedInputs Optional inputs to use for Funding Inputs
|
|
1388
1727
|
* @returns {Promise<AcceptDlcOfferResponse}
|
|
@@ -1390,23 +1729,92 @@ Payout Group not found');
|
|
|
1390
1729
|
async acceptDlcOffer(_dlcOffer, fixedInputs) {
|
|
1391
1730
|
const { dlcOffer } = (0, Utils_1.checkTypes)({ _dlcOffer });
|
|
1392
1731
|
dlcOffer.validate();
|
|
1393
|
-
const acceptCollateralSatoshis = dlcOffer.contractInfo.totalCollateral - dlcOffer.
|
|
1732
|
+
const acceptCollateralSatoshis = dlcOffer.contractInfo.totalCollateral - dlcOffer.offerCollateral;
|
|
1394
1733
|
(0, assert_1.default)(acceptCollateralSatoshis ===
|
|
1395
|
-
dlcOffer.contractInfo.totalCollateral -
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1734
|
+
dlcOffer.contractInfo.totalCollateral - dlcOffer.offerCollateral, 'acceptCollaterialSatoshis should equal totalCollateral - offerCollateralSatoshis');
|
|
1735
|
+
let fundingPubKey;
|
|
1736
|
+
let payoutSPK;
|
|
1737
|
+
let payoutSerialId;
|
|
1738
|
+
let fundingInputs;
|
|
1739
|
+
let changeSPK;
|
|
1740
|
+
let changeSerialId;
|
|
1741
|
+
if (acceptCollateralSatoshis === BigInt(0)) {
|
|
1742
|
+
// Single-funded DLC: accept side provides no funding
|
|
1743
|
+
const network = await this.getConnectedNetwork();
|
|
1744
|
+
// Still need payout address for receiving DLC outcomes
|
|
1745
|
+
const payoutAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1746
|
+
payoutSPK = bitcoinjs_lib_1.address.toOutputScript(payoutAddress.address, network);
|
|
1747
|
+
// Generate funding pubkey for DLC contract construction
|
|
1748
|
+
const fundingAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1749
|
+
fundingPubKey = Buffer.from(fundingAddress.publicKey, 'hex');
|
|
1750
|
+
// Generate change address (even though not used)
|
|
1751
|
+
const changeAddress = await this.client.wallet.getUnusedAddress(true);
|
|
1752
|
+
changeSPK = bitcoinjs_lib_1.address.toOutputScript(changeAddress.address, network);
|
|
1753
|
+
if (fundingAddress.address === payoutAddress.address)
|
|
1754
|
+
throw Error('Address reuse');
|
|
1755
|
+
// Generate serial IDs
|
|
1756
|
+
payoutSerialId = (0, Utils_1.generateSerialId)();
|
|
1757
|
+
changeSerialId = (0, Utils_1.generateSerialId)();
|
|
1758
|
+
// No funding inputs for single-funded DLC
|
|
1759
|
+
fundingInputs = [];
|
|
1760
|
+
}
|
|
1761
|
+
else {
|
|
1762
|
+
// Standard DLC: accept side provides funding
|
|
1763
|
+
// Check if we have FundingInput[] (DLC inputs) or Input[] (regular inputs)
|
|
1764
|
+
const hasFundingInputs = fixedInputs && fixedInputs.length > 0 && 'prevTx' in fixedInputs[0]; // FundingInput has prevTx, Input doesn't
|
|
1765
|
+
let initResult;
|
|
1766
|
+
if (hasFundingInputs) {
|
|
1767
|
+
// Handle FundingInput[] directly (for DLC inputs)
|
|
1768
|
+
const fundingInputs = fixedInputs;
|
|
1769
|
+
const network = await this.getConnectedNetwork();
|
|
1770
|
+
// Generate addresses directly since we're bypassing Initialize()
|
|
1771
|
+
const payoutAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1772
|
+
const payoutSPK = bitcoinjs_lib_1.address.toOutputScript(payoutAddress.address, network);
|
|
1773
|
+
const changeAddress = await this.client.wallet.getUnusedAddress(true);
|
|
1774
|
+
const changeSPK = bitcoinjs_lib_1.address.toOutputScript(changeAddress.address, network);
|
|
1775
|
+
const fundingAddress = await this.client.wallet.getUnusedAddress(false);
|
|
1776
|
+
const fundingPubKey = Buffer.from(fundingAddress.publicKey, 'hex');
|
|
1777
|
+
if (fundingAddress.address === payoutAddress.address)
|
|
1778
|
+
throw Error('Address reuse');
|
|
1779
|
+
const payoutSerialId = (0, Utils_1.generateSerialId)();
|
|
1780
|
+
const changeSerialId = (0, Utils_1.generateSerialId)();
|
|
1781
|
+
initResult = {
|
|
1782
|
+
fundingPubKey,
|
|
1783
|
+
payoutSPK,
|
|
1784
|
+
payoutSerialId,
|
|
1785
|
+
fundingInputs,
|
|
1786
|
+
changeSPK,
|
|
1787
|
+
changeSerialId,
|
|
1788
|
+
};
|
|
1789
|
+
}
|
|
1790
|
+
else {
|
|
1791
|
+
// Handle Input[] through existing Initialize() flow
|
|
1792
|
+
// Use InputSupplementationMode.None when fixed inputs are provided
|
|
1793
|
+
// to avoid wallet lookup issues with unusual addresses
|
|
1794
|
+
const supplementationMode = fixedInputs && fixedInputs.length > 0
|
|
1795
|
+
? Input_1.InputSupplementationMode.None
|
|
1796
|
+
: Input_1.InputSupplementationMode.Required;
|
|
1797
|
+
initResult = await this.Initialize(acceptCollateralSatoshis, dlcOffer.feeRatePerVb, fixedInputs, supplementationMode);
|
|
1798
|
+
}
|
|
1799
|
+
fundingPubKey = initResult.fundingPubKey;
|
|
1800
|
+
payoutSPK = initResult.payoutSPK;
|
|
1801
|
+
payoutSerialId = initResult.payoutSerialId;
|
|
1802
|
+
changeSPK = initResult.changeSPK;
|
|
1803
|
+
changeSerialId = initResult.changeSerialId;
|
|
1804
|
+
const _fundingInputs = initResult.fundingInputs;
|
|
1805
|
+
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.FundingInput, 'FundingInput must be V0'));
|
|
1806
|
+
fundingInputs = _fundingInputs.map((input) => input);
|
|
1807
|
+
fundingInputs.sort((a, b) => Number(a.inputSerialId) - Number(b.inputSerialId));
|
|
1808
|
+
}
|
|
1809
|
+
(0, assert_1.default)(Buffer.compare(dlcOffer.fundingPubkey, fundingPubKey) !== 0, 'DlcOffer and DlcAccept FundingPubKey cannot be the same');
|
|
1810
|
+
const dlcAccept = new messaging_1.DlcAccept();
|
|
1811
|
+
dlcAccept.temporaryContractId = (0, crypto_1.sha256)(dlcOffer.serialize());
|
|
1812
|
+
dlcAccept.acceptCollateral = acceptCollateralSatoshis;
|
|
1813
|
+
dlcAccept.fundingPubkey = fundingPubKey;
|
|
1814
|
+
dlcAccept.payoutSpk = payoutSPK;
|
|
1407
1815
|
dlcAccept.payoutSerialId = dlcAccept.payoutSerialId = payoutSerialId;
|
|
1408
1816
|
dlcAccept.fundingInputs = fundingInputs;
|
|
1409
|
-
dlcAccept.
|
|
1817
|
+
dlcAccept.changeSpk = changeSPK;
|
|
1410
1818
|
dlcAccept.changeSerialId = dlcAccept.changeSerialId = changeSerialId;
|
|
1411
1819
|
(0, assert_1.default)(dlcAccept.changeSerialId !== dlcOffer.fundOutputSerialId, 'changeSerialId cannot equal the fundOutputSerialId');
|
|
1412
1820
|
(0, assert_1.default)(dlcOffer.payoutSerialId !== dlcAccept.payoutSerialId, 'offer.payoutSerialId cannot equal accept.payoutSerialId');
|
|
@@ -1418,23 +1826,26 @@ Payout Group not found');
|
|
|
1418
1826
|
];
|
|
1419
1827
|
return new Set(ids).size === ids.length;
|
|
1420
1828
|
})(), 'offer.changeSerialID, accept.changeSerialId and fundOutputSerialId must be unique');
|
|
1829
|
+
if (dlcOffer.singleFunded)
|
|
1830
|
+
dlcAccept.markAsSingleFunded();
|
|
1421
1831
|
dlcAccept.validate();
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1832
|
+
// Only validate funding requirements if accept side is providing collateral
|
|
1833
|
+
if (acceptCollateralSatoshis > BigInt(0)) {
|
|
1834
|
+
(0, assert_1.default)((() => {
|
|
1835
|
+
const finalizer = new core_2.DualFundingTxFinalizer(dlcOffer.fundingInputs, dlcOffer.payoutSpk, dlcOffer.changeSpk, dlcAccept.fundingInputs, dlcAccept.payoutSpk, dlcAccept.changeSpk, dlcOffer.feeRatePerVb);
|
|
1836
|
+
const funding = fundingInputs.reduce((total, input) => {
|
|
1837
|
+
return total + input.prevTx.outputs[input.prevTxVout].value.sats;
|
|
1838
|
+
}, BigInt(0));
|
|
1839
|
+
return funding >= acceptCollateralSatoshis + finalizer.acceptFees;
|
|
1840
|
+
})(), 'fundingInputs for dlcAccept must be greater than acceptCollateralSatoshis plus acceptFees');
|
|
1841
|
+
}
|
|
1429
1842
|
const { dlcTransactions, messagesList } = await this.createDlcTxs(dlcOffer, dlcAccept);
|
|
1430
|
-
const { cetSignatures, refundSignature
|
|
1431
|
-
(0, assert_1.default)(dlcTransactions.type === messaging_1.MessageType.DlcTransactionsV0, 'DlcTransactions must be V0');
|
|
1843
|
+
const { cetSignatures, refundSignature } = await this.CreateCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcTransactions, messagesList, false);
|
|
1432
1844
|
const _dlcTransactions = dlcTransactions;
|
|
1433
|
-
const contractId = (0, crypto_1.xor)(_dlcTransactions.fundTx.txId.serialize(), dlcAccept.
|
|
1845
|
+
const contractId = (0, crypto_1.xor)(_dlcTransactions.fundTx.txId.serialize(), dlcAccept.temporaryContractId);
|
|
1434
1846
|
_dlcTransactions.contractId = contractId;
|
|
1435
|
-
dlcAccept.
|
|
1847
|
+
dlcAccept.cetAdaptorSignatures = cetSignatures;
|
|
1436
1848
|
dlcAccept.refundSignature = refundSignature;
|
|
1437
|
-
dlcAccept.negotiationFields = new messaging_1.NegotiationFieldsV0();
|
|
1438
1849
|
return { dlcAccept, dlcTransactions: _dlcTransactions };
|
|
1439
1850
|
}
|
|
1440
1851
|
async batchAcceptDlcOffer(_dlcOffers, fixedInputs) {
|
|
@@ -1443,31 +1854,30 @@ Payout Group not found');
|
|
|
1443
1854
|
dlcOffer.validate();
|
|
1444
1855
|
return dlcOffer;
|
|
1445
1856
|
});
|
|
1446
|
-
const acceptCollaterals = dlcOffers.map((dlcOffer) => dlcOffer.contractInfo.totalCollateral -
|
|
1447
|
-
dlcOffer.offerCollateralSatoshis);
|
|
1857
|
+
const acceptCollaterals = dlcOffers.map((dlcOffer) => dlcOffer.contractInfo.totalCollateral - dlcOffer.offerCollateral);
|
|
1448
1858
|
const { fundingInputs: _fundingInputs, changeSPK, changeSerialId, initializeResponses, } = await this.BatchInitialize(acceptCollaterals, dlcOffers[0].feeRatePerVb, fixedInputs);
|
|
1449
1859
|
// Check that none of the funding pubkeys are the same between the
|
|
1450
1860
|
// dlcOffers and the dlcAccepts (from initializeResponses)
|
|
1451
1861
|
dlcOffers.forEach((dlcOffer) => {
|
|
1452
1862
|
initializeResponses.forEach((initializeResponse) => {
|
|
1453
|
-
(0, assert_1.default)(Buffer.compare(dlcOffer.
|
|
1863
|
+
(0, assert_1.default)(Buffer.compare(dlcOffer.fundingPubkey, initializeResponse.fundingPubKey) !== 0, 'DlcOffer and DlcAccept FundingPubKey cannot be the same');
|
|
1454
1864
|
});
|
|
1455
1865
|
});
|
|
1456
|
-
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.
|
|
1866
|
+
_fundingInputs.forEach((input) => (0, assert_1.default)(input.type === messaging_1.MessageType.FundingInput, 'FundingInput must be V0'));
|
|
1457
1867
|
const fundingInputs = _fundingInputs.map((input) => input);
|
|
1458
1868
|
fundingInputs.sort((a, b) => Number(a.inputSerialId) - Number(b.inputSerialId));
|
|
1459
1869
|
const dlcAccepts = [];
|
|
1460
1870
|
initializeResponses.forEach((initializeResponse, i) => {
|
|
1461
1871
|
const dlcOffer = dlcOffers[i];
|
|
1462
|
-
const dlcAccept = new messaging_1.
|
|
1872
|
+
const dlcAccept = new messaging_1.DlcAccept();
|
|
1463
1873
|
const { fundingPubKey, payoutSPK, payoutSerialId } = initializeResponse;
|
|
1464
|
-
dlcAccept.
|
|
1465
|
-
dlcAccept.
|
|
1466
|
-
dlcAccept.
|
|
1467
|
-
dlcAccept.
|
|
1874
|
+
dlcAccept.temporaryContractId = (0, crypto_1.sha256)(dlcOffers[i].serialize());
|
|
1875
|
+
dlcAccept.acceptCollateral = acceptCollaterals[i];
|
|
1876
|
+
dlcAccept.fundingPubkey = fundingPubKey;
|
|
1877
|
+
dlcAccept.payoutSpk = payoutSPK;
|
|
1468
1878
|
dlcAccept.payoutSerialId = payoutSerialId;
|
|
1469
1879
|
dlcAccept.fundingInputs = fundingInputs;
|
|
1470
|
-
dlcAccept.
|
|
1880
|
+
dlcAccept.changeSpk = changeSPK;
|
|
1471
1881
|
dlcAccept.changeSerialId = changeSerialId;
|
|
1472
1882
|
(0, assert_1.default)(dlcAccept.changeSerialId !== dlcOffer.fundOutputSerialId, 'changeSerialId cannot equal the fundOutputSerialId');
|
|
1473
1883
|
(0, assert_1.default)(dlcOffer.payoutSerialId !== dlcAccept.payoutSerialId, 'offer.payoutSerialId cannot equal accept.payoutSerialId');
|
|
@@ -1481,7 +1891,7 @@ Payout Group not found');
|
|
|
1481
1891
|
})(), 'offer.changeSerialID, accept.changeSerialId and fundOutputSerialId must be unique');
|
|
1482
1892
|
dlcAccept.validate();
|
|
1483
1893
|
(0, assert_1.default)((() => {
|
|
1484
|
-
const finalizer = new
|
|
1894
|
+
const finalizer = new core_2.DualFundingTxFinalizer(dlcOffer.fundingInputs, dlcOffer.payoutSpk, dlcOffer.changeSpk, dlcAccept.fundingInputs, dlcAccept.payoutSpk, dlcAccept.changeSpk, dlcOffer.feeRatePerVb);
|
|
1485
1895
|
const funding = fundingInputs.reduce((total, input) => {
|
|
1486
1896
|
return total + input.prevTx.outputs[input.prevTxVout].value.sats;
|
|
1487
1897
|
}, BigInt(0));
|
|
@@ -1489,20 +1899,18 @@ Payout Group not found');
|
|
|
1489
1899
|
})(), 'fundingInputs for dlcAccept must be greater than acceptCollateralSatoshis plus acceptFees');
|
|
1490
1900
|
dlcAccepts.push(dlcAccept);
|
|
1491
1901
|
});
|
|
1492
|
-
const { dlcTransactionsList, nestedMessagesList
|
|
1902
|
+
const { dlcTransactionsList, nestedMessagesList } = await this.createBatchDlcTxs(dlcOffers, dlcAccepts);
|
|
1493
1903
|
for (let i = 0; i < dlcAccepts.length; i++) {
|
|
1494
1904
|
const dlcOffer = dlcOffers[i];
|
|
1495
1905
|
const dlcAccept = dlcAccepts[i];
|
|
1496
1906
|
const dlcTransactions = dlcTransactionsList[i];
|
|
1497
1907
|
const messagesList = nestedMessagesList[i];
|
|
1498
|
-
const { cetSignatures, refundSignature
|
|
1499
|
-
(0, assert_1.default)(dlcTransactions.type === messaging_1.MessageType.DlcTransactionsV0, 'DlcTransactions must be V0');
|
|
1908
|
+
const { cetSignatures, refundSignature } = await this.CreateCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcTransactions, messagesList, false);
|
|
1500
1909
|
const _dlcTransactions = dlcTransactions;
|
|
1501
|
-
const contractId = (0, crypto_1.xor)(_dlcTransactions.fundTx.txId.serialize(), dlcAccept.
|
|
1910
|
+
const contractId = (0, crypto_1.xor)(_dlcTransactions.fundTx.txId.serialize(), dlcAccept.temporaryContractId);
|
|
1502
1911
|
_dlcTransactions.contractId = contractId;
|
|
1503
|
-
dlcAccepts[i].
|
|
1912
|
+
dlcAccepts[i].cetAdaptorSignatures = cetSignatures;
|
|
1504
1913
|
dlcAccepts[i].refundSignature = refundSignature;
|
|
1505
|
-
dlcAccepts[i].negotiationFields = new messaging_1.NegotiationFieldsV0();
|
|
1506
1914
|
}
|
|
1507
1915
|
return { dlcAccepts, dlcTransactionsList };
|
|
1508
1916
|
}
|
|
@@ -1512,25 +1920,21 @@ Payout Group not found');
|
|
|
1512
1920
|
* @param _dlcAccept Dlc Accept Message
|
|
1513
1921
|
* @returns {Promise<SignDlcAcceptResponse}
|
|
1514
1922
|
*/
|
|
1515
|
-
async signDlcAccept(
|
|
1516
|
-
const { dlcOffer, dlcAccept } = (0, Utils_1.checkTypes)({
|
|
1517
|
-
_dlcOffer,
|
|
1518
|
-
_dlcAccept,
|
|
1519
|
-
});
|
|
1923
|
+
async signDlcAccept(dlcOffer, dlcAccept) {
|
|
1520
1924
|
dlcOffer.validate();
|
|
1521
1925
|
dlcAccept.validate();
|
|
1522
|
-
(0, assert_1.default)(Buffer.compare(dlcOffer.
|
|
1523
|
-
const dlcSign = new messaging_1.
|
|
1926
|
+
(0, assert_1.default)(Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) !== 0, 'DlcOffer and DlcAccept FundingPubKey cannot be the same');
|
|
1927
|
+
const dlcSign = new messaging_1.DlcSign();
|
|
1524
1928
|
const { dlcTransactions, messagesList } = await this.createDlcTxs(dlcOffer, dlcAccept);
|
|
1525
1929
|
await this.VerifyCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcSign, dlcTransactions, messagesList, true);
|
|
1526
|
-
const { cetSignatures, refundSignature
|
|
1930
|
+
const { cetSignatures, refundSignature } = await this.CreateCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcTransactions, messagesList, true);
|
|
1527
1931
|
const fundingSignatures = await this.CreateFundingSigs(dlcOffer, dlcAccept, dlcTransactions, true);
|
|
1528
1932
|
const dlcTxs = dlcTransactions;
|
|
1529
|
-
const contractId = (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.
|
|
1530
|
-
(0, assert_1.default)(Buffer.compare(contractId, (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.
|
|
1933
|
+
const contractId = (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.temporaryContractId);
|
|
1934
|
+
(0, assert_1.default)(Buffer.compare(contractId, (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.temporaryContractId)) === 0, 'contractId must be the xor of funding txid, fundingOutputIndex and the tempContractId');
|
|
1531
1935
|
dlcTxs.contractId = contractId;
|
|
1532
1936
|
dlcSign.contractId = contractId;
|
|
1533
|
-
dlcSign.
|
|
1937
|
+
dlcSign.cetAdaptorSignatures = cetSignatures;
|
|
1534
1938
|
dlcSign.refundSignature = refundSignature;
|
|
1535
1939
|
dlcSign.fundingSignatures = fundingSignatures;
|
|
1536
1940
|
return { dlcSign, dlcTransactions: dlcTxs };
|
|
@@ -1546,7 +1950,7 @@ Payout Group not found');
|
|
|
1546
1950
|
dlcAccept.validate();
|
|
1547
1951
|
return dlcAccept;
|
|
1548
1952
|
});
|
|
1549
|
-
const { dlcTransactionsList, nestedMessagesList
|
|
1953
|
+
const { dlcTransactionsList, nestedMessagesList } = await this.createBatchDlcTxs(dlcOffers, dlcAccepts);
|
|
1550
1954
|
const dlcSigns = [];
|
|
1551
1955
|
const fundingSignatures = await this.CreateFundingSigs(dlcOffers[0], dlcAccepts[0], dlcTransactionsList[0], true);
|
|
1552
1956
|
for (let i = 0; i < dlcAccepts.length; i++) {
|
|
@@ -1554,14 +1958,14 @@ Payout Group not found');
|
|
|
1554
1958
|
const dlcAccept = dlcAccepts[i];
|
|
1555
1959
|
const dlcTransactions = dlcTransactionsList[i];
|
|
1556
1960
|
const messagesList = nestedMessagesList[i];
|
|
1557
|
-
const dlcSign = new messaging_1.
|
|
1961
|
+
const dlcSign = new messaging_1.DlcSign();
|
|
1558
1962
|
await this.VerifyCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcSign, dlcTransactions, messagesList, true);
|
|
1559
|
-
const { cetSignatures, refundSignature
|
|
1963
|
+
const { cetSignatures, refundSignature } = await this.CreateCetAdaptorAndRefundSigs(dlcOffer, dlcAccept, dlcTransactions, messagesList, true);
|
|
1560
1964
|
const dlcTxs = dlcTransactions;
|
|
1561
|
-
const contractId = (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.
|
|
1965
|
+
const contractId = (0, crypto_1.xor)(dlcTxs.fundTx.txId.serialize(), dlcAccept.temporaryContractId);
|
|
1562
1966
|
dlcTxs.contractId = contractId;
|
|
1563
1967
|
dlcSign.contractId = contractId;
|
|
1564
|
-
dlcSign.
|
|
1968
|
+
dlcSign.cetAdaptorSignatures = cetSignatures;
|
|
1565
1969
|
dlcSign.refundSignature = refundSignature;
|
|
1566
1970
|
dlcSign.fundingSignatures = fundingSignatures;
|
|
1567
1971
|
dlcSigns.push(dlcSign);
|
|
@@ -1570,26 +1974,20 @@ Payout Group not found');
|
|
|
1570
1974
|
}
|
|
1571
1975
|
/**
|
|
1572
1976
|
* Finalize Dlc Sign
|
|
1573
|
-
* @param
|
|
1574
|
-
* @param
|
|
1575
|
-
* @param
|
|
1576
|
-
* @param
|
|
1977
|
+
* @param dlcOffer Dlc Offer Message
|
|
1978
|
+
* @param dlcAccept Dlc Accept Message
|
|
1979
|
+
* @param dlcSign Dlc Sign Message
|
|
1980
|
+
* @param dlcTxs Dlc Transactions Message
|
|
1577
1981
|
* @returns {Promise<Tx>}
|
|
1578
1982
|
*/
|
|
1579
|
-
async finalizeDlcSign(
|
|
1580
|
-
const { dlcOffer, dlcAccept, dlcSign, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
1581
|
-
_dlcOffer,
|
|
1582
|
-
_dlcAccept,
|
|
1583
|
-
_dlcSign,
|
|
1584
|
-
_dlcTxs,
|
|
1585
|
-
});
|
|
1983
|
+
async finalizeDlcSign(dlcOffer, dlcAccept, dlcSign, dlcTxs) {
|
|
1586
1984
|
let messagesList = [];
|
|
1587
|
-
if (dlcOffer.contractInfo.type === messaging_1.MessageType.
|
|
1985
|
+
if (dlcOffer.contractInfo.type === messaging_1.MessageType.SingleContractInfo &&
|
|
1588
1986
|
dlcOffer.contractInfo.contractDescriptor.type ===
|
|
1589
|
-
messaging_1.MessageType.
|
|
1987
|
+
messaging_1.MessageType.SingleContractInfo) {
|
|
1590
1988
|
for (const outcome of dlcOffer.contractInfo
|
|
1591
1989
|
.contractDescriptor.outcomes) {
|
|
1592
|
-
messagesList.push({ messages: [outcome.outcome
|
|
1990
|
+
messagesList.push({ messages: [outcome.outcome] });
|
|
1593
1991
|
}
|
|
1594
1992
|
}
|
|
1595
1993
|
else {
|
|
@@ -1646,13 +2044,7 @@ Payout Group not found');
|
|
|
1646
2044
|
* @param isOfferer Whether party is Dlc Offerer
|
|
1647
2045
|
* @returns {Promise<Tx>}
|
|
1648
2046
|
*/
|
|
1649
|
-
async execute(
|
|
1650
|
-
const { dlcOffer, dlcAccept, dlcSign, dlcTxs } = (0, Utils_1.checkTypes)({
|
|
1651
|
-
_dlcOffer,
|
|
1652
|
-
_dlcAccept,
|
|
1653
|
-
_dlcSign,
|
|
1654
|
-
_dlcTxs,
|
|
1655
|
-
});
|
|
2047
|
+
async execute(dlcOffer, dlcAccept, dlcSign, dlcTxs, oracleAttestation, isOfferer) {
|
|
1656
2048
|
if (isOfferer === undefined)
|
|
1657
2049
|
isOfferer = await this.isOfferer(dlcOffer, dlcAccept);
|
|
1658
2050
|
this.ValidateEvent(dlcOffer, oracleAttestation);
|
|
@@ -1673,7 +2065,7 @@ Payout Group not found');
|
|
|
1673
2065
|
_dlcSign,
|
|
1674
2066
|
_dlcTxs,
|
|
1675
2067
|
});
|
|
1676
|
-
const signatures = Buffer.compare(dlcOffer.
|
|
2068
|
+
const signatures = Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) === -1
|
|
1677
2069
|
? [
|
|
1678
2070
|
dlcSign.refundSignature.toString('hex'),
|
|
1679
2071
|
dlcAccept.refundSignature.toString('hex'),
|
|
@@ -1687,8 +2079,8 @@ Payout Group not found');
|
|
|
1687
2079
|
signatures,
|
|
1688
2080
|
fundTxId: dlcTxs.fundTx.txId.toString(),
|
|
1689
2081
|
fundVout: dlcTxs.fundTxVout,
|
|
1690
|
-
localFundPubkey: dlcOffer.
|
|
1691
|
-
remoteFundPubkey: dlcAccept.
|
|
2082
|
+
localFundPubkey: dlcOffer.fundingPubkey.toString('hex'),
|
|
2083
|
+
remoteFundPubkey: dlcAccept.fundingPubkey.toString('hex'),
|
|
1692
2084
|
};
|
|
1693
2085
|
const refundHex = (await this.AddSignaturesToRefundTx(addSigsToRefundTxRequest)).hex;
|
|
1694
2086
|
return bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(refundHex));
|
|
@@ -1719,9 +2111,9 @@ Payout Group not found');
|
|
|
1719
2111
|
isOfferer = await this.isOfferer(dlcOffer, dlcAccept);
|
|
1720
2112
|
const network = await this.getConnectedNetwork();
|
|
1721
2113
|
const psbt = new bitcoinjs_lib_1.Psbt({ network });
|
|
1722
|
-
const fundingPubKeys = Buffer.compare(dlcOffer.
|
|
1723
|
-
? [dlcOffer.
|
|
1724
|
-
: [dlcAccept.
|
|
2114
|
+
const fundingPubKeys = Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) === -1
|
|
2115
|
+
? [dlcOffer.fundingPubkey, dlcAccept.fundingPubkey]
|
|
2116
|
+
: [dlcAccept.fundingPubkey, dlcOffer.fundingPubkey];
|
|
1725
2117
|
const p2ms = bitcoinjs_lib_1.payments.p2ms({
|
|
1726
2118
|
m: 2,
|
|
1727
2119
|
pubkeys: fundingPubKeys,
|
|
@@ -1734,20 +2126,18 @@ Payout Group not found');
|
|
|
1734
2126
|
// Initiate and build PSBT
|
|
1735
2127
|
let inputs = _inputs;
|
|
1736
2128
|
if (!_inputs) {
|
|
1737
|
-
const tempInputs = await this.
|
|
2129
|
+
const tempInputs = await this.GetInputsForAmountWithMode([BigInt(20000)], dlcOffer.feeRatePerVb, _inputs || [], Input_1.InputSupplementationMode.Required);
|
|
1738
2130
|
_inputs = tempInputs;
|
|
1739
2131
|
}
|
|
1740
|
-
inputs
|
|
1741
|
-
|
|
1742
|
-
...input,
|
|
1743
|
-
inputSerialId: input.inputSerialId || (0, Utils_1.generateSerialId)(),
|
|
1744
|
-
toUtxo: input.toUtxo,
|
|
1745
|
-
};
|
|
1746
|
-
});
|
|
1747
|
-
const pubkeys = await Promise.all(inputs.map(async (input) => {
|
|
2132
|
+
// Ensure all inputs have derivation paths by fetching from wallet
|
|
2133
|
+
const inputsWithPaths = await Promise.all(_inputs.map(async (input) => {
|
|
1748
2134
|
const address = await this.getMethod('getWalletAddress')(input.address);
|
|
1749
|
-
|
|
2135
|
+
const inputWithPath = new types_1.Input(input.txid, input.vout, input.address, input.amount, input.value, input.derivationPath || address.derivationPath, // Use derivationPath from wallet if not set
|
|
2136
|
+
input.maxWitnessLength, input.redeemScript, input.inputSerialId || (0, Utils_1.generateSerialId)(), input.scriptPubKey, input.label, input.confirmations, input.spendable, input.solvable, input.safe, input.dlcInput);
|
|
2137
|
+
return { input: inputWithPath, address };
|
|
1750
2138
|
}));
|
|
2139
|
+
inputs = inputsWithPaths.map((item) => item.input);
|
|
2140
|
+
const pubkeys = inputsWithPaths.map((item) => Buffer.from(item.address.publicKey, 'hex'));
|
|
1751
2141
|
const fundingInputSerialId = (0, Utils_1.generateSerialId)();
|
|
1752
2142
|
// Make temporary array to hold all inputs and then sort them
|
|
1753
2143
|
// this method can be improved later
|
|
@@ -1758,7 +2148,7 @@ Payout Group not found');
|
|
|
1758
2148
|
sequence: 0,
|
|
1759
2149
|
witnessUtxo: {
|
|
1760
2150
|
script: paymentVariant.output,
|
|
1761
|
-
value: Number(
|
|
2151
|
+
value: Number(this.getFundOutputValueSats(dlcTxs)),
|
|
1762
2152
|
},
|
|
1763
2153
|
witnessScript: paymentVariant.redeem.output,
|
|
1764
2154
|
inputSerialId: fundingInputSerialId,
|
|
@@ -1787,11 +2177,11 @@ Payout Group not found');
|
|
|
1787
2177
|
// Get index of fundingInput
|
|
1788
2178
|
const fundingInputIndex = sortedPsbtInputs.findIndex((input) => input.inputSerialId === fundingInputSerialId);
|
|
1789
2179
|
// add to psbt
|
|
1790
|
-
sortedPsbtInputs.forEach((input
|
|
2180
|
+
sortedPsbtInputs.forEach((input) => psbt.addInput(input));
|
|
1791
2181
|
const fundingInputs = await Promise.all(inputs.map(async (input) => {
|
|
1792
2182
|
return this.inputToFundingInput(input);
|
|
1793
2183
|
}));
|
|
1794
|
-
const finalizer = new
|
|
2184
|
+
const finalizer = new core_2.DualClosingTxFinalizer(fundingInputs, dlcOffer.payoutSpk, dlcAccept.payoutSpk, dlcOffer.feeRatePerVb);
|
|
1795
2185
|
const closeInputAmount = BigInt(inputs.reduce((acc, val) => acc + val.value, 0));
|
|
1796
2186
|
const offerPayoutValue = isOfferer
|
|
1797
2187
|
? closeInputAmount +
|
|
@@ -1806,11 +2196,11 @@ Payout Group not found');
|
|
|
1806
2196
|
const offerFirst = dlcOffer.payoutSerialId < dlcAccept.payoutSerialId;
|
|
1807
2197
|
psbt.addOutput({
|
|
1808
2198
|
value: Number(offerFirst ? offerPayoutValue : acceptPayoutValue),
|
|
1809
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcOffer.
|
|
2199
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcOffer.payoutSpk : dlcAccept.payoutSpk, network),
|
|
1810
2200
|
});
|
|
1811
2201
|
psbt.addOutput({
|
|
1812
2202
|
value: Number(offerFirst ? acceptPayoutValue : offerPayoutValue),
|
|
1813
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcAccept.
|
|
2203
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcAccept.payoutSpk : dlcOffer.payoutSpk, network),
|
|
1814
2204
|
});
|
|
1815
2205
|
// Generate keypair to sign inputs
|
|
1816
2206
|
const fundPrivateKeyPair = await this.GetFundKeyPair(dlcOffer, dlcAccept, isOfferer);
|
|
@@ -1821,6 +2211,9 @@ Payout Group not found');
|
|
|
1821
2211
|
if (i === fundingInputIndex)
|
|
1822
2212
|
return;
|
|
1823
2213
|
// derive keypair
|
|
2214
|
+
if (!input.derivationPath) {
|
|
2215
|
+
throw new Error(`Missing derivation path for input ${i}`);
|
|
2216
|
+
}
|
|
1824
2217
|
const keyPair = await this.getMethod('keyPair')(input.derivationPath);
|
|
1825
2218
|
psbt.signInput(i, keyPair);
|
|
1826
2219
|
}));
|
|
@@ -1843,10 +2236,10 @@ Payout Group not found');
|
|
|
1843
2236
|
pubKeyWitness.witness = inputSigs[i].pubkey;
|
|
1844
2237
|
witnessElements.push([sigWitness, pubKeyWitness]);
|
|
1845
2238
|
}
|
|
1846
|
-
const fundingSignatures = new messaging_1.
|
|
2239
|
+
const fundingSignatures = new messaging_1.FundingSignatures();
|
|
1847
2240
|
fundingSignatures.witnessElements = witnessElements;
|
|
1848
2241
|
// Create DlcClose
|
|
1849
|
-
const dlcClose = new messaging_1.
|
|
2242
|
+
const dlcClose = new messaging_1.DlcClose();
|
|
1850
2243
|
dlcClose.contractId = dlcTxs.contractId;
|
|
1851
2244
|
dlcClose.offerPayoutSatoshis = BigInt(psbt.txOutputs[offerFirst ? 0 : 1].value); // You give collateral back to users
|
|
1852
2245
|
dlcClose.acceptPayoutSatoshis = BigInt(psbt.txOutputs[offerFirst ? 1 : 0].value); // give collateral back to users
|
|
@@ -1879,7 +2272,7 @@ Payout Group not found');
|
|
|
1879
2272
|
throw Error('funding inputs not supported on BatchDlcClose'); // TODO support multiple funding inputs
|
|
1880
2273
|
const fundingInputSerialId = (0, Utils_1.generateSerialId)();
|
|
1881
2274
|
const fundingInputs = []; // TODO: support multiple funding inputs
|
|
1882
|
-
const finalizer = new
|
|
2275
|
+
const finalizer = new core_2.DualClosingTxFinalizer(fundingInputs, dlcOffer.payoutSpk, dlcAccept.payoutSpk, dlcOffer.feeRatePerVb);
|
|
1883
2276
|
// Generate keypair to sign inputs
|
|
1884
2277
|
const fundPrivateKeyPair = await this.GetFundKeyPair(dlcOffer, dlcAccept, isOfferer);
|
|
1885
2278
|
const closeInputAmount = BigInt(0); // TODO support multiple funding inputs
|
|
@@ -1902,8 +2295,8 @@ Payout Group not found');
|
|
|
1902
2295
|
const acceptPayoutValue = isOfferer
|
|
1903
2296
|
? collateralMinusPayout
|
|
1904
2297
|
: closeInputAmount + payoutMinusOfferFees;
|
|
1905
|
-
const fundingSignatures = new messaging_1.
|
|
1906
|
-
const dlcClose = new messaging_1.
|
|
2298
|
+
const fundingSignatures = new messaging_1.FundingSignatures();
|
|
2299
|
+
const dlcClose = new messaging_1.DlcClose();
|
|
1907
2300
|
dlcClose.contractId = dlcTxs.contractId;
|
|
1908
2301
|
dlcClose.offerPayoutSatoshis = offerPayoutValue;
|
|
1909
2302
|
dlcClose.acceptPayoutSatoshis = acceptPayoutValue;
|
|
@@ -1970,9 +2363,9 @@ Payout Group not found');
|
|
|
1970
2363
|
dlcClose.validate();
|
|
1971
2364
|
const network = await this.getConnectedNetwork();
|
|
1972
2365
|
const psbt = new bitcoinjs_lib_1.Psbt({ network });
|
|
1973
|
-
const fundingPubKeys = Buffer.compare(dlcOffer.
|
|
1974
|
-
? [dlcOffer.
|
|
1975
|
-
: [dlcAccept.
|
|
2366
|
+
const fundingPubKeys = Buffer.compare(dlcOffer.fundingPubkey, dlcAccept.fundingPubkey) === -1
|
|
2367
|
+
? [dlcOffer.fundingPubkey, dlcAccept.fundingPubkey]
|
|
2368
|
+
: [dlcAccept.fundingPubkey, dlcOffer.fundingPubkey];
|
|
1976
2369
|
const p2ms = bitcoinjs_lib_1.payments.p2ms({
|
|
1977
2370
|
m: 2,
|
|
1978
2371
|
pubkeys: fundingPubKeys,
|
|
@@ -1991,13 +2384,13 @@ Payout Group not found');
|
|
|
1991
2384
|
sequence: 0,
|
|
1992
2385
|
witnessUtxo: {
|
|
1993
2386
|
script: paymentVariant.output,
|
|
1994
|
-
value: Number(
|
|
2387
|
+
value: Number(this.getFundOutputValueSats(dlcTxs)),
|
|
1995
2388
|
},
|
|
1996
2389
|
witnessScript: paymentVariant.redeem.output,
|
|
1997
2390
|
inputSerialId: dlcClose.fundInputSerialId,
|
|
1998
2391
|
});
|
|
1999
2392
|
// add all dlc close inputs
|
|
2000
|
-
dlcClose.fundingInputs.forEach((input
|
|
2393
|
+
dlcClose.fundingInputs.forEach((input) => {
|
|
2001
2394
|
psbtInputs.push({
|
|
2002
2395
|
hash: input.prevTx.txId.serialize(),
|
|
2003
2396
|
index: input.prevTxVout,
|
|
@@ -2023,16 +2416,16 @@ Payout Group not found');
|
|
|
2023
2416
|
value: Number(offerFirst
|
|
2024
2417
|
? dlcClose.offerPayoutSatoshis
|
|
2025
2418
|
: dlcClose.acceptPayoutSatoshis),
|
|
2026
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcOffer.
|
|
2419
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcOffer.payoutSpk : dlcAccept.payoutSpk, network),
|
|
2027
2420
|
});
|
|
2028
2421
|
psbt.addOutput({
|
|
2029
2422
|
value: Number(offerFirst
|
|
2030
2423
|
? dlcClose.acceptPayoutSatoshis
|
|
2031
2424
|
: dlcClose.offerPayoutSatoshis),
|
|
2032
|
-
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcAccept.
|
|
2425
|
+
address: bitcoinjs_lib_1.address.fromOutputScript(offerFirst ? dlcAccept.payoutSpk : dlcOffer.payoutSpk, network),
|
|
2033
2426
|
});
|
|
2034
2427
|
// add to psbt
|
|
2035
|
-
sortedPsbtInputs.forEach((input
|
|
2428
|
+
sortedPsbtInputs.forEach((input) => psbt.addInput(input));
|
|
2036
2429
|
const offerer = await this.isOfferer(dlcOffer, dlcAccept);
|
|
2037
2430
|
// Generate keypair to sign inputs
|
|
2038
2431
|
const fundPrivateKeyPair = await this.GetFundKeyPair(dlcOffer, dlcAccept, offerer);
|
|
@@ -2040,7 +2433,7 @@ Payout Group not found');
|
|
|
2040
2433
|
psbt.signInput(fundingInputIndex, fundPrivateKeyPair);
|
|
2041
2434
|
const partialSig = [
|
|
2042
2435
|
{
|
|
2043
|
-
pubkey: offerer ? dlcAccept.
|
|
2436
|
+
pubkey: offerer ? dlcAccept.fundingPubkey : dlcOffer.fundingPubkey,
|
|
2044
2437
|
signature: await bitcoinjs_lib_1.script.signature.encode(dlcClose.closeSignature, 1), // encode using SIGHASH_ALL
|
|
2045
2438
|
},
|
|
2046
2439
|
];
|
|
@@ -2137,8 +2530,24 @@ Payout Group not found');
|
|
|
2137
2530
|
await this.CfdLoaded();
|
|
2138
2531
|
return this._cfdDlcJs.VerifyRefundTxSignature(jsonObject);
|
|
2139
2532
|
}
|
|
2533
|
+
async CreateSplicedDlcTransactions(jsonObject) {
|
|
2534
|
+
await this.CfdLoaded();
|
|
2535
|
+
return this._cfdDlcJs.CreateSplicedDlcTransactions(jsonObject);
|
|
2536
|
+
}
|
|
2537
|
+
async GetRawDlcFundingInputSignature(jsonObject) {
|
|
2538
|
+
await this.CfdLoaded();
|
|
2539
|
+
return this._cfdDlcJs.GetRawDlcFundingInputSignature(jsonObject);
|
|
2540
|
+
}
|
|
2541
|
+
async SignDlcFundingInput(jsonObject) {
|
|
2542
|
+
await this.CfdLoaded();
|
|
2543
|
+
return this._cfdDlcJs.SignDlcFundingInput(jsonObject);
|
|
2544
|
+
}
|
|
2545
|
+
async VerifyDlcFundingInputSignature(jsonObject) {
|
|
2546
|
+
await this.CfdLoaded();
|
|
2547
|
+
return this._cfdDlcJs.VerifyDlcFundingInputSignature(jsonObject);
|
|
2548
|
+
}
|
|
2140
2549
|
async fundingInputToInput(_input, findDerivationPath = true) {
|
|
2141
|
-
(0, assert_1.default)(_input.type === messaging_1.MessageType.
|
|
2550
|
+
(0, assert_1.default)(_input.type === messaging_1.MessageType.FundingInput, 'FundingInput must be V0');
|
|
2142
2551
|
const network = await this.getConnectedNetwork();
|
|
2143
2552
|
const input = _input;
|
|
2144
2553
|
const prevTx = input.prevTx;
|
|
@@ -2154,24 +2563,25 @@ Payout Group not found');
|
|
|
2154
2563
|
derivationPath = inputAddress.derivationPath;
|
|
2155
2564
|
}
|
|
2156
2565
|
}
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2566
|
+
// Check if this FundingInput has DLC input information to preserve
|
|
2567
|
+
const dlcInputMessage = input.dlcInput;
|
|
2568
|
+
let dlcInputInfo;
|
|
2569
|
+
if (dlcInputMessage) {
|
|
2570
|
+
dlcInputInfo = {
|
|
2571
|
+
localFundPubkey: dlcInputMessage.localFundPubkey.toString('hex'),
|
|
2572
|
+
remoteFundPubkey: dlcInputMessage.remoteFundPubkey.toString('hex'),
|
|
2573
|
+
contractId: dlcInputMessage.contractId.toString('hex'),
|
|
2574
|
+
};
|
|
2575
|
+
}
|
|
2576
|
+
return new types_1.Input(prevTx.txId.toString(), input.prevTxVout, _address, prevTxOut.value.bitcoin, Number(prevTxOut.value.sats), derivationPath, input.maxWitnessLen, input.redeemScript ? input.redeemScript.toString('hex') : '', input.inputSerialId, scriptPubKey.toString('hex'), undefined, // label
|
|
2577
|
+
undefined, // confirmations
|
|
2578
|
+
undefined, // spendable
|
|
2579
|
+
undefined, // solvable
|
|
2580
|
+
undefined, // safe
|
|
2581
|
+
dlcInputInfo);
|
|
2172
2582
|
}
|
|
2173
2583
|
async inputToFundingInput(input) {
|
|
2174
|
-
const fundingInput = new messaging_1.
|
|
2584
|
+
const fundingInput = new messaging_1.FundingInput();
|
|
2175
2585
|
fundingInput.prevTxVout = input.vout;
|
|
2176
2586
|
let txRaw = '';
|
|
2177
2587
|
try {
|
|
@@ -2198,12 +2608,99 @@ Payout Group not found');
|
|
|
2198
2608
|
fundingInput.inputSerialId = input.inputSerialId
|
|
2199
2609
|
? input.inputSerialId
|
|
2200
2610
|
: (0, Utils_1.generateSerialId)();
|
|
2611
|
+
// Preserve DLC input information if present
|
|
2612
|
+
if (input.isDlcInput()) {
|
|
2613
|
+
const dlcInputInfo = input.dlcInput;
|
|
2614
|
+
const dlcInput = new messaging_1.DlcInput();
|
|
2615
|
+
dlcInput.localFundPubkey = Buffer.from(dlcInputInfo.localFundPubkey, 'hex');
|
|
2616
|
+
dlcInput.remoteFundPubkey = Buffer.from(dlcInputInfo.remoteFundPubkey, 'hex');
|
|
2617
|
+
dlcInput.contractId = Buffer.alloc(32); // Placeholder contract ID
|
|
2618
|
+
fundingInput.dlcInput = dlcInput;
|
|
2619
|
+
}
|
|
2201
2620
|
return fundingInput;
|
|
2202
2621
|
}
|
|
2203
2622
|
async getConnectedNetwork() {
|
|
2204
2623
|
return this._network;
|
|
2205
2624
|
}
|
|
2625
|
+
/**
|
|
2626
|
+
* Calculate the maximum collateral possible with given inputs
|
|
2627
|
+
* @param inputs Array of Input objects to use for funding
|
|
2628
|
+
* @param feeRatePerVb Fee rate in satoshis per virtual byte
|
|
2629
|
+
* @param contractCount Number of DLC contracts (default: 1)
|
|
2630
|
+
* @returns Maximum collateral amount in satoshis
|
|
2631
|
+
*/
|
|
2632
|
+
async calculateMaxCollateral(inputs, feeRatePerVb, contractCount = 1) {
|
|
2633
|
+
if (inputs.length === 0) {
|
|
2634
|
+
return BigInt(0);
|
|
2635
|
+
}
|
|
2636
|
+
try {
|
|
2637
|
+
// Convert Input[] to FundingInput[]
|
|
2638
|
+
const fundingInputs = await Promise.all(inputs.map((input) => this.inputToFundingInput(input)));
|
|
2639
|
+
// Use node-dlc's calculateMaxCollateral function
|
|
2640
|
+
// For single-funded DLC, pass only offerer inputs and fee rate
|
|
2641
|
+
return core_1.BatchDlcTxBuilder.calculateMaxCollateral(fundingInputs, feeRatePerVb, contractCount);
|
|
2642
|
+
}
|
|
2643
|
+
catch (error) {
|
|
2644
|
+
// If calculation fails, return 0 to indicate insufficient funds
|
|
2645
|
+
console.warn('calculateMaxCollateral failed:', error);
|
|
2646
|
+
return BigInt(0);
|
|
2647
|
+
}
|
|
2648
|
+
}
|
|
2649
|
+
/**
|
|
2650
|
+
* Create a funding input with DLC input information for splicing
|
|
2651
|
+
* @param dlcInputInfo DLC input information
|
|
2652
|
+
* @param fundingTxHex Raw transaction hex of the funding transaction
|
|
2653
|
+
*/
|
|
2654
|
+
async createDlcFundingInput(dlcInputInfo, fundingTxHex) {
|
|
2655
|
+
const fundingInput = new messaging_1.FundingInput();
|
|
2656
|
+
const tx = bitcoin_1.Tx.decode(bufio_1.StreamReader.fromHex(fundingTxHex));
|
|
2657
|
+
fundingInput.prevTx = tx;
|
|
2658
|
+
fundingInput.prevTxVout = dlcInputInfo.fundVout;
|
|
2659
|
+
fundingInput.sequence = bitcoin_1.Sequence.default();
|
|
2660
|
+
fundingInput.maxWitnessLen = dlcInputInfo.maxWitnessLength || 220;
|
|
2661
|
+
fundingInput.redeemScript = Buffer.from('', 'hex'); // Empty for P2WSH
|
|
2662
|
+
fundingInput.inputSerialId = BigInt(dlcInputInfo.inputSerialId || (0, Utils_1.generateSerialId)());
|
|
2663
|
+
// Create the DLC multisig script for address generation
|
|
2664
|
+
const localPubkey = Buffer.from(dlcInputInfo.localFundPubkey, 'hex');
|
|
2665
|
+
const remotePubkey = Buffer.from(dlcInputInfo.remoteFundPubkey, 'hex');
|
|
2666
|
+
// Use the same deterministic ordering as cfd-dlc-js: lexicographic by hex
|
|
2667
|
+
// This matches GetOrderedPubkeys() in cfddlc_transactions.cpp
|
|
2668
|
+
const orderedPubkeys = dlcInputInfo.localFundPubkey < dlcInputInfo.remoteFundPubkey
|
|
2669
|
+
? [localPubkey, remotePubkey]
|
|
2670
|
+
: [remotePubkey, localPubkey];
|
|
2671
|
+
const network = await this.getConnectedNetwork();
|
|
2672
|
+
// Create 2-of-2 multisig payment using deterministic ordering
|
|
2673
|
+
const p2ms = bitcoinjs_lib_1.payments.p2ms({
|
|
2674
|
+
m: 2,
|
|
2675
|
+
pubkeys: orderedPubkeys,
|
|
2676
|
+
network,
|
|
2677
|
+
});
|
|
2678
|
+
const paymentVariant = bitcoinjs_lib_1.payments.p2wsh({
|
|
2679
|
+
redeem: p2ms,
|
|
2680
|
+
network,
|
|
2681
|
+
});
|
|
2682
|
+
const multisigAddress = paymentVariant.address;
|
|
2683
|
+
// Verify this matches the actual funding output address
|
|
2684
|
+
const actualFundingOutput = tx.outputs[dlcInputInfo.fundVout];
|
|
2685
|
+
const actualFundingAddress = bitcoinjs_lib_1.address.fromOutputScript(actualFundingOutput.scriptPubKey.serialize().slice(1), network);
|
|
2686
|
+
if (actualFundingAddress !== multisigAddress) {
|
|
2687
|
+
throw new Error(`DLC funding address mismatch. ` +
|
|
2688
|
+
`Expected: ${actualFundingAddress}, ` +
|
|
2689
|
+
`Constructed: ${multisigAddress}`);
|
|
2690
|
+
}
|
|
2691
|
+
// Add toUtxo method that's expected by GetInputsForAmount
|
|
2692
|
+
fundingInput.toUtxo = () => {
|
|
2693
|
+
return new types_1.Utxo(dlcInputInfo.fundTxid, dlcInputInfo.fundVout, types_1.Amount.FromSatoshis(Number(dlcInputInfo.fundAmount)), multisigAddress, '', // DLC inputs don't have derivation paths
|
|
2694
|
+
dlcInputInfo.maxWitnessLength || 220, fundingInput.inputSerialId);
|
|
2695
|
+
};
|
|
2696
|
+
// Create proper DlcInput object for splicing detection and signing
|
|
2697
|
+
const dlcInput = new messaging_1.DlcInput();
|
|
2698
|
+
dlcInput.localFundPubkey = Buffer.from(dlcInputInfo.localFundPubkey, 'hex');
|
|
2699
|
+
dlcInput.remoteFundPubkey = Buffer.from(dlcInputInfo.remoteFundPubkey, 'hex');
|
|
2700
|
+
dlcInput.contractId = Buffer.from(dlcInputInfo.contractId, 'hex');
|
|
2701
|
+
fundingInput.dlcInput = dlcInput;
|
|
2702
|
+
return fundingInput;
|
|
2703
|
+
}
|
|
2206
2704
|
}
|
|
2207
2705
|
exports.default = BitcoinDlcProvider;
|
|
2208
|
-
const BurnAddress = 'bcrt1qxcjufgh2jarkp2qkx68azh08w9v5gah8u6es8s';
|
|
2209
2706
|
//# sourceMappingURL=BitcoinDlcProvider.js.map
|