@btc-vision/transaction 1.0.97 → 1.0.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +4 -7
- package/.prettierrc.json +11 -11
- package/CONTRIBUTING.md +71 -71
- package/LICENSE.md +62 -62
- package/README.md +76 -76
- package/browser/_version.d.ts +1 -1
- package/browser/bytecode/Compressor.d.ts +0 -1
- package/browser/crypto/crypto-browser.d.ts +1 -30
- package/browser/crypto/crypto.d.ts +0 -1
- package/browser/generators/AddressGenerator.d.ts +0 -1
- package/browser/generators/Generator.d.ts +2 -3
- package/browser/generators/builders/CalldataGenerator.d.ts +0 -1
- package/browser/generators/builders/CustomGenerator.d.ts +6 -0
- package/browser/generators/builders/DeploymentGenerator.d.ts +0 -1
- package/browser/generators/builders/MultiSignGenerator.d.ts +0 -1
- package/browser/index.js +1 -1
- package/browser/keypair/EcKeyPair.d.ts +0 -1
- package/browser/keypair/Wallet.d.ts +0 -1
- package/browser/opnet.d.ts +5 -3
- package/browser/signer/TweakedSigner.d.ts +0 -1
- package/browser/transaction/TransactionFactory.d.ts +2 -0
- package/browser/transaction/browser/BrowserSignerBase.d.ts +0 -1
- package/browser/transaction/browser/extensions/UnisatSigner.d.ts +0 -1
- package/{build/transaction/builders/DeploymentTransactionV2.d.ts → browser/transaction/builders/CustomScriptTransaction.d.ts} +16 -12
- package/browser/transaction/builders/DeploymentTransaction.d.ts +0 -1
- package/browser/transaction/builders/InteractionTransaction.d.ts +0 -1
- package/browser/transaction/builders/MultiSignTransaction.d.ts +0 -1
- package/browser/transaction/builders/SharedInteractionTransaction.d.ts +0 -1
- package/browser/transaction/builders/TransactionBuilder.d.ts +0 -1
- package/browser/transaction/builders/UnwrapSegwitTransaction.d.ts +0 -1
- package/browser/transaction/builders/UnwrapTransaction.d.ts +0 -1
- package/browser/transaction/builders/WrapTransaction.d.ts +0 -1
- package/browser/transaction/enums/TransactionType.d.ts +2 -1
- package/browser/transaction/interfaces/ITransactionParameters.d.ts +0 -1
- package/browser/transaction/interfaces/Tap.d.ts +0 -1
- package/browser/transaction/shared/P2TR_MS.d.ts +0 -1
- package/browser/transaction/shared/TweakedTransaction.d.ts +0 -1
- package/browser/utils/BitcoinUtils.d.ts +0 -1
- package/browser/verification/TapscriptVerificator.d.ts +0 -1
- package/browser/wbtc/WrappedGenerationParameters.d.ts +0 -1
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/bytecode/Compressor.d.ts +0 -1
- package/build/bytecode/Compressor.js +4 -4
- package/build/crypto/crypto.d.ts +0 -1
- package/build/generators/AddressGenerator.d.ts +0 -1
- package/build/generators/Generator.d.ts +2 -3
- package/build/generators/Generator.js +3 -5
- package/build/generators/builders/CalldataGenerator.d.ts +0 -1
- package/build/generators/builders/CalldataGenerator.js +2 -0
- package/build/generators/builders/CustomGenerator.d.ts +6 -0
- package/build/generators/builders/CustomGenerator.js +16 -0
- package/build/generators/builders/DeploymentGenerator.d.ts +0 -1
- package/build/generators/builders/DeploymentGenerator.js +2 -0
- package/build/generators/builders/{MultisignGenerator.d.ts → MultiSignGenerator.d.ts} +0 -1
- package/build/generators/builders/{MultisignGenerator.js → MultiSignGenerator.js} +1 -1
- package/build/keypair/EcKeyPair.d.ts +0 -1
- package/build/keypair/EcKeyPair.js +2 -2
- package/build/keypair/Wallet.d.ts +0 -1
- package/build/keypair/Wallet.js +0 -5
- package/build/metadata/ContractBaseMetadata.js +0 -1
- package/build/metadata/contracts/wBTC.js +3 -5
- package/build/metadata/tokens.js +32 -30
- package/build/opnet.d.ts +5 -3
- package/build/opnet.js +5 -3
- package/build/signer/TweakedSigner.d.ts +0 -1
- package/build/transaction/TransactionFactory.d.ts +2 -0
- package/build/transaction/TransactionFactory.js +42 -3
- package/build/transaction/browser/BrowserSignerBase.d.ts +0 -1
- package/build/transaction/browser/extensions/UnisatSigner.d.ts +0 -1
- package/build/transaction/browser/extensions/UnisatSigner.js +1 -6
- package/build/transaction/builders/CustomScriptTransaction.d.ts +40 -0
- package/build/transaction/builders/{DeploymentTransactionV2.js → CustomScriptTransaction.js} +40 -67
- package/build/transaction/builders/DeploymentTransaction.d.ts +0 -1
- package/build/transaction/builders/DeploymentTransaction.js +25 -33
- package/build/transaction/builders/FundingTransaction.js +1 -3
- package/build/transaction/builders/InteractionTransaction.d.ts +0 -1
- package/build/transaction/builders/InteractionTransaction.js +2 -5
- package/build/transaction/builders/MultiSignTransaction.d.ts +0 -1
- package/build/transaction/builders/MultiSignTransaction.js +66 -73
- package/build/transaction/builders/SharedInteractionTransaction.d.ts +0 -1
- package/build/transaction/builders/SharedInteractionTransaction.js +20 -25
- package/build/transaction/builders/TransactionBuilder.d.ts +0 -1
- package/build/transaction/builders/TransactionBuilder.js +12 -21
- package/build/transaction/builders/UnwrapSegwitTransaction.d.ts +0 -1
- package/build/transaction/builders/UnwrapSegwitTransaction.js +4 -10
- package/build/transaction/builders/UnwrapTransaction.d.ts +0 -1
- package/build/transaction/builders/UnwrapTransaction.js +5 -11
- package/build/transaction/builders/WrapTransaction.d.ts +0 -1
- package/build/transaction/builders/WrapTransaction.js +5 -12
- package/build/transaction/enums/TransactionType.d.ts +2 -1
- package/build/transaction/enums/TransactionType.js +1 -0
- package/build/transaction/interfaces/ITransactionParameters.d.ts +0 -1
- package/build/transaction/interfaces/Tap.d.ts +0 -1
- package/build/transaction/processor/PsbtTransaction.js +3 -4
- package/build/transaction/shared/P2TR_MS.d.ts +0 -1
- package/build/transaction/shared/TweakedTransaction.d.ts +0 -1
- package/build/transaction/shared/TweakedTransaction.js +11 -16
- package/build/utils/BitcoinUtils.d.ts +0 -1
- package/build/utxo/OPNetLimitedProvider.js +2 -3
- package/build/verification/TapscriptVerificator.d.ts +0 -1
- package/build/verification/TapscriptVerificator.js +1 -1
- package/build/wbtc/UnwrapGeneration.js +0 -2
- package/build/wbtc/WrappedGenerationParameters.d.ts +0 -1
- package/build/wbtc/WrappedGenerationParameters.js +0 -6
- package/cjs/package.json +3 -0
- package/gulpfile.js +49 -133
- package/package.json +112 -113
- package/src/_version.ts +1 -1
- package/src/bytecode/Compressor.ts +27 -27
- package/src/consensus/metadata/RoswellConsensus.ts +26 -26
- package/src/crypto/crypto.ts +1 -1
- package/src/generators/Generator.ts +75 -75
- package/src/generators/builders/CalldataGenerator.ts +2 -0
- package/src/generators/builders/CustomGenerator.ts +30 -0
- package/src/generators/builders/DeploymentGenerator.ts +2 -0
- package/src/generators/builders/MultiSignGenerator.ts +73 -73
- package/src/metadata/contracts/wBTC.ts +60 -60
- package/src/metadata/tokens.ts +135 -135
- package/src/network/ChainId.ts +6 -6
- package/src/opnet.ts +82 -82
- package/src/signer/TweakedSigner.ts +56 -56
- package/src/transaction/TransactionFactory.ts +72 -14
- package/src/transaction/builders/CustomScriptTransaction.ts +337 -0
- package/src/transaction/builders/DeploymentTransaction.ts +356 -356
- package/src/transaction/builders/MultiSignTransaction.ts +659 -659
- package/src/transaction/builders/UnwrapSegwitTransaction.ts +365 -365
- package/src/transaction/builders/UnwrapTransaction.ts +507 -507
- package/src/transaction/enums/TransactionType.ts +10 -9
- package/src/transaction/processor/PsbtTransaction.ts +173 -173
- package/src/transaction/shared/P2TR_MS.ts +42 -42
- package/src/transaction/shared/TweakedTransaction.ts +539 -539
- package/src/utils/BitcoinUtils.ts +96 -96
- package/tsconfig.base.json +27 -43
- package/tsconfig.json +15 -8
- package/tsconfig.webpack.json +22 -22
- package/EPOCH.md +0 -250
- package/VAULT_TARGET_CONSOLIDATION.md +0 -111
- package/browser/network/NetworkInformation.d.ts +0 -6
- package/browser/transaction/browser/BrowserSigner.d.ts +0 -9
- package/browser/transaction/builders/TapUnwarpTransaction.d.ts +0 -40
- package/browser/transaction/builders/UnwarpTransaction.d.ts +0 -34
- package/browser/utxo/UTXOManager.d.ts +0 -7
- package/build/Utils.d.ts +0 -0
- package/build/Utils.js +0 -1
- package/build/consensus/metadata/RoswsellConsensus.d.ts +0 -2
- package/build/consensus/metadata/RoswsellConsensus.js +0 -4
- package/build/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/contracts/ContractMetadataManager.js +0 -1
- package/build/generators/OPNetAddressGenerator.d.ts +0 -0
- package/build/generators/OPNetAddressGenerator.js +0 -1
- package/build/generators/builders/DeploymentGeneratorV2.d.ts +0 -13
- package/build/generators/builders/DeploymentGeneratorV2.js +0 -57
- package/build/generators/builders/UnwrapGenerator.d.ts +0 -8
- package/build/generators/builders/UnwrapGenerator.js +0 -79
- package/build/keypair/interfaces/GeneratedWallet.d.ts +0 -5
- package/build/keypair/interfaces/GeneratedWallet.js +0 -1
- package/build/metadata/CommonContracts.d.ts +0 -6
- package/build/metadata/CommonContracts.js +0 -5
- package/build/metadata/ContractMetadataManager.d.ts +0 -1
- package/build/metadata/ContractMetadataManager.js +0 -9
- package/build/metadata/contracts/ContractBase.d.ts +0 -9
- package/build/metadata/contracts/ContractBase.js +0 -13
- package/build/metadata/contracts/ContractBaseMetadata.d.ts +0 -9
- package/build/metadata/contracts/ContractBaseMetadata.js +0 -13
- package/build/metadata/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/metadata/contracts/ContractMetadataManager.js +0 -1
- package/build/network/NetworkConverter.d.ts +0 -0
- package/build/network/NetworkConverter.js +0 -14
- package/build/network/NetworkInformation.d.ts +0 -6
- package/build/network/NetworkInformation.js +0 -1
- package/build/scripts/Regtest.d.ts +0 -2
- package/build/scripts/Regtest.js +0 -15
- package/build/scripts/test.d.ts +0 -1
- package/build/scripts/test.js +0 -74
- package/build/signer/Regtest.d.ts +0 -2
- package/build/signer/Regtest.js +0 -15
- package/build/tests/Regtest.d.ts +0 -3
- package/build/tests/Regtest.js +0 -29
- package/build/tests/adaptPSBT.d.ts +0 -1
- package/build/tests/adaptPSBT.js +0 -44
- package/build/tests/btc/send.d.ts +0 -1
- package/build/tests/btc/send.js +0 -35
- package/build/tests/btc/transfer.d.ts +0 -1
- package/build/tests/btc/transfer.js +0 -35
- package/build/tests/createPairReg.d.ts +0 -1
- package/build/tests/createPairReg.js +0 -73
- package/build/tests/deploy/deployMoto.d.ts +0 -4
- package/build/tests/deploy/deployMoto.js +0 -89
- package/build/tests/deploy/deployPool.d.ts +0 -1
- package/build/tests/deploy/deployPool.js +0 -5
- package/build/tests/deploy/deployStep1.d.ts +0 -1
- package/build/tests/deploy/deployStep1.js +0 -5
- package/build/tests/deploy/deployStep2.d.ts +0 -1
- package/build/tests/deploy/deployStep2.js +0 -5
- package/build/tests/deploy/deployStep3.d.ts +0 -1
- package/build/tests/deploy/deployStep3.js +0 -5
- package/build/tests/deploy.d.ts +0 -1
- package/build/tests/deploy.js +0 -41
- package/build/tests/deployMotoRegStep1.d.ts +0 -1
- package/build/tests/deployMotoRegStep1.js +0 -85
- package/build/tests/deployReg.d.ts +0 -1
- package/build/tests/deployReg.js +0 -85
- package/build/tests/factory/createPairReg.d.ts +0 -1
- package/build/tests/factory/createPairReg.js +0 -13
- package/build/tests/gen.d.ts +0 -1
- package/build/tests/gen.js +0 -19
- package/build/tests/interaction.d.ts +0 -5
- package/build/tests/interaction.js +0 -62
- package/build/tests/massWrapReg.d.ts +0 -1
- package/build/tests/massWrapReg.js +0 -105
- package/build/tests/mineReg.d.ts +0 -1
- package/build/tests/mineReg.js +0 -19
- package/build/tests/moto/airdropToken.d.ts +0 -1
- package/build/tests/moto/airdropToken.js +0 -21
- package/build/tests/moto/airdropTokens.d.ts +0 -1
- package/build/tests/moto/airdropTokens.js +0 -60
- package/build/tests/moto/allowance.d.ts +0 -1
- package/build/tests/moto/allowance.js +0 -6
- package/build/tests/moto/approve.d.ts +0 -1
- package/build/tests/moto/approve.js +0 -10
- package/build/tests/moto/approveWBTC.d.ts +0 -1
- package/build/tests/moto/approveWBTC.js +0 -12
- package/build/tests/moto/balanceOf.d.ts +0 -1
- package/build/tests/moto/balanceOf.js +0 -12
- package/build/tests/moto/transfer.d.ts +0 -1
- package/build/tests/moto/transfer.js +0 -16
- package/build/tests/motoswap/airdropToken.d.ts +0 -11
- package/build/tests/motoswap/airdropToken.js +0 -36
- package/build/tests/motoswap/deployMoto.d.ts +0 -4
- package/build/tests/motoswap/deployMoto.js +0 -89
- package/build/tests/motoswap/deployMotoRegStep1.d.ts +0 -1
- package/build/tests/motoswap/deployMotoRegStep1.js +0 -91
- package/build/tests/motoswap/deployMotoRegStep2.d.ts +0 -1
- package/build/tests/motoswap/deployMotoRegStep2.js +0 -91
- package/build/tests/motoswap/deployPool.d.ts +0 -1
- package/build/tests/motoswap/deployPool.js +0 -5
- package/build/tests/motoswap/deployStep1.d.ts +0 -1
- package/build/tests/motoswap/deployStep1.js +0 -5
- package/build/tests/motoswap/deployStep2.d.ts +0 -1
- package/build/tests/motoswap/deployStep2.js +0 -5
- package/build/tests/motoswap/deployStep3.d.ts +0 -1
- package/build/tests/motoswap/deployStep3.js +0 -5
- package/build/tests/motoswap/interaction.d.ts +0 -3
- package/build/tests/motoswap/interaction.js +0 -63
- package/build/tests/motoswap/routerAddLiquidity.d.ts +0 -11
- package/build/tests/motoswap/routerAddLiquidity.js +0 -35
- package/build/tests/motoswap-router/addLiquidity.d.ts +0 -11
- package/build/tests/motoswap-router/addLiquidity.js +0 -36
- package/build/tests/motoswap-router/deployMoto.d.ts +0 -4
- package/build/tests/motoswap-router/deployMoto.js +0 -89
- package/build/tests/motoswap-router/deployPool.d.ts +0 -1
- package/build/tests/motoswap-router/deployPool.js +0 -5
- package/build/tests/motoswap-router/deployStep1.d.ts +0 -1
- package/build/tests/motoswap-router/deployStep1.js +0 -5
- package/build/tests/motoswap-router/deployStep2.d.ts +0 -1
- package/build/tests/motoswap-router/deployStep2.js +0 -5
- package/build/tests/motoswap-router/deployStep3.d.ts +0 -1
- package/build/tests/motoswap-router/deployStep3.js +0 -5
- package/build/tests/motoswap-router/getAmountsOut.d.ts +0 -5
- package/build/tests/motoswap-router/getAmountsOut.js +0 -34
- package/build/tests/motoswap-router/routerAddLiquidity.d.ts +0 -11
- package/build/tests/motoswap-router/routerAddLiquidity.js +0 -35
- package/build/tests/motoswap-router/swap.d.ts +0 -8
- package/build/tests/motoswap-router/swap.js +0 -24
- package/build/tests/multisign.d.ts +0 -1
- package/build/tests/multisign.js +0 -47
- package/build/tests/multisign2.d.ts +0 -1
- package/build/tests/multisign2.js +0 -27
- package/build/tests/pool/DecodePoolAddress.d.ts +0 -6
- package/build/tests/pool/DecodePoolAddress.js +0 -12
- package/build/tests/pool/decodeReserves.d.ts +0 -5
- package/build/tests/pool/decodeReserves.js +0 -13
- package/build/tests/pool/reserves.d.ts +0 -1
- package/build/tests/pool/reserves.js +0 -18
- package/build/tests/shared/Utils.d.ts +0 -2
- package/build/tests/shared/Utils.js +0 -14
- package/build/tests/shared/interaction.d.ts +0 -7
- package/build/tests/shared/interaction.js +0 -85
- package/build/tests/shared/tokens.d.ts +0 -6
- package/build/tests/shared/tokens.js +0 -5
- package/build/tests/stakeReg.d.ts +0 -1
- package/build/tests/stakeReg.js +0 -73
- package/build/tests/stakedReg.d.ts +0 -1
- package/build/tests/stakedReg.js +0 -28
- package/build/tests/test.d.ts +0 -1
- package/build/tests/test.js +0 -51
- package/build/tests/test2.d.ts +0 -1
- package/build/tests/test2.js +0 -73
- package/build/tests/testReg.d.ts +0 -1
- package/build/tests/testReg.js +0 -91
- package/build/tests/tokens.d.ts +0 -6
- package/build/tests/tokens.js +0 -5
- package/build/tests/totalRewardReg.d.ts +0 -1
- package/build/tests/totalRewardReg.js +0 -28
- package/build/tests/transfer.d.ts +0 -1
- package/build/tests/transfer.js +0 -74
- package/build/tests/transferReg.d.ts +0 -1
- package/build/tests/transferReg.js +0 -74
- package/build/tests/unStakeReg.d.ts +0 -1
- package/build/tests/unStakeReg.js +0 -72
- package/build/tests/unwrapReg.d.ts +0 -1
- package/build/tests/unwrapReg.js +0 -61
- package/build/tests/unwrapReg2.d.ts +0 -1
- package/build/tests/unwrapReg2.js +0 -56
- package/build/tests/unwrapRegSegwit.d.ts +0 -1
- package/build/tests/unwrapRegSegwit.js +0 -83
- package/build/tests/wbtc/approve.d.ts +0 -1
- package/build/tests/wbtc/approve.js +0 -6
- package/build/tests/wbtc/approveWBTC.d.ts +0 -1
- package/build/tests/wbtc/approveWBTC.js +0 -12
- package/build/tests/wbtc/massWrapReg.d.ts +0 -1
- package/build/tests/wbtc/massWrapReg.js +0 -105
- package/build/tests/wbtc/transfer.d.ts +0 -1
- package/build/tests/wbtc/transfer.js +0 -16
- package/build/tests/wbtc/transferReg.d.ts +0 -1
- package/build/tests/wbtc/transferReg.js +0 -16
- package/build/tests/wbtc/unStakeReg.d.ts +0 -1
- package/build/tests/wbtc/unStakeReg.js +0 -72
- package/build/tests/wbtc/unwrapReg.d.ts +0 -1
- package/build/tests/wbtc/unwrapReg.js +0 -60
- package/build/tests/wbtc/unwrapRegSegwit.d.ts +0 -1
- package/build/tests/wbtc/unwrapRegSegwit.js +0 -83
- package/build/tests/wbtc/withdrawalRequestReg.d.ts +0 -1
- package/build/tests/wbtc/withdrawalRequestReg.js +0 -71
- package/build/tests/wbtc/wrapReg.d.ts +0 -1
- package/build/tests/wbtc/wrapReg.js +0 -65
- package/build/tests/wbtc/wrapTest.d.ts +0 -1
- package/build/tests/wbtc/wrapTest.js +0 -66
- package/build/tests/withdrawalRequestReg.d.ts +0 -1
- package/build/tests/withdrawalRequestReg.js +0 -71
- package/build/tests/wrap.d.ts +0 -1
- package/build/tests/wrap.js +0 -65
- package/build/tests/wrapReg.d.ts +0 -1
- package/build/tests/wrapReg.js +0 -68
- package/build/tests/wrapTest.d.ts +0 -1
- package/build/tests/wrapTest.js +0 -66
- package/build/tests/wrapTestg.d.ts +0 -1
- package/build/tests/wrapTestg.js +0 -66
- package/build/tests/writers/allowance.d.ts +0 -3
- package/build/tests/writers/allowance.js +0 -10
- package/build/tests/writers/approve.d.ts +0 -4
- package/build/tests/writers/approve.js +0 -11
- package/build/transaction/TransactionBuilder.d.ts +0 -60
- package/build/transaction/TransactionBuilder.js +0 -244
- package/build/transaction/browser/BrowserSigner.d.ts +0 -11
- package/build/transaction/browser/BrowserSigner.js +0 -10
- package/build/transaction/browser/extensions/Unisat.d.ts +0 -54
- package/build/transaction/browser/extensions/Unisat.js +0 -11
- package/build/transaction/builders/GenericTransaction.d.ts +0 -11
- package/build/transaction/builders/GenericTransaction.js +0 -23
- package/build/transaction/builders/TapUnwarpTransaction.d.ts +0 -37
- package/build/transaction/builders/TapUnwarpTransaction.js +0 -201
- package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +0 -34
- package/build/transaction/builders/UnwarpSegwitTransaction.js +0 -184
- package/build/transaction/builders/UnwarpTransaction.d.ts +0 -35
- package/build/transaction/builders/UnwarpTransaction.js +0 -199
- package/build/transaction/interfaces/ITransactions.d.ts +0 -32
- package/build/transaction/interfaces/ITransactions.js +0 -1
- package/build/utxo/IUTXO.d.ts +0 -0
- package/build/utxo/IUTXO.js +0 -1
- package/build/utxo/OPNetUtils.d.ts +0 -7
- package/build/utxo/OPNetUtils.js +0 -47
- package/build/utxo/UTXOManager.d.ts +0 -7
- package/build/utxo/UTXOManager.js +0 -47
- package/build/wbtc/BroadcastResponse.d.ts +0 -0
- package/build/wbtc/BroadcastResponse.js +0 -1
- package/examples/Deploy.md +0 -188
- package/examples/Unwrap.md +0 -165
- package/examples/Wrap.md +0 -194
- package/tsconfig.cjs.json +0 -13
- /package/build/generators/{features.d.ts → Features.d.ts} +0 -0
- /package/build/generators/{features.js → Features.js} +0 -0
|
@@ -1,356 +1,356 @@
|
|
|
1
|
-
import { TransactionType } from '../enums/TransactionType.js';
|
|
2
|
-
import { IDeploymentParameters } from '../interfaces/ITransactionParameters.js';
|
|
3
|
-
import { crypto as bitCrypto, Payment, Psbt, Signer } from 'bitcoinjs-lib';
|
|
4
|
-
import { TransactionBuilder } from './TransactionBuilder.js';
|
|
5
|
-
import { Taptree } from 'bitcoinjs-lib/src/types.js';
|
|
6
|
-
import { TapLeafScript } from '../interfaces/Tap.js';
|
|
7
|
-
import { DeploymentGenerator } from '../../generators/builders/DeploymentGenerator.js';
|
|
8
|
-
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
9
|
-
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
10
|
-
import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
|
|
11
|
-
import { PsbtInput } from 'bip174/src/lib/interfaces.js';
|
|
12
|
-
import { Compressor } from '../../bytecode/Compressor.js';
|
|
13
|
-
import { AddressGenerator } from '../../generators/AddressGenerator.js';
|
|
14
|
-
import { Address } from '@btc-vision/bsi-binary';
|
|
15
|
-
|
|
16
|
-
export class DeploymentTransaction extends TransactionBuilder<TransactionType.DEPLOYMENT> {
|
|
17
|
-
public type: TransactionType.DEPLOYMENT = TransactionType.DEPLOYMENT;
|
|
18
|
-
public static readonly MAXIMUM_CONTRACT_SIZE = 128*1024;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* The contract address
|
|
22
|
-
* @protected
|
|
23
|
-
*/
|
|
24
|
-
protected readonly _contractAddress: Address;
|
|
25
|
-
/**
|
|
26
|
-
* The tap leaf script
|
|
27
|
-
* @private
|
|
28
|
-
*/
|
|
29
|
-
protected tapLeafScript: TapLeafScript | null = null;
|
|
30
|
-
/**
|
|
31
|
-
* The target script redeem
|
|
32
|
-
* @private
|
|
33
|
-
*/
|
|
34
|
-
private targetScriptRedeem: Payment | null = null;
|
|
35
|
-
/**
|
|
36
|
-
* The left over funds script redeem
|
|
37
|
-
* @private
|
|
38
|
-
*/
|
|
39
|
-
private leftOverFundsScriptRedeem: Payment | null = null;
|
|
40
|
-
/**
|
|
41
|
-
* The compiled target script
|
|
42
|
-
* @private
|
|
43
|
-
*/
|
|
44
|
-
private readonly compiledTargetScript: Buffer;
|
|
45
|
-
/**
|
|
46
|
-
* The script tree
|
|
47
|
-
* @private
|
|
48
|
-
*/
|
|
49
|
-
private readonly scriptTree: Taptree;
|
|
50
|
-
/**
|
|
51
|
-
* The deployment bitcoin generator
|
|
52
|
-
* @private
|
|
53
|
-
*/
|
|
54
|
-
private deploymentGenerator: DeploymentGenerator;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The contract seed
|
|
58
|
-
* @private
|
|
59
|
-
*/
|
|
60
|
-
private readonly contractSeed: Buffer;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* The contract bytecode
|
|
64
|
-
* @private
|
|
65
|
-
*/
|
|
66
|
-
private readonly bytecode: Buffer;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* The contract signer
|
|
70
|
-
* @private
|
|
71
|
-
*/
|
|
72
|
-
private readonly contractSigner: Signer;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* The contract salt random bytes
|
|
76
|
-
* @private
|
|
77
|
-
*/
|
|
78
|
-
private readonly randomBytes: Buffer;
|
|
79
|
-
|
|
80
|
-
public constructor(parameters: IDeploymentParameters) {
|
|
81
|
-
super(parameters);
|
|
82
|
-
|
|
83
|
-
this.bytecode = Compressor.compress(parameters.bytecode);
|
|
84
|
-
if (!this.bytecode) throw new Error('Bytecode is required');
|
|
85
|
-
|
|
86
|
-
if (this.bytecode.length > DeploymentTransaction.MAXIMUM_CONTRACT_SIZE) throw new Error('Contract size overflow.');
|
|
87
|
-
|
|
88
|
-
this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
|
|
89
|
-
|
|
90
|
-
this.contractSeed = this.getContractSeed();
|
|
91
|
-
this.contractSigner = EcKeyPair.fromSeedKeyPair(this.contractSeed, this.network);
|
|
92
|
-
|
|
93
|
-
this.deploymentGenerator = new DeploymentGenerator(
|
|
94
|
-
this.internalPubKeyToXOnly(),
|
|
95
|
-
this.contractSignerXOnlyPubKey(),
|
|
96
|
-
this.network,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
this.compiledTargetScript = this.deploymentGenerator.compile(
|
|
100
|
-
this.bytecode,
|
|
101
|
-
this.randomBytes,
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
this.scriptTree = this.getScriptTree();
|
|
105
|
-
|
|
106
|
-
this.internalInit();
|
|
107
|
-
|
|
108
|
-
this._contractAddress = AddressGenerator.generatePKSH(this.contractSeed, this.network);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* @description Get the contract address (PKSH)
|
|
113
|
-
*/
|
|
114
|
-
public get contractAddress(): Address {
|
|
115
|
-
return this._contractAddress;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* @description Get the P2TR address
|
|
120
|
-
*/
|
|
121
|
-
public get p2trAddress(): Address {
|
|
122
|
-
return this.to || this.getScriptAddress();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Get the random bytes used for the interaction
|
|
127
|
-
* @returns {Buffer} The random bytes
|
|
128
|
-
*/
|
|
129
|
-
public getRndBytes(): Buffer {
|
|
130
|
-
return this.randomBytes;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Get the contract signer public key
|
|
135
|
-
* @protected
|
|
136
|
-
*/
|
|
137
|
-
protected contractSignerXOnlyPubKey(): Buffer {
|
|
138
|
-
return toXOnly(this.contractSigner.publicKey);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Build the transaction
|
|
143
|
-
* @protected
|
|
144
|
-
*/
|
|
145
|
-
protected override async buildTransaction(): Promise<void> {
|
|
146
|
-
if (!this.to) {
|
|
147
|
-
this.to = this.getScriptAddress();
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const selectedRedeem = !!this.contractSigner
|
|
151
|
-
? this.targetScriptRedeem
|
|
152
|
-
: this.leftOverFundsScriptRedeem;
|
|
153
|
-
|
|
154
|
-
if (!selectedRedeem) {
|
|
155
|
-
throw new Error('Left over funds script redeem is required');
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (!selectedRedeem.redeemVersion) {
|
|
159
|
-
throw new Error('Left over funds script redeem version is required');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (!selectedRedeem.output) {
|
|
163
|
-
throw new Error('Left over funds script redeem output is required');
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
this.tapLeafScript = {
|
|
167
|
-
leafVersion: selectedRedeem.redeemVersion,
|
|
168
|
-
script: selectedRedeem.output,
|
|
169
|
-
controlBlock: this.getWitness(),
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
this.addInputsFromUTXO();
|
|
173
|
-
|
|
174
|
-
const amountSpent: bigint = this.getTransactionOPNetFee();
|
|
175
|
-
this.addOutput({
|
|
176
|
-
value: Number(amountSpent),
|
|
177
|
-
address: this.to,
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
await this.addRefundOutput(amountSpent);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Sign the inputs
|
|
185
|
-
* @param {Psbt} transaction The transaction to sign
|
|
186
|
-
* @protected
|
|
187
|
-
*/
|
|
188
|
-
protected async signInputs(transaction: Psbt): Promise<void> {
|
|
189
|
-
if (!this.contractSigner) {
|
|
190
|
-
await super.signInputs(transaction);
|
|
191
|
-
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
for (let i = 0; i < transaction.data.inputs.length; i++) {
|
|
196
|
-
if (i === 0) {
|
|
197
|
-
// multi sig input
|
|
198
|
-
transaction.signInput(0, this.contractSigner);
|
|
199
|
-
transaction.signInput(0, this.getSignerKey());
|
|
200
|
-
|
|
201
|
-
transaction.finalizeInput(0, this.customFinalizer);
|
|
202
|
-
} else {
|
|
203
|
-
transaction.signInput(i, this.getSignerKey());
|
|
204
|
-
transaction.finalizeInput(i);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Get the tap output
|
|
211
|
-
* @protected
|
|
212
|
-
*/
|
|
213
|
-
protected override generateScriptAddress(): Payment {
|
|
214
|
-
return {
|
|
215
|
-
internalPubkey: this.internalPubKeyToXOnly(),
|
|
216
|
-
network: this.network,
|
|
217
|
-
scriptTree: this.scriptTree,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Generate the tap data
|
|
223
|
-
* @protected
|
|
224
|
-
*/
|
|
225
|
-
protected override generateTapData(): Payment {
|
|
226
|
-
const selectedRedeem = !!this.contractSigner
|
|
227
|
-
? this.targetScriptRedeem
|
|
228
|
-
: this.leftOverFundsScriptRedeem;
|
|
229
|
-
|
|
230
|
-
if (!selectedRedeem) {
|
|
231
|
-
throw new Error('Left over funds script redeem is required');
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (!this.scriptTree) {
|
|
235
|
-
throw new Error('Script tree is required');
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return {
|
|
239
|
-
internalPubkey: this.internalPubKeyToXOnly(),
|
|
240
|
-
network: this.network,
|
|
241
|
-
scriptTree: this.scriptTree,
|
|
242
|
-
redeem: selectedRedeem,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Generate the contract seed for the deployment
|
|
248
|
-
* @private
|
|
249
|
-
*/
|
|
250
|
-
private getContractSeed(): Buffer {
|
|
251
|
-
if (!this.bytecode) {
|
|
252
|
-
throw new Error('Bytecode is required');
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const deployerPubKey: Buffer = this.internalPubKeyToXOnly();
|
|
256
|
-
const salt: Buffer = bitCrypto.hash256(this.randomBytes);
|
|
257
|
-
const sha256OfBytecode: Buffer = bitCrypto.hash256(this.bytecode);
|
|
258
|
-
|
|
259
|
-
const buf: Buffer = Buffer.concat([deployerPubKey, salt, sha256OfBytecode]);
|
|
260
|
-
|
|
261
|
-
return bitCrypto.hash256(buf);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Finalize the transaction
|
|
266
|
-
* @param _inputIndex
|
|
267
|
-
* @param input
|
|
268
|
-
*/
|
|
269
|
-
private customFinalizer = (_inputIndex: number, input: PsbtInput) => {
|
|
270
|
-
if (!this.tapLeafScript) {
|
|
271
|
-
throw new Error('Tap leaf script is required');
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (!input.tapScriptSig) {
|
|
275
|
-
throw new Error('Tap script signature is required');
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const scriptSolution = [
|
|
279
|
-
this.randomBytes,
|
|
280
|
-
this.internalPubKeyToXOnly(),
|
|
281
|
-
input.tapScriptSig[0].signature,
|
|
282
|
-
input.tapScriptSig[1].signature,
|
|
283
|
-
];
|
|
284
|
-
|
|
285
|
-
const witness = scriptSolution
|
|
286
|
-
.concat(this.tapLeafScript.script)
|
|
287
|
-
.concat(this.tapLeafScript.controlBlock);
|
|
288
|
-
|
|
289
|
-
return {
|
|
290
|
-
finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
|
|
291
|
-
};
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Get the public keys for the redeem scripts
|
|
296
|
-
* @private
|
|
297
|
-
*/
|
|
298
|
-
private getPubKeys(): Buffer[] {
|
|
299
|
-
const pubkeys = [this.signer.publicKey];
|
|
300
|
-
|
|
301
|
-
if (this.contractSigner) {
|
|
302
|
-
pubkeys.push(this.contractSigner.publicKey);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return pubkeys;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Generate the redeem scripts
|
|
310
|
-
* @private
|
|
311
|
-
*/
|
|
312
|
-
private generateRedeemScripts(): void {
|
|
313
|
-
this.targetScriptRedeem = {
|
|
314
|
-
pubkeys: this.getPubKeys(),
|
|
315
|
-
output: this.compiledTargetScript,
|
|
316
|
-
redeemVersion: 192,
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
this.leftOverFundsScriptRedeem = {
|
|
320
|
-
pubkeys: this.getPubKeys(),
|
|
321
|
-
output: this.getLeafScript(),
|
|
322
|
-
redeemVersion: 192,
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Get the second leaf script
|
|
328
|
-
* @private
|
|
329
|
-
*/
|
|
330
|
-
private getLeafScript(): Buffer {
|
|
331
|
-
return TransactionBuilder.LOCK_LEAF_SCRIPT;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Get the script tree
|
|
336
|
-
* @private
|
|
337
|
-
*/
|
|
338
|
-
private getScriptTree(): Taptree {
|
|
339
|
-
if (!this.bytecode) {
|
|
340
|
-
throw new Error('Contract bytecode is required');
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
this.generateRedeemScripts();
|
|
344
|
-
|
|
345
|
-
return [
|
|
346
|
-
{
|
|
347
|
-
output: this.compiledTargetScript,
|
|
348
|
-
version: 192,
|
|
349
|
-
},
|
|
350
|
-
{
|
|
351
|
-
output: this.getLeafScript(),
|
|
352
|
-
version: 192,
|
|
353
|
-
},
|
|
354
|
-
];
|
|
355
|
-
}
|
|
356
|
-
}
|
|
1
|
+
import { TransactionType } from '../enums/TransactionType.js';
|
|
2
|
+
import { IDeploymentParameters } from '../interfaces/ITransactionParameters.js';
|
|
3
|
+
import { crypto as bitCrypto, Payment, Psbt, Signer } from 'bitcoinjs-lib';
|
|
4
|
+
import { TransactionBuilder } from './TransactionBuilder.js';
|
|
5
|
+
import { Taptree } from 'bitcoinjs-lib/src/types.js';
|
|
6
|
+
import { TapLeafScript } from '../interfaces/Tap.js';
|
|
7
|
+
import { DeploymentGenerator } from '../../generators/builders/DeploymentGenerator.js';
|
|
8
|
+
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
9
|
+
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
10
|
+
import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
|
|
11
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces.js';
|
|
12
|
+
import { Compressor } from '../../bytecode/Compressor.js';
|
|
13
|
+
import { AddressGenerator } from '../../generators/AddressGenerator.js';
|
|
14
|
+
import { Address } from '@btc-vision/bsi-binary';
|
|
15
|
+
|
|
16
|
+
export class DeploymentTransaction extends TransactionBuilder<TransactionType.DEPLOYMENT> {
|
|
17
|
+
public type: TransactionType.DEPLOYMENT = TransactionType.DEPLOYMENT;
|
|
18
|
+
public static readonly MAXIMUM_CONTRACT_SIZE = 128*1024;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The contract address
|
|
22
|
+
* @protected
|
|
23
|
+
*/
|
|
24
|
+
protected readonly _contractAddress: Address;
|
|
25
|
+
/**
|
|
26
|
+
* The tap leaf script
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
protected tapLeafScript: TapLeafScript | null = null;
|
|
30
|
+
/**
|
|
31
|
+
* The target script redeem
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
private targetScriptRedeem: Payment | null = null;
|
|
35
|
+
/**
|
|
36
|
+
* The left over funds script redeem
|
|
37
|
+
* @private
|
|
38
|
+
*/
|
|
39
|
+
private leftOverFundsScriptRedeem: Payment | null = null;
|
|
40
|
+
/**
|
|
41
|
+
* The compiled target script
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
private readonly compiledTargetScript: Buffer;
|
|
45
|
+
/**
|
|
46
|
+
* The script tree
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
49
|
+
private readonly scriptTree: Taptree;
|
|
50
|
+
/**
|
|
51
|
+
* The deployment bitcoin generator
|
|
52
|
+
* @private
|
|
53
|
+
*/
|
|
54
|
+
private deploymentGenerator: DeploymentGenerator;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The contract seed
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
private readonly contractSeed: Buffer;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The contract bytecode
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
66
|
+
private readonly bytecode: Buffer;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The contract signer
|
|
70
|
+
* @private
|
|
71
|
+
*/
|
|
72
|
+
private readonly contractSigner: Signer;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The contract salt random bytes
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
private readonly randomBytes: Buffer;
|
|
79
|
+
|
|
80
|
+
public constructor(parameters: IDeploymentParameters) {
|
|
81
|
+
super(parameters);
|
|
82
|
+
|
|
83
|
+
this.bytecode = Compressor.compress(parameters.bytecode);
|
|
84
|
+
if (!this.bytecode) throw new Error('Bytecode is required');
|
|
85
|
+
|
|
86
|
+
if (this.bytecode.length > DeploymentTransaction.MAXIMUM_CONTRACT_SIZE) throw new Error('Contract size overflow.');
|
|
87
|
+
|
|
88
|
+
this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
|
|
89
|
+
|
|
90
|
+
this.contractSeed = this.getContractSeed();
|
|
91
|
+
this.contractSigner = EcKeyPair.fromSeedKeyPair(this.contractSeed, this.network);
|
|
92
|
+
|
|
93
|
+
this.deploymentGenerator = new DeploymentGenerator(
|
|
94
|
+
this.internalPubKeyToXOnly(),
|
|
95
|
+
this.contractSignerXOnlyPubKey(),
|
|
96
|
+
this.network,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
this.compiledTargetScript = this.deploymentGenerator.compile(
|
|
100
|
+
this.bytecode,
|
|
101
|
+
this.randomBytes,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
this.scriptTree = this.getScriptTree();
|
|
105
|
+
|
|
106
|
+
this.internalInit();
|
|
107
|
+
|
|
108
|
+
this._contractAddress = AddressGenerator.generatePKSH(this.contractSeed, this.network);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @description Get the contract address (PKSH)
|
|
113
|
+
*/
|
|
114
|
+
public get contractAddress(): Address {
|
|
115
|
+
return this._contractAddress;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @description Get the P2TR address
|
|
120
|
+
*/
|
|
121
|
+
public get p2trAddress(): Address {
|
|
122
|
+
return this.to || this.getScriptAddress();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get the random bytes used for the interaction
|
|
127
|
+
* @returns {Buffer} The random bytes
|
|
128
|
+
*/
|
|
129
|
+
public getRndBytes(): Buffer {
|
|
130
|
+
return this.randomBytes;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Get the contract signer public key
|
|
135
|
+
* @protected
|
|
136
|
+
*/
|
|
137
|
+
protected contractSignerXOnlyPubKey(): Buffer {
|
|
138
|
+
return toXOnly(this.contractSigner.publicKey);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Build the transaction
|
|
143
|
+
* @protected
|
|
144
|
+
*/
|
|
145
|
+
protected override async buildTransaction(): Promise<void> {
|
|
146
|
+
if (!this.to) {
|
|
147
|
+
this.to = this.getScriptAddress();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const selectedRedeem = !!this.contractSigner
|
|
151
|
+
? this.targetScriptRedeem
|
|
152
|
+
: this.leftOverFundsScriptRedeem;
|
|
153
|
+
|
|
154
|
+
if (!selectedRedeem) {
|
|
155
|
+
throw new Error('Left over funds script redeem is required');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (!selectedRedeem.redeemVersion) {
|
|
159
|
+
throw new Error('Left over funds script redeem version is required');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (!selectedRedeem.output) {
|
|
163
|
+
throw new Error('Left over funds script redeem output is required');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
this.tapLeafScript = {
|
|
167
|
+
leafVersion: selectedRedeem.redeemVersion,
|
|
168
|
+
script: selectedRedeem.output,
|
|
169
|
+
controlBlock: this.getWitness(),
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
this.addInputsFromUTXO();
|
|
173
|
+
|
|
174
|
+
const amountSpent: bigint = this.getTransactionOPNetFee();
|
|
175
|
+
this.addOutput({
|
|
176
|
+
value: Number(amountSpent),
|
|
177
|
+
address: this.to,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
await this.addRefundOutput(amountSpent);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Sign the inputs
|
|
185
|
+
* @param {Psbt} transaction The transaction to sign
|
|
186
|
+
* @protected
|
|
187
|
+
*/
|
|
188
|
+
protected async signInputs(transaction: Psbt): Promise<void> {
|
|
189
|
+
if (!this.contractSigner) {
|
|
190
|
+
await super.signInputs(transaction);
|
|
191
|
+
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
for (let i = 0; i < transaction.data.inputs.length; i++) {
|
|
196
|
+
if (i === 0) {
|
|
197
|
+
// multi sig input
|
|
198
|
+
transaction.signInput(0, this.contractSigner);
|
|
199
|
+
transaction.signInput(0, this.getSignerKey());
|
|
200
|
+
|
|
201
|
+
transaction.finalizeInput(0, this.customFinalizer);
|
|
202
|
+
} else {
|
|
203
|
+
transaction.signInput(i, this.getSignerKey());
|
|
204
|
+
transaction.finalizeInput(i);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Get the tap output
|
|
211
|
+
* @protected
|
|
212
|
+
*/
|
|
213
|
+
protected override generateScriptAddress(): Payment {
|
|
214
|
+
return {
|
|
215
|
+
internalPubkey: this.internalPubKeyToXOnly(),
|
|
216
|
+
network: this.network,
|
|
217
|
+
scriptTree: this.scriptTree,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Generate the tap data
|
|
223
|
+
* @protected
|
|
224
|
+
*/
|
|
225
|
+
protected override generateTapData(): Payment {
|
|
226
|
+
const selectedRedeem = !!this.contractSigner
|
|
227
|
+
? this.targetScriptRedeem
|
|
228
|
+
: this.leftOverFundsScriptRedeem;
|
|
229
|
+
|
|
230
|
+
if (!selectedRedeem) {
|
|
231
|
+
throw new Error('Left over funds script redeem is required');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!this.scriptTree) {
|
|
235
|
+
throw new Error('Script tree is required');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
internalPubkey: this.internalPubKeyToXOnly(),
|
|
240
|
+
network: this.network,
|
|
241
|
+
scriptTree: this.scriptTree,
|
|
242
|
+
redeem: selectedRedeem,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Generate the contract seed for the deployment
|
|
248
|
+
* @private
|
|
249
|
+
*/
|
|
250
|
+
private getContractSeed(): Buffer {
|
|
251
|
+
if (!this.bytecode) {
|
|
252
|
+
throw new Error('Bytecode is required');
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const deployerPubKey: Buffer = this.internalPubKeyToXOnly();
|
|
256
|
+
const salt: Buffer = bitCrypto.hash256(this.randomBytes);
|
|
257
|
+
const sha256OfBytecode: Buffer = bitCrypto.hash256(this.bytecode);
|
|
258
|
+
|
|
259
|
+
const buf: Buffer = Buffer.concat([deployerPubKey, salt, sha256OfBytecode]);
|
|
260
|
+
|
|
261
|
+
return bitCrypto.hash256(buf);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Finalize the transaction
|
|
266
|
+
* @param _inputIndex
|
|
267
|
+
* @param input
|
|
268
|
+
*/
|
|
269
|
+
private customFinalizer = (_inputIndex: number, input: PsbtInput) => {
|
|
270
|
+
if (!this.tapLeafScript) {
|
|
271
|
+
throw new Error('Tap leaf script is required');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (!input.tapScriptSig) {
|
|
275
|
+
throw new Error('Tap script signature is required');
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const scriptSolution = [
|
|
279
|
+
this.randomBytes,
|
|
280
|
+
this.internalPubKeyToXOnly(),
|
|
281
|
+
input.tapScriptSig[0].signature,
|
|
282
|
+
input.tapScriptSig[1].signature,
|
|
283
|
+
];
|
|
284
|
+
|
|
285
|
+
const witness = scriptSolution
|
|
286
|
+
.concat(this.tapLeafScript.script)
|
|
287
|
+
.concat(this.tapLeafScript.controlBlock);
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Get the public keys for the redeem scripts
|
|
296
|
+
* @private
|
|
297
|
+
*/
|
|
298
|
+
private getPubKeys(): Buffer[] {
|
|
299
|
+
const pubkeys = [this.signer.publicKey];
|
|
300
|
+
|
|
301
|
+
if (this.contractSigner) {
|
|
302
|
+
pubkeys.push(this.contractSigner.publicKey);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return pubkeys;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Generate the redeem scripts
|
|
310
|
+
* @private
|
|
311
|
+
*/
|
|
312
|
+
private generateRedeemScripts(): void {
|
|
313
|
+
this.targetScriptRedeem = {
|
|
314
|
+
pubkeys: this.getPubKeys(),
|
|
315
|
+
output: this.compiledTargetScript,
|
|
316
|
+
redeemVersion: 192,
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
this.leftOverFundsScriptRedeem = {
|
|
320
|
+
pubkeys: this.getPubKeys(),
|
|
321
|
+
output: this.getLeafScript(),
|
|
322
|
+
redeemVersion: 192,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Get the second leaf script
|
|
328
|
+
* @private
|
|
329
|
+
*/
|
|
330
|
+
private getLeafScript(): Buffer {
|
|
331
|
+
return TransactionBuilder.LOCK_LEAF_SCRIPT;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Get the script tree
|
|
336
|
+
* @private
|
|
337
|
+
*/
|
|
338
|
+
private getScriptTree(): Taptree {
|
|
339
|
+
if (!this.bytecode) {
|
|
340
|
+
throw new Error('Contract bytecode is required');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
this.generateRedeemScripts();
|
|
344
|
+
|
|
345
|
+
return [
|
|
346
|
+
{
|
|
347
|
+
output: this.compiledTargetScript,
|
|
348
|
+
version: 192,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
output: this.getLeafScript(),
|
|
352
|
+
version: 192,
|
|
353
|
+
},
|
|
354
|
+
];
|
|
355
|
+
}
|
|
356
|
+
}
|