@btc-vision/transaction 1.0.85 → 1.0.87
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/.gitattributes +2 -2
- package/browser/_version.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/keypair/Wallet.d.ts +3 -0
- package/browser/transaction/builders/TapUnwarpTransaction.d.ts +40 -40
- package/browser/transaction/builders/UnwarpTransaction.d.ts +34 -34
- package/browser/utxo/UTXOManager.d.ts +7 -7
- package/build/Utils.d.ts +0 -0
- package/build/Utils.js +1 -0
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/consensus/metadata/RoswsellConsensus.d.ts +2 -0
- package/build/consensus/metadata/RoswsellConsensus.js +4 -0
- package/build/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/contracts/ContractMetadataManager.js +1 -0
- package/build/generators/OPNetAddressGenerator.d.ts +0 -0
- package/build/generators/OPNetAddressGenerator.js +1 -0
- package/build/generators/builders/UnwrapGenerator.d.ts +8 -0
- package/build/generators/builders/UnwrapGenerator.js +79 -0
- package/build/keypair/Wallet.d.ts +3 -0
- package/build/keypair/Wallet.js +8 -0
- package/build/keypair/interfaces/GeneratedWallet.d.ts +5 -0
- package/build/keypair/interfaces/GeneratedWallet.js +1 -0
- package/build/metadata/CommonContracts.d.ts +6 -0
- package/build/metadata/CommonContracts.js +5 -0
- package/build/metadata/ContractMetadataManager.d.ts +1 -0
- package/build/metadata/ContractMetadataManager.js +9 -0
- package/build/metadata/contracts/ContractBase.d.ts +9 -0
- package/build/metadata/contracts/ContractBase.js +13 -0
- package/build/metadata/contracts/ContractBaseMetadata.d.ts +9 -0
- package/build/metadata/contracts/ContractBaseMetadata.js +13 -0
- package/build/metadata/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/metadata/contracts/ContractMetadataManager.js +1 -0
- package/build/metadata/tokens.js +1 -1
- package/build/network/NetworkConverter.d.ts +0 -0
- package/build/network/NetworkConverter.js +14 -0
- package/build/scripts/Regtest.d.ts +2 -0
- package/build/scripts/Regtest.js +15 -0
- package/build/scripts/test.d.ts +1 -0
- package/build/scripts/test.js +74 -0
- package/build/signer/Regtest.d.ts +2 -0
- package/build/signer/Regtest.js +15 -0
- package/build/tests/Regtest.d.ts +3 -0
- package/build/tests/Regtest.js +29 -0
- package/build/tests/adaptPSBT.d.ts +1 -0
- package/build/tests/adaptPSBT.js +44 -0
- package/build/tests/btc/send.d.ts +1 -0
- package/build/tests/btc/send.js +35 -0
- package/build/tests/btc/transfer.d.ts +1 -0
- package/build/tests/btc/transfer.js +35 -0
- package/build/tests/createPairReg.d.ts +1 -0
- package/build/tests/createPairReg.js +73 -0
- package/build/tests/deploy/deployMoto.d.ts +4 -0
- package/build/tests/deploy/deployMoto.js +89 -0
- package/build/tests/deploy/deployPool.d.ts +1 -0
- package/build/tests/deploy/deployPool.js +5 -0
- package/build/tests/deploy/deployStep1.d.ts +1 -0
- package/build/tests/deploy/deployStep1.js +5 -0
- package/build/tests/deploy/deployStep2.d.ts +1 -0
- package/build/tests/deploy/deployStep2.js +5 -0
- package/build/tests/deploy/deployStep3.d.ts +1 -0
- package/build/tests/deploy/deployStep3.js +5 -0
- package/build/tests/deploy.d.ts +1 -0
- package/build/tests/deploy.js +41 -0
- package/build/tests/deployMotoRegStep1.d.ts +1 -0
- package/build/tests/deployMotoRegStep1.js +85 -0
- package/build/tests/deployReg.d.ts +1 -0
- package/build/tests/deployReg.js +85 -0
- package/build/tests/factory/createPairReg.d.ts +1 -0
- package/build/tests/factory/createPairReg.js +13 -0
- package/build/tests/gen.d.ts +1 -0
- package/build/tests/gen.js +19 -0
- package/build/tests/interaction.d.ts +5 -0
- package/build/tests/interaction.js +62 -0
- package/build/tests/massWrapReg.d.ts +1 -0
- package/build/tests/massWrapReg.js +105 -0
- package/build/tests/mineReg.d.ts +1 -0
- package/build/tests/mineReg.js +19 -0
- package/build/tests/moto/airdropToken.d.ts +1 -0
- package/build/tests/moto/airdropToken.js +21 -0
- package/build/tests/moto/airdropTokens.d.ts +1 -0
- package/build/tests/moto/airdropTokens.js +60 -0
- package/build/tests/moto/allowance.d.ts +1 -0
- package/build/tests/moto/allowance.js +6 -0
- package/build/tests/moto/approve.d.ts +1 -0
- package/build/tests/moto/approve.js +10 -0
- package/build/tests/moto/approveWBTC.d.ts +1 -0
- package/build/tests/moto/approveWBTC.js +12 -0
- package/build/tests/moto/balanceOf.d.ts +1 -0
- package/build/tests/moto/balanceOf.js +12 -0
- package/build/tests/moto/transfer.d.ts +1 -0
- package/build/tests/moto/transfer.js +16 -0
- package/build/tests/motoswap/airdropToken.d.ts +11 -0
- package/build/tests/motoswap/airdropToken.js +36 -0
- package/build/tests/motoswap/deployMoto.d.ts +4 -0
- package/build/tests/motoswap/deployMoto.js +89 -0
- package/build/tests/motoswap/deployMotoRegStep1.d.ts +1 -0
- package/build/tests/motoswap/deployMotoRegStep1.js +91 -0
- package/build/tests/motoswap/deployMotoRegStep2.d.ts +1 -0
- package/build/tests/motoswap/deployMotoRegStep2.js +91 -0
- package/build/tests/motoswap/deployPool.d.ts +1 -0
- package/build/tests/motoswap/deployPool.js +5 -0
- package/build/tests/motoswap/deployStep1.d.ts +1 -0
- package/build/tests/motoswap/deployStep1.js +5 -0
- package/build/tests/motoswap/deployStep2.d.ts +1 -0
- package/build/tests/motoswap/deployStep2.js +5 -0
- package/build/tests/motoswap/deployStep3.d.ts +1 -0
- package/build/tests/motoswap/deployStep3.js +5 -0
- package/build/tests/motoswap/interaction.d.ts +3 -0
- package/build/tests/motoswap/interaction.js +63 -0
- package/build/tests/motoswap/routerAddLiquidity.d.ts +11 -0
- package/build/tests/motoswap/routerAddLiquidity.js +35 -0
- package/build/tests/motoswap-router/addLiquidity.d.ts +11 -0
- package/build/tests/motoswap-router/addLiquidity.js +36 -0
- package/build/tests/motoswap-router/deployMoto.d.ts +4 -0
- package/build/tests/motoswap-router/deployMoto.js +89 -0
- package/build/tests/motoswap-router/deployPool.d.ts +1 -0
- package/build/tests/motoswap-router/deployPool.js +5 -0
- package/build/tests/motoswap-router/deployStep1.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep1.js +5 -0
- package/build/tests/motoswap-router/deployStep2.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep2.js +5 -0
- package/build/tests/motoswap-router/deployStep3.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep3.js +5 -0
- package/build/tests/motoswap-router/getAmountsOut.d.ts +5 -0
- package/build/tests/motoswap-router/getAmountsOut.js +34 -0
- package/build/tests/motoswap-router/routerAddLiquidity.d.ts +11 -0
- package/build/tests/motoswap-router/routerAddLiquidity.js +35 -0
- package/build/tests/motoswap-router/swap.d.ts +8 -0
- package/build/tests/motoswap-router/swap.js +24 -0
- package/build/tests/multisign.d.ts +1 -0
- package/build/tests/multisign.js +47 -0
- package/build/tests/multisign2.d.ts +1 -0
- package/build/tests/multisign2.js +27 -0
- package/build/tests/pool/DecodePoolAddress.d.ts +6 -0
- package/build/tests/pool/DecodePoolAddress.js +12 -0
- package/build/tests/pool/decodeReserves.d.ts +5 -0
- package/build/tests/pool/decodeReserves.js +13 -0
- package/build/tests/pool/reserves.d.ts +1 -0
- package/build/tests/pool/reserves.js +18 -0
- package/build/tests/shared/Utils.d.ts +2 -0
- package/build/tests/shared/Utils.js +14 -0
- package/build/tests/shared/interaction.d.ts +7 -0
- package/build/tests/shared/interaction.js +85 -0
- package/build/tests/shared/tokens.d.ts +6 -0
- package/build/tests/shared/tokens.js +5 -0
- package/build/tests/stakeReg.d.ts +1 -0
- package/build/tests/stakeReg.js +73 -0
- package/build/tests/stakedReg.d.ts +1 -0
- package/build/tests/stakedReg.js +28 -0
- package/build/tests/test.d.ts +1 -0
- package/build/tests/test.js +51 -0
- package/build/tests/test2.d.ts +1 -0
- package/build/tests/test2.js +73 -0
- package/build/tests/testReg.d.ts +1 -0
- package/build/tests/testReg.js +91 -0
- package/build/tests/tokens.d.ts +6 -0
- package/build/tests/tokens.js +5 -0
- package/build/tests/totalRewardReg.d.ts +1 -0
- package/build/tests/totalRewardReg.js +28 -0
- package/build/tests/transfer.d.ts +1 -0
- package/build/tests/transfer.js +74 -0
- package/build/tests/transferReg.d.ts +1 -0
- package/build/tests/transferReg.js +74 -0
- package/build/tests/unStakeReg.d.ts +1 -0
- package/build/tests/unStakeReg.js +72 -0
- package/build/tests/unwrapReg.d.ts +1 -0
- package/build/tests/unwrapReg.js +61 -0
- package/build/tests/unwrapReg2.d.ts +1 -0
- package/build/tests/unwrapReg2.js +56 -0
- package/build/tests/unwrapRegSegwit.d.ts +1 -0
- package/build/tests/unwrapRegSegwit.js +83 -0
- package/build/tests/wbtc/approve.d.ts +1 -0
- package/build/tests/wbtc/approve.js +6 -0
- package/build/tests/wbtc/approveWBTC.d.ts +1 -0
- package/build/tests/wbtc/approveWBTC.js +12 -0
- package/build/tests/wbtc/massWrapReg.d.ts +1 -0
- package/build/tests/wbtc/massWrapReg.js +105 -0
- package/build/tests/wbtc/transfer.d.ts +1 -0
- package/build/tests/wbtc/transfer.js +16 -0
- package/build/tests/wbtc/transferReg.d.ts +1 -0
- package/build/tests/wbtc/transferReg.js +16 -0
- package/build/tests/wbtc/unStakeReg.d.ts +1 -0
- package/build/tests/wbtc/unStakeReg.js +72 -0
- package/build/tests/wbtc/unwrapReg.d.ts +1 -0
- package/build/tests/wbtc/unwrapReg.js +60 -0
- package/build/tests/wbtc/unwrapRegSegwit.d.ts +1 -0
- package/build/tests/wbtc/unwrapRegSegwit.js +83 -0
- package/build/tests/wbtc/withdrawalRequestReg.d.ts +1 -0
- package/build/tests/wbtc/withdrawalRequestReg.js +71 -0
- package/build/tests/wbtc/wrapReg.d.ts +1 -0
- package/build/tests/wbtc/wrapReg.js +65 -0
- package/build/tests/wbtc/wrapTest.d.ts +1 -0
- package/build/tests/wbtc/wrapTest.js +66 -0
- package/build/tests/withdrawalRequestReg.d.ts +1 -0
- package/build/tests/withdrawalRequestReg.js +71 -0
- package/build/tests/wrap.d.ts +1 -0
- package/build/tests/wrap.js +65 -0
- package/build/tests/wrapReg.d.ts +1 -0
- package/build/tests/wrapReg.js +68 -0
- package/build/tests/wrapTest.d.ts +1 -0
- package/build/tests/wrapTest.js +66 -0
- package/build/tests/wrapTestg.d.ts +1 -0
- package/build/tests/wrapTestg.js +66 -0
- package/build/tests/writers/allowance.d.ts +3 -0
- package/build/tests/writers/allowance.js +10 -0
- package/build/tests/writers/approve.d.ts +4 -0
- package/build/tests/writers/approve.js +11 -0
- package/build/transaction/TransactionBuilder.d.ts +60 -0
- package/build/transaction/TransactionBuilder.js +244 -0
- package/build/transaction/TransactionFactory.js +2 -0
- package/build/transaction/browser/BrowserSigner.d.ts +11 -0
- package/build/transaction/browser/BrowserSigner.js +10 -0
- package/build/transaction/browser/extensions/Unisat.d.ts +54 -0
- package/build/transaction/browser/extensions/Unisat.js +11 -0
- package/build/transaction/builders/GenericTransaction.d.ts +11 -0
- package/build/transaction/builders/GenericTransaction.js +23 -0
- package/build/transaction/builders/TapUnwarpTransaction.d.ts +37 -0
- package/build/transaction/builders/TapUnwarpTransaction.js +201 -0
- package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +34 -0
- package/build/transaction/builders/UnwarpSegwitTransaction.js +184 -0
- package/build/transaction/builders/UnwarpTransaction.d.ts +35 -0
- package/build/transaction/builders/UnwarpTransaction.js +199 -0
- package/build/transaction/interfaces/ITransactions.d.ts +32 -0
- package/build/transaction/interfaces/ITransactions.js +1 -0
- package/build/utxo/IUTXO.d.ts +0 -0
- package/build/utxo/IUTXO.js +1 -0
- package/build/utxo/OPNetUtils.d.ts +7 -0
- package/build/utxo/OPNetUtils.js +47 -0
- package/build/utxo/UTXOManager.d.ts +7 -0
- package/build/utxo/UTXOManager.js +47 -0
- package/build/wbtc/BroadcastResponse.d.ts +0 -0
- package/build/wbtc/BroadcastResponse.js +1 -0
- package/gulpfile.js +152 -152
- package/package.json +109 -109
- package/src/_version.ts +1 -1
- package/src/consensus/Consensus.ts +36 -36
- package/src/consensus/ConsensusConfig.ts +39 -39
- package/src/crypto/crypto-browser.js +75 -75
- package/src/generators/AddressGenerator.ts +24 -24
- package/src/generators/Features.ts +5 -5
- package/src/generators/Generator.ts +75 -75
- package/src/generators/builders/CalldataGenerator.ts +148 -148
- package/src/generators/builders/DeploymentGenerator.ts +66 -66
- package/src/index.ts +4 -4
- package/src/keypair/AddressVerificator.ts +40 -40
- package/src/keypair/EcKeyPair.ts +282 -282
- package/src/keypair/Wallet.ts +120 -97
- package/src/keypair/interfaces/IWallet.ts +19 -19
- package/src/metadata/ContractBaseMetadata.ts +23 -23
- package/src/metadata/contracts/wBTC.ts +60 -60
- package/src/metadata/tokens.ts +1 -1
- package/src/network/NetworkInformation.ts +7 -7
- package/src/transaction/TransactionFactory.ts +2 -0
- package/src/transaction/browser/BrowserSignerBase.ts +37 -37
- package/src/transaction/browser/Web3Provider.ts +46 -46
- package/src/transaction/browser/extensions/UnisatSigner.ts +218 -218
- package/src/transaction/browser/types/Unisat.ts +97 -97
- package/src/transaction/builders/FundingTransaction.ts +40 -40
- package/src/transaction/builders/InteractionTransaction.ts +38 -38
- package/src/transaction/builders/SharedInteractionTransaction.ts +368 -368
- package/src/transaction/builders/TransactionBuilder.ts +665 -665
- package/src/transaction/builders/UnwrapSegwitTransaction.ts +365 -365
- package/src/transaction/builders/UnwrapTransaction.ts +507 -507
- package/src/transaction/builders/WrapTransaction.ts +346 -346
- package/src/transaction/interfaces/ITransactionParameters.ts +59 -59
- package/src/transaction/interfaces/Tap.ts +26 -26
- package/src/transaction/psbt/PSBTTypes.ts +3 -3
- package/src/transaction/shared/TweakedTransaction.ts +539 -539
- package/src/utxo/OPNetLimitedProvider.ts +244 -244
- package/src/utxo/interfaces/BroadcastResponse.ts +10 -10
- package/src/utxo/interfaces/IUTXO.ts +29 -29
- package/src/verification/TapscriptVerificator.ts +89 -89
- package/src/wbtc/Generate.ts +40 -40
- package/src/wbtc/UnwrapGeneration.ts +13 -13
- package/src/wbtc/WrappedGenerationParameters.ts +33 -33
- package/webpack.config.js +78 -78
- /package/build/generators/builders/{MultiSignGenerator.d.ts → MultisignGenerator.d.ts} +0 -0
- /package/build/generators/builders/{MultiSignGenerator.js → MultisignGenerator.js} +0 -0
- /package/build/generators/{Features.d.ts → features.d.ts} +0 -0
- /package/build/generators/{Features.js → features.js} +0 -0
|
@@ -1,368 +1,368 @@
|
|
|
1
|
-
import { PsbtInput } from 'bip174/src/lib/interfaces.js';
|
|
2
|
-
import { address, Payment, Psbt, Signer } from 'bitcoinjs-lib';
|
|
3
|
-
import { Taptree } from 'bitcoinjs-lib/src/types.js';
|
|
4
|
-
import { ECPairInterface } from 'ecpair';
|
|
5
|
-
import { TransactionBuilder } from './TransactionBuilder.js';
|
|
6
|
-
import { TransactionType } from '../enums/TransactionType.js';
|
|
7
|
-
import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
|
|
8
|
-
import { SharedInteractionParameters } from '../interfaces/ITransactionParameters.js';
|
|
9
|
-
import { Compressor } from '../../bytecode/Compressor.js';
|
|
10
|
-
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
11
|
-
import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
|
|
12
|
-
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Shared interaction transaction
|
|
16
|
-
* @class SharedInteractionTransaction
|
|
17
|
-
*/
|
|
18
|
-
export abstract class SharedInteractionTransaction<
|
|
19
|
-
T extends TransactionType,
|
|
20
|
-
> extends TransactionBuilder<T> {
|
|
21
|
-
/**
|
|
22
|
-
* Random salt for the interaction
|
|
23
|
-
* @type {Buffer}
|
|
24
|
-
*/
|
|
25
|
-
public readonly randomBytes: Buffer;
|
|
26
|
-
|
|
27
|
-
protected targetScriptRedeem: Payment | null = null;
|
|
28
|
-
protected leftOverFundsScriptRedeem: Payment | null = null;
|
|
29
|
-
|
|
30
|
-
protected abstract readonly compiledTargetScript: Buffer;
|
|
31
|
-
protected abstract readonly scriptTree: Taptree;
|
|
32
|
-
|
|
33
|
-
protected calldataGenerator: CalldataGenerator;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Calldata for the interaction
|
|
37
|
-
* @protected
|
|
38
|
-
*/
|
|
39
|
-
protected readonly calldata: Buffer;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Contract secret for the interaction
|
|
43
|
-
* @protected
|
|
44
|
-
*/
|
|
45
|
-
protected abstract readonly contractSecret: Buffer;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Script signer for the interaction
|
|
49
|
-
* @protected
|
|
50
|
-
*/
|
|
51
|
-
protected readonly scriptSigner: Signer;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Disable auto refund
|
|
55
|
-
* @protected
|
|
56
|
-
*/
|
|
57
|
-
protected readonly disableAutoRefund: boolean;
|
|
58
|
-
|
|
59
|
-
protected constructor(parameters: SharedInteractionParameters) {
|
|
60
|
-
super(parameters);
|
|
61
|
-
|
|
62
|
-
if (!parameters.calldata) {
|
|
63
|
-
throw new Error('Calldata is required');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
this.disableAutoRefund = parameters.disableAutoRefund || false;
|
|
67
|
-
|
|
68
|
-
this.calldata = Compressor.compress(parameters.calldata);
|
|
69
|
-
|
|
70
|
-
this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
|
|
71
|
-
this.scriptSigner = this.generateKeyPairFromSeed();
|
|
72
|
-
|
|
73
|
-
this.calldataGenerator = new CalldataGenerator(
|
|
74
|
-
this.internalPubKeyToXOnly(),
|
|
75
|
-
this.scriptSignerXOnlyPubKey(),
|
|
76
|
-
this.network,
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Get the contract secret
|
|
82
|
-
* @returns {Buffer} The contract secret
|
|
83
|
-
*/
|
|
84
|
-
public getContractSecret(): Buffer {
|
|
85
|
-
return this.contractSecret;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Get the random bytes used for the interaction
|
|
90
|
-
* @returns {Buffer} The random bytes
|
|
91
|
-
*/
|
|
92
|
-
public getRndBytes(): Buffer {
|
|
93
|
-
return this.randomBytes;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Generate the secret for the interaction
|
|
98
|
-
* @protected
|
|
99
|
-
* @returns {Buffer} The secret
|
|
100
|
-
* @throws {Error} If the to address is invalid
|
|
101
|
-
*/
|
|
102
|
-
protected generateSecret(): Buffer {
|
|
103
|
-
if (!this.to) throw new Error('To address is required');
|
|
104
|
-
|
|
105
|
-
return address.fromBech32(this.to).data;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Get the internal pubkey as an x-only key
|
|
110
|
-
* @protected
|
|
111
|
-
* @returns {Buffer} The internal pubkey as an x-only key
|
|
112
|
-
*/
|
|
113
|
-
protected scriptSignerXOnlyPubKey(): Buffer {
|
|
114
|
-
return toXOnly(this.scriptSigner.publicKey);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Generate a key pair from the seed
|
|
119
|
-
* @protected
|
|
120
|
-
*
|
|
121
|
-
* @returns {ECPairInterface} The key pair
|
|
122
|
-
*/
|
|
123
|
-
protected generateKeyPairFromSeed(): ECPairInterface {
|
|
124
|
-
return EcKeyPair.fromSeedKeyPair(this.randomBytes, this.network);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Build the transaction
|
|
129
|
-
* @protected
|
|
130
|
-
*
|
|
131
|
-
* @throws {Error} If the left over funds script redeem is required
|
|
132
|
-
* @throws {Error} If the left over funds script redeem version is required
|
|
133
|
-
* @throws {Error} If the left over funds script redeem output is required
|
|
134
|
-
* @throws {Error} If the to address is required
|
|
135
|
-
*/
|
|
136
|
-
protected override async buildTransaction(): Promise<void> {
|
|
137
|
-
if (!this.to) throw new Error('To address is required');
|
|
138
|
-
|
|
139
|
-
const selectedRedeem = !!this.scriptSigner
|
|
140
|
-
? this.targetScriptRedeem
|
|
141
|
-
: this.leftOverFundsScriptRedeem;
|
|
142
|
-
|
|
143
|
-
if (!selectedRedeem) {
|
|
144
|
-
throw new Error('Left over funds script redeem is required');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (!selectedRedeem.redeemVersion) {
|
|
148
|
-
throw new Error('Left over funds script redeem version is required');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (!selectedRedeem.output) {
|
|
152
|
-
throw new Error('Left over funds script redeem output is required');
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
this.tapLeafScript = {
|
|
156
|
-
leafVersion: selectedRedeem.redeemVersion,
|
|
157
|
-
script: selectedRedeem.output,
|
|
158
|
-
controlBlock: this.getWitness(),
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
if (!this.regenerated) {
|
|
162
|
-
this.addInputsFromUTXO();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const amountSpent: bigint = this.getTransactionOPNetFee();
|
|
166
|
-
this.addOutput({
|
|
167
|
-
value: Number(amountSpent),
|
|
168
|
-
address: this.to,
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
if (!this.disableAutoRefund) {
|
|
172
|
-
await this.addRefundOutput(amountSpent);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Sign the inputs
|
|
178
|
-
* @param {Psbt} transaction The transaction to sign
|
|
179
|
-
* @protected
|
|
180
|
-
*/
|
|
181
|
-
protected override async signInputs(transaction: Psbt): Promise<void> {
|
|
182
|
-
if (!this.scriptSigner) {
|
|
183
|
-
await super.signInputs(transaction);
|
|
184
|
-
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
for (let i = 0; i < transaction.data.inputs.length; i++) {
|
|
189
|
-
let input: PsbtInput = transaction.data.inputs[i];
|
|
190
|
-
let finalized: boolean = false;
|
|
191
|
-
let signed: boolean = false;
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
await this.signInput(transaction, input, i, this.scriptSigner);
|
|
195
|
-
signed = true;
|
|
196
|
-
} catch (e) {}
|
|
197
|
-
|
|
198
|
-
try {
|
|
199
|
-
await this.signInput(transaction, input, i);
|
|
200
|
-
signed = true;
|
|
201
|
-
} catch (e) {}
|
|
202
|
-
|
|
203
|
-
try {
|
|
204
|
-
transaction.finalizeInput(0, this.customFinalizer);
|
|
205
|
-
finalized = true;
|
|
206
|
-
} catch (e) {}
|
|
207
|
-
|
|
208
|
-
try {
|
|
209
|
-
transaction.finalizeInput(i);
|
|
210
|
-
finalized = true;
|
|
211
|
-
} catch (e) {}
|
|
212
|
-
|
|
213
|
-
if (signed || finalized) {
|
|
214
|
-
this.log(
|
|
215
|
-
`Signed input or finalized input #${i} out of ${transaction.data.inputs.length}! {Signed: ${signed}, Finalized: ${finalized}}`,
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (this.regenerated || this.ignoreSignatureErrors) {
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
throw new Error('Failed to sign input');
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
protected override generateScriptAddress(): Payment {
|
|
230
|
-
return {
|
|
231
|
-
internalPubkey: this.internalPubKeyToXOnly(),
|
|
232
|
-
network: this.network,
|
|
233
|
-
scriptTree: this.scriptTree,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
protected override generateTapData(): Payment {
|
|
238
|
-
const selectedRedeem = !!this.scriptSigner
|
|
239
|
-
? this.targetScriptRedeem
|
|
240
|
-
: this.leftOverFundsScriptRedeem;
|
|
241
|
-
|
|
242
|
-
if (!selectedRedeem) {
|
|
243
|
-
throw new Error('Left over funds script redeem is required');
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (!this.scriptTree) {
|
|
247
|
-
throw new Error('Script tree is required');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return {
|
|
251
|
-
internalPubkey: this.internalPubKeyToXOnly(),
|
|
252
|
-
network: this.network,
|
|
253
|
-
scriptTree: this.scriptTree,
|
|
254
|
-
redeem: selectedRedeem,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Generate the script solution
|
|
260
|
-
* @param {PsbtInput} input The input
|
|
261
|
-
* @protected
|
|
262
|
-
*
|
|
263
|
-
* @returns {Buffer[]} The script solution
|
|
264
|
-
*/
|
|
265
|
-
protected getScriptSolution(input: PsbtInput): Buffer[] {
|
|
266
|
-
if (!input.tapScriptSig) {
|
|
267
|
-
throw new Error('Tap script signature is required');
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return [
|
|
271
|
-
this.contractSecret,
|
|
272
|
-
this.internalPubKeyToXOnly(),
|
|
273
|
-
input.tapScriptSig[0].signature,
|
|
274
|
-
input.tapScriptSig[1].signature,
|
|
275
|
-
];
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Get the script tree
|
|
280
|
-
* @private
|
|
281
|
-
*
|
|
282
|
-
* @returns {Taptree} The script tree
|
|
283
|
-
*/
|
|
284
|
-
protected getScriptTree(): Taptree {
|
|
285
|
-
if (!this.calldata) {
|
|
286
|
-
throw new Error('Calldata is required');
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
this.generateRedeemScripts();
|
|
290
|
-
|
|
291
|
-
return [
|
|
292
|
-
{
|
|
293
|
-
output: this.compiledTargetScript,
|
|
294
|
-
version: 192,
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
|
|
298
|
-
version: 192,
|
|
299
|
-
},
|
|
300
|
-
];
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Transaction finalizer
|
|
305
|
-
* @param {number} _inputIndex The input index
|
|
306
|
-
* @param {PsbtInput} input The input
|
|
307
|
-
*/
|
|
308
|
-
protected customFinalizer = (_inputIndex: number, input: PsbtInput) => {
|
|
309
|
-
if (!this.tapLeafScript) {
|
|
310
|
-
throw new Error('Tap leaf script is required');
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (!input.tapScriptSig) {
|
|
314
|
-
throw new Error('Tap script signature is required');
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (!this.contractSecret) {
|
|
318
|
-
throw new Error('Contract secret is required');
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const scriptSolution = this.getScriptSolution(input);
|
|
322
|
-
const witness = scriptSolution
|
|
323
|
-
.concat(this.tapLeafScript.script)
|
|
324
|
-
.concat(this.tapLeafScript.controlBlock);
|
|
325
|
-
|
|
326
|
-
return {
|
|
327
|
-
finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
|
|
328
|
-
};
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Get the public keys
|
|
333
|
-
* @private
|
|
334
|
-
*
|
|
335
|
-
* @returns {Buffer[]} The public keys
|
|
336
|
-
*/
|
|
337
|
-
private getPubKeys(): Buffer[] {
|
|
338
|
-
const pubkeys = [this.signer.publicKey];
|
|
339
|
-
|
|
340
|
-
if (this.scriptSigner) {
|
|
341
|
-
pubkeys.push(this.scriptSigner.publicKey);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
return pubkeys;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Generate the redeem scripts
|
|
349
|
-
* @private
|
|
350
|
-
*
|
|
351
|
-
* @throws {Error} If the public keys are required
|
|
352
|
-
* @throws {Error} If the leaf script is required
|
|
353
|
-
* @throws {Error} If the leaf script version is required
|
|
354
|
-
* @throws {Error} If the leaf script output is required
|
|
355
|
-
* @throws {Error} If the target script redeem is required
|
|
356
|
-
*/
|
|
357
|
-
private generateRedeemScripts(): void {
|
|
358
|
-
this.targetScriptRedeem = {
|
|
359
|
-
output: this.compiledTargetScript,
|
|
360
|
-
redeemVersion: 192,
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
this.leftOverFundsScriptRedeem = {
|
|
364
|
-
output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
|
|
365
|
-
redeemVersion: 192,
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
}
|
|
1
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces.js';
|
|
2
|
+
import { address, Payment, Psbt, Signer } from 'bitcoinjs-lib';
|
|
3
|
+
import { Taptree } from 'bitcoinjs-lib/src/types.js';
|
|
4
|
+
import { ECPairInterface } from 'ecpair';
|
|
5
|
+
import { TransactionBuilder } from './TransactionBuilder.js';
|
|
6
|
+
import { TransactionType } from '../enums/TransactionType.js';
|
|
7
|
+
import { CalldataGenerator } from '../../generators/builders/CalldataGenerator.js';
|
|
8
|
+
import { SharedInteractionParameters } from '../interfaces/ITransactionParameters.js';
|
|
9
|
+
import { Compressor } from '../../bytecode/Compressor.js';
|
|
10
|
+
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
11
|
+
import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
|
|
12
|
+
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Shared interaction transaction
|
|
16
|
+
* @class SharedInteractionTransaction
|
|
17
|
+
*/
|
|
18
|
+
export abstract class SharedInteractionTransaction<
|
|
19
|
+
T extends TransactionType,
|
|
20
|
+
> extends TransactionBuilder<T> {
|
|
21
|
+
/**
|
|
22
|
+
* Random salt for the interaction
|
|
23
|
+
* @type {Buffer}
|
|
24
|
+
*/
|
|
25
|
+
public readonly randomBytes: Buffer;
|
|
26
|
+
|
|
27
|
+
protected targetScriptRedeem: Payment | null = null;
|
|
28
|
+
protected leftOverFundsScriptRedeem: Payment | null = null;
|
|
29
|
+
|
|
30
|
+
protected abstract readonly compiledTargetScript: Buffer;
|
|
31
|
+
protected abstract readonly scriptTree: Taptree;
|
|
32
|
+
|
|
33
|
+
protected calldataGenerator: CalldataGenerator;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Calldata for the interaction
|
|
37
|
+
* @protected
|
|
38
|
+
*/
|
|
39
|
+
protected readonly calldata: Buffer;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Contract secret for the interaction
|
|
43
|
+
* @protected
|
|
44
|
+
*/
|
|
45
|
+
protected abstract readonly contractSecret: Buffer;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Script signer for the interaction
|
|
49
|
+
* @protected
|
|
50
|
+
*/
|
|
51
|
+
protected readonly scriptSigner: Signer;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Disable auto refund
|
|
55
|
+
* @protected
|
|
56
|
+
*/
|
|
57
|
+
protected readonly disableAutoRefund: boolean;
|
|
58
|
+
|
|
59
|
+
protected constructor(parameters: SharedInteractionParameters) {
|
|
60
|
+
super(parameters);
|
|
61
|
+
|
|
62
|
+
if (!parameters.calldata) {
|
|
63
|
+
throw new Error('Calldata is required');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
this.disableAutoRefund = parameters.disableAutoRefund || false;
|
|
67
|
+
|
|
68
|
+
this.calldata = Compressor.compress(parameters.calldata);
|
|
69
|
+
|
|
70
|
+
this.randomBytes = parameters.randomBytes || BitcoinUtils.rndBytes();
|
|
71
|
+
this.scriptSigner = this.generateKeyPairFromSeed();
|
|
72
|
+
|
|
73
|
+
this.calldataGenerator = new CalldataGenerator(
|
|
74
|
+
this.internalPubKeyToXOnly(),
|
|
75
|
+
this.scriptSignerXOnlyPubKey(),
|
|
76
|
+
this.network,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the contract secret
|
|
82
|
+
* @returns {Buffer} The contract secret
|
|
83
|
+
*/
|
|
84
|
+
public getContractSecret(): Buffer {
|
|
85
|
+
return this.contractSecret;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Get the random bytes used for the interaction
|
|
90
|
+
* @returns {Buffer} The random bytes
|
|
91
|
+
*/
|
|
92
|
+
public getRndBytes(): Buffer {
|
|
93
|
+
return this.randomBytes;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Generate the secret for the interaction
|
|
98
|
+
* @protected
|
|
99
|
+
* @returns {Buffer} The secret
|
|
100
|
+
* @throws {Error} If the to address is invalid
|
|
101
|
+
*/
|
|
102
|
+
protected generateSecret(): Buffer {
|
|
103
|
+
if (!this.to) throw new Error('To address is required');
|
|
104
|
+
|
|
105
|
+
return address.fromBech32(this.to).data;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get the internal pubkey as an x-only key
|
|
110
|
+
* @protected
|
|
111
|
+
* @returns {Buffer} The internal pubkey as an x-only key
|
|
112
|
+
*/
|
|
113
|
+
protected scriptSignerXOnlyPubKey(): Buffer {
|
|
114
|
+
return toXOnly(this.scriptSigner.publicKey);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Generate a key pair from the seed
|
|
119
|
+
* @protected
|
|
120
|
+
*
|
|
121
|
+
* @returns {ECPairInterface} The key pair
|
|
122
|
+
*/
|
|
123
|
+
protected generateKeyPairFromSeed(): ECPairInterface {
|
|
124
|
+
return EcKeyPair.fromSeedKeyPair(this.randomBytes, this.network);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Build the transaction
|
|
129
|
+
* @protected
|
|
130
|
+
*
|
|
131
|
+
* @throws {Error} If the left over funds script redeem is required
|
|
132
|
+
* @throws {Error} If the left over funds script redeem version is required
|
|
133
|
+
* @throws {Error} If the left over funds script redeem output is required
|
|
134
|
+
* @throws {Error} If the to address is required
|
|
135
|
+
*/
|
|
136
|
+
protected override async buildTransaction(): Promise<void> {
|
|
137
|
+
if (!this.to) throw new Error('To address is required');
|
|
138
|
+
|
|
139
|
+
const selectedRedeem = !!this.scriptSigner
|
|
140
|
+
? this.targetScriptRedeem
|
|
141
|
+
: this.leftOverFundsScriptRedeem;
|
|
142
|
+
|
|
143
|
+
if (!selectedRedeem) {
|
|
144
|
+
throw new Error('Left over funds script redeem is required');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!selectedRedeem.redeemVersion) {
|
|
148
|
+
throw new Error('Left over funds script redeem version is required');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (!selectedRedeem.output) {
|
|
152
|
+
throw new Error('Left over funds script redeem output is required');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
this.tapLeafScript = {
|
|
156
|
+
leafVersion: selectedRedeem.redeemVersion,
|
|
157
|
+
script: selectedRedeem.output,
|
|
158
|
+
controlBlock: this.getWitness(),
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
if (!this.regenerated) {
|
|
162
|
+
this.addInputsFromUTXO();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const amountSpent: bigint = this.getTransactionOPNetFee();
|
|
166
|
+
this.addOutput({
|
|
167
|
+
value: Number(amountSpent),
|
|
168
|
+
address: this.to,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
if (!this.disableAutoRefund) {
|
|
172
|
+
await this.addRefundOutput(amountSpent);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Sign the inputs
|
|
178
|
+
* @param {Psbt} transaction The transaction to sign
|
|
179
|
+
* @protected
|
|
180
|
+
*/
|
|
181
|
+
protected override async signInputs(transaction: Psbt): Promise<void> {
|
|
182
|
+
if (!this.scriptSigner) {
|
|
183
|
+
await super.signInputs(transaction);
|
|
184
|
+
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
for (let i = 0; i < transaction.data.inputs.length; i++) {
|
|
189
|
+
let input: PsbtInput = transaction.data.inputs[i];
|
|
190
|
+
let finalized: boolean = false;
|
|
191
|
+
let signed: boolean = false;
|
|
192
|
+
|
|
193
|
+
try {
|
|
194
|
+
await this.signInput(transaction, input, i, this.scriptSigner);
|
|
195
|
+
signed = true;
|
|
196
|
+
} catch (e) {}
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
await this.signInput(transaction, input, i);
|
|
200
|
+
signed = true;
|
|
201
|
+
} catch (e) {}
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
transaction.finalizeInput(0, this.customFinalizer);
|
|
205
|
+
finalized = true;
|
|
206
|
+
} catch (e) {}
|
|
207
|
+
|
|
208
|
+
try {
|
|
209
|
+
transaction.finalizeInput(i);
|
|
210
|
+
finalized = true;
|
|
211
|
+
} catch (e) {}
|
|
212
|
+
|
|
213
|
+
if (signed || finalized) {
|
|
214
|
+
this.log(
|
|
215
|
+
`Signed input or finalized input #${i} out of ${transaction.data.inputs.length}! {Signed: ${signed}, Finalized: ${finalized}}`,
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (this.regenerated || this.ignoreSignatureErrors) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
throw new Error('Failed to sign input');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
protected override generateScriptAddress(): Payment {
|
|
230
|
+
return {
|
|
231
|
+
internalPubkey: this.internalPubKeyToXOnly(),
|
|
232
|
+
network: this.network,
|
|
233
|
+
scriptTree: this.scriptTree,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
protected override generateTapData(): Payment {
|
|
238
|
+
const selectedRedeem = !!this.scriptSigner
|
|
239
|
+
? this.targetScriptRedeem
|
|
240
|
+
: this.leftOverFundsScriptRedeem;
|
|
241
|
+
|
|
242
|
+
if (!selectedRedeem) {
|
|
243
|
+
throw new Error('Left over funds script redeem is required');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!this.scriptTree) {
|
|
247
|
+
throw new Error('Script tree is required');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
internalPubkey: this.internalPubKeyToXOnly(),
|
|
252
|
+
network: this.network,
|
|
253
|
+
scriptTree: this.scriptTree,
|
|
254
|
+
redeem: selectedRedeem,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Generate the script solution
|
|
260
|
+
* @param {PsbtInput} input The input
|
|
261
|
+
* @protected
|
|
262
|
+
*
|
|
263
|
+
* @returns {Buffer[]} The script solution
|
|
264
|
+
*/
|
|
265
|
+
protected getScriptSolution(input: PsbtInput): Buffer[] {
|
|
266
|
+
if (!input.tapScriptSig) {
|
|
267
|
+
throw new Error('Tap script signature is required');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return [
|
|
271
|
+
this.contractSecret,
|
|
272
|
+
this.internalPubKeyToXOnly(),
|
|
273
|
+
input.tapScriptSig[0].signature,
|
|
274
|
+
input.tapScriptSig[1].signature,
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Get the script tree
|
|
280
|
+
* @private
|
|
281
|
+
*
|
|
282
|
+
* @returns {Taptree} The script tree
|
|
283
|
+
*/
|
|
284
|
+
protected getScriptTree(): Taptree {
|
|
285
|
+
if (!this.calldata) {
|
|
286
|
+
throw new Error('Calldata is required');
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
this.generateRedeemScripts();
|
|
290
|
+
|
|
291
|
+
return [
|
|
292
|
+
{
|
|
293
|
+
output: this.compiledTargetScript,
|
|
294
|
+
version: 192,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
|
|
298
|
+
version: 192,
|
|
299
|
+
},
|
|
300
|
+
];
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Transaction finalizer
|
|
305
|
+
* @param {number} _inputIndex The input index
|
|
306
|
+
* @param {PsbtInput} input The input
|
|
307
|
+
*/
|
|
308
|
+
protected customFinalizer = (_inputIndex: number, input: PsbtInput) => {
|
|
309
|
+
if (!this.tapLeafScript) {
|
|
310
|
+
throw new Error('Tap leaf script is required');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (!input.tapScriptSig) {
|
|
314
|
+
throw new Error('Tap script signature is required');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (!this.contractSecret) {
|
|
318
|
+
throw new Error('Contract secret is required');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const scriptSolution = this.getScriptSolution(input);
|
|
322
|
+
const witness = scriptSolution
|
|
323
|
+
.concat(this.tapLeafScript.script)
|
|
324
|
+
.concat(this.tapLeafScript.controlBlock);
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
finalScriptWitness: TransactionBuilder.witnessStackToScriptWitness(witness),
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Get the public keys
|
|
333
|
+
* @private
|
|
334
|
+
*
|
|
335
|
+
* @returns {Buffer[]} The public keys
|
|
336
|
+
*/
|
|
337
|
+
private getPubKeys(): Buffer[] {
|
|
338
|
+
const pubkeys = [this.signer.publicKey];
|
|
339
|
+
|
|
340
|
+
if (this.scriptSigner) {
|
|
341
|
+
pubkeys.push(this.scriptSigner.publicKey);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return pubkeys;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Generate the redeem scripts
|
|
349
|
+
* @private
|
|
350
|
+
*
|
|
351
|
+
* @throws {Error} If the public keys are required
|
|
352
|
+
* @throws {Error} If the leaf script is required
|
|
353
|
+
* @throws {Error} If the leaf script version is required
|
|
354
|
+
* @throws {Error} If the leaf script output is required
|
|
355
|
+
* @throws {Error} If the target script redeem is required
|
|
356
|
+
*/
|
|
357
|
+
private generateRedeemScripts(): void {
|
|
358
|
+
this.targetScriptRedeem = {
|
|
359
|
+
output: this.compiledTargetScript,
|
|
360
|
+
redeemVersion: 192,
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
this.leftOverFundsScriptRedeem = {
|
|
364
|
+
output: SharedInteractionTransaction.LOCK_LEAF_SCRIPT,
|
|
365
|
+
redeemVersion: 192,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
}
|