package input import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcwallet/waddrmgr" ) const ( // witnessScaleFactor determines the level of "discount" witness data // receives compared to "base" data. A scale factor of 4, denotes that // witness data is 1/4 as cheap as regular non-witness data. Value copied // here for convenience. witnessScaleFactor = blockchain.WitnessScaleFactor // The weight(weight), which is different from the !size! (see BIP-141), // is calculated as: // Weight = 4 * BaseSize + WitnessSize (weight). // BaseSize - size of the transaction without witness data (bytes). // WitnessSize - witness size (bytes). // Weight - the metric for determining the weight of the transaction. // P2WPKHSize 22 bytes // - OP_0: 1 byte // - OP_DATA: 1 byte (PublicKeyHASH160 length) // - PublicKeyHASH160: 20 bytes P2WPKHSize = 1 + 1 + 20 // NestedP2WPKHSize 23 bytes // - OP_DATA: 1 byte (P2WPKHSize) // - P2WPKHWitnessProgram: 22 bytes NestedP2WPKHSize = 1 + P2WPKHSize // P2WSHSize 34 bytes // - OP_0: 1 byte // - OP_DATA: 1 byte (WitnessScriptSHA256 length) // - WitnessScriptSHA256: 32 bytes P2WSHSize = 1 + 1 + 32 // NestedP2WSHSize 35 bytes // - OP_DATA: 1 byte (P2WSHSize) // - P2WSHWitnessProgram: 34 bytes NestedP2WSHSize = 1 + P2WSHSize // UnknownWitnessSize 42 bytes // - OP_x: 1 byte // - OP_DATA: 1 byte (max-size length) // - max-size: 40 bytes UnknownWitnessSize = 1 + 1 + 40 // P2PKHSize 25 bytes. P2PKHSize = 25 // P2PKHOutputSize 34 bytes // - value: 8 bytes // - var_int: 1 byte (pkscript_length) // - pkscript (p2pkh): 25 bytes P2PKHOutputSize = 8 + 1 + P2PKHSize // P2WKHOutputSize 31 bytes // - value: 8 bytes // - var_int: 1 byte (pkscript_length) // - pkscript (p2wpkh): 22 bytes P2WKHOutputSize = 8 + 1 + P2WPKHSize // P2WSHOutputSize 43 bytes // - value: 8 bytes // - var_int: 1 byte (pkscript_length) // - pkscript (p2wsh): 34 bytes P2WSHOutputSize = 8 + 1 + P2WSHSize // P2SHSize 23 bytes. P2SHSize = 23 // P2SHOutputSize 32 bytes // - value: 8 bytes // - var_int: 1 byte (pkscript_length) // - pkscript (p2sh): 23 bytes P2SHOutputSize = 8 + 1 + P2SHSize // P2TRSize 34 bytes // - OP_0: 1 byte // - OP_DATA: 1 byte (x-only public key length) // - x-only public key length: 32 bytes P2TRSize = 34 // P2TROutputSize 43 bytes // - value: 8 bytes // - var_int: 1 byte (pkscript_length) // - pkscript (p2tr): 34 bytes P2TROutputSize = 8 + 1 + P2TRSize // P2PKHScriptSigSize 108 bytes // - OP_DATA: 1 byte (signature length) // - signature // - OP_DATA: 1 byte (pubkey length) // - pubkey P2PKHScriptSigSize = 1 + 73 + 1 + 33 // P2WKHWitnessSize 109 bytes // - number_of_witness_elements: 1 byte // - signature_length: 1 byte // - signature // - pubkey_length: 1 byte // - pubkey P2WKHWitnessSize = 1 + 1 + 73 + 1 + 33 // MultiSigSize 71 bytes // - OP_2: 1 byte // - OP_DATA: 1 byte (pubKeyAlice length) // - pubKeyAlice: 33 bytes // - OP_DATA: 1 byte (pubKeyBob length) // - pubKeyBob: 33 bytes // - OP_2: 1 byte // - OP_CHECKMULTISIG: 1 byte MultiSigSize = 1 + 1 + 33 + 1 + 33 + 1 + 1 // MultiSigWitnessSize 222 bytes // - NumberOfWitnessElements: 1 byte // - NilLength: 1 byte // - sigAliceLength: 1 byte // - sigAlice: 73 bytes // - sigBobLength: 1 byte // - sigBob: 73 bytes // - WitnessScriptLength: 1 byte // - WitnessScript (MultiSig) MultiSigWitnessSize = 1 + 1 + 1 + 73 + 1 + 73 + 1 + MultiSigSize // InputSize 41 bytes // - PreviousOutPoint: // - Hash: 32 bytes // - Index: 4 bytes // - OP_DATA: 1 byte (ScriptSigLength) // - ScriptSig: 0 bytes // - Witness <---- we use "Witness" instead of "ScriptSig" for // transaction validation, but "Witness" is stored // separately and weight for it size is smaller. So // we separate the calculation of ordinary data // from witness data. // - Sequence: 4 bytes InputSize = 32 + 4 + 1 + 4 // FundingInputSize 41 bytes // FundingInputSize represents the size of an input to a funding // transaction, and is equivalent to the size of a standard segwit input // as calculated above. FundingInputSize = InputSize // CommitmentDelayOutput 43 bytes // - Value: 8 bytes // - VarInt: 1 byte (PkScript length) // - PkScript (P2WSH) CommitmentDelayOutput = 8 + 1 + P2WSHSize // CommitmentKeyHashOutput 31 bytes // - Value: 8 bytes // - VarInt: 1 byte (PkScript length) // - PkScript (P2WPKH) CommitmentKeyHashOutput = 8 + 1 + P2WPKHSize // CommitmentAnchorOutput 43 bytes // - Value: 8 bytes // - VarInt: 1 byte (PkScript length) // - PkScript (P2WSH) CommitmentAnchorOutput = 8 + 1 + P2WSHSize // HTLCSize 43 bytes // - Value: 8 bytes // - VarInt: 1 byte (PkScript length) // - PkScript (PW2SH) HTLCSize = 8 + 1 + P2WSHSize // WitnessHeaderSize 2 bytes // - Flag: 1 byte // - Marker: 1 byte WitnessHeaderSize = 1 + 1 // BaseTxSize 8 bytes // - Version: 4 bytes // - LockTime: 4 bytes BaseTxSize = 4 + 4 // BaseCommitmentTxSize 125 + 43 * num-htlc-outputs bytes // - Version: 4 bytes // - WitnessHeader <---- part of the witness data // - CountTxIn: 1 byte // - TxIn: 41 bytes // FundingInput // - CountTxOut: 1 byte // - TxOut: 74 + 43 * num-htlc-outputs bytes // OutputPayingToThem, // OutputPayingToUs, // ....HTLCOutputs... // - LockTime: 4 bytes BaseCommitmentTxSize = 4 + 1 + FundingInputSize + 1 + CommitmentDelayOutput + CommitmentKeyHashOutput + 4 // BaseCommitmentTxWeight 500 weight BaseCommitmentTxWeight = witnessScaleFactor * BaseCommitmentTxSize // WitnessCommitmentTxWeight 224 weight WitnessCommitmentTxWeight = WitnessHeaderSize + MultiSigWitnessSize // BaseAnchorCommitmentTxSize 225 + 43 * num-htlc-outputs bytes // - Version: 4 bytes // - WitnessHeader <---- part of the witness data // - CountTxIn: 1 byte // - TxIn: 41 bytes // FundingInput // - CountTxOut: 3 byte // - TxOut: 4*43 + 43 * num-htlc-outputs bytes // OutputPayingToThem, // OutputPayingToUs, // AnchorPayingToThem, // AnchorPayingToUs, // ....HTLCOutputs... // - LockTime: 4 bytes BaseAnchorCommitmentTxSize = 4 + 1 + FundingInputSize + 3 + 2*CommitmentDelayOutput + 2*CommitmentAnchorOutput + 4 // BaseAnchorCommitmentTxWeight 900 weight. BaseAnchorCommitmentTxWeight = witnessScaleFactor * BaseAnchorCommitmentTxSize // CommitWeight 724 weight. CommitWeight = BaseCommitmentTxWeight + WitnessCommitmentTxWeight // AnchorCommitWeight 1124 weight. AnchorCommitWeight = BaseAnchorCommitmentTxWeight + WitnessCommitmentTxWeight // HTLCWeight 172 weight. HTLCWeight = witnessScaleFactor * HTLCSize // HtlcTimeoutWeight 663 weight // HtlcTimeoutWeight is the weight of the HTLC timeout transaction // which will transition an outgoing HTLC to the delay-and-claim state. HtlcTimeoutWeight = 663 // HtlcSuccessWeight 703 weight // HtlcSuccessWeight is the weight of the HTLC success transaction // which will transition an incoming HTLC to the delay-and-claim state. HtlcSuccessWeight = 703 // HtlcConfirmedScriptOverhead 3 bytes // HtlcConfirmedScriptOverhead is the extra length of an HTLC script // that requires confirmation before it can be spent. These extra bytes // is a result of the extra CSV check. HtlcConfirmedScriptOverhead = 3 // HtlcTimeoutWeightConfirmed 666 weight // HtlcTimeoutWeightConfirmed is the weight of the HTLC timeout // transaction which will transition an outgoing HTLC to the // delay-and-claim state, for the confirmed HTLC outputs. It is 3 bytes // larger because of the additional CSV check in the input script. HtlcTimeoutWeightConfirmed = HtlcTimeoutWeight + HtlcConfirmedScriptOverhead // HtlcSuccessWeightConfirmed 706 weight // HtlcSuccessWeightConfirmed is the weight of the HTLC success // transaction which will transition an incoming HTLC to the // delay-and-claim state, for the confirmed HTLC outputs. It is 3 bytes // larger because of the cdditional CSV check in the input script. HtlcSuccessWeightConfirmed = HtlcSuccessWeight + HtlcConfirmedScriptOverhead // MaxHTLCNumber 966 // MaxHTLCNumber is the maximum number HTLCs which can be included in a // commitment transaction. This limit was chosen such that, in the case // of a contract breach, the punishment transaction is able to sweep // all the HTLC's yet still remain below the widely used standard // weight limits. MaxHTLCNumber = 966 // ToLocalScriptSize 79 bytes // - OP_IF: 1 byte // - OP_DATA: 1 byte // - revoke_key: 33 bytes // - OP_ELSE: 1 byte // - OP_DATA: 1 byte // - csv_delay: 4 bytes // - OP_CHECKSEQUENCEVERIFY: 1 byte // - OP_DROP: 1 byte // - OP_DATA: 1 byte // - delay_key: 33 bytes // - OP_ENDIF: 1 byte // - OP_CHECKSIG: 1 byte ToLocalScriptSize = 1 + 1 + 33 + 1 + 1 + 4 + 1 + 1 + 1 + 33 + 1 + 1 // LeaseWitnessScriptSizeOverhead represents the size overhead in bytes // of the witness scripts used within script enforced lease commitments. // This overhead results from the additional CLTV clause required to // spend. // // - OP_DATA: 1 byte // - lease_expiry: 4 bytes // - OP_CHECKLOCKTIMEVERIFY: 1 byte // - OP_DROP: 1 byte LeaseWitnessScriptSizeOverhead = 1 + 4 + 1 + 1 // ToLocalTimeoutWitnessSize 156 bytes // - number_of_witness_elements: 1 byte // - local_delay_sig_length: 1 byte // - local_delay_sig: 73 bytes // - zero_length: 1 byte // - witness_script_length: 1 byte // - witness_script (to_local_script) ToLocalTimeoutWitnessSize = 1 + 1 + 73 + 1 + 1 + ToLocalScriptSize // ToLocalPenaltyWitnessSize 157 bytes // - number_of_witness_elements: 1 byte // - revocation_sig_length: 1 byte // - revocation_sig: 73 bytes // - OP_TRUE_length: 1 byte // - OP_TRUE: 1 byte // - witness_script_length: 1 byte // - witness_script (to_local_script) ToLocalPenaltyWitnessSize = 1 + 1 + 73 + 1 + 1 + 1 + ToLocalScriptSize // ToRemoteConfirmedScriptSize 37 bytes // - OP_DATA: 1 byte // - to_remote_key: 33 bytes // - OP_CHECKSIGVERIFY: 1 byte // - OP_1: 1 byte // - OP_CHECKSEQUENCEVERIFY: 1 byte ToRemoteConfirmedScriptSize = 1 + 33 + 1 + 1 + 1 // ToRemoteConfirmedWitnessSize 113 bytes // - number_of_witness_elements: 1 byte // - sig_length: 1 byte // - sig: 73 bytes // - witness_script_length: 1 byte // - witness_script (to_remote_delayed_script) ToRemoteConfirmedWitnessSize = 1 + 1 + 73 + 1 + ToRemoteConfirmedScriptSize // AcceptedHtlcScriptSize 140 bytes // - OP_DUP: 1 byte // - OP_HASH160: 1 byte // - OP_DATA: 1 byte (RIPEMD160(SHA256(revocationkey)) length) // - RIPEMD160(SHA256(revocationkey)): 20 bytes // - OP_EQUAL: 1 byte // - OP_IF: 1 byte // - OP_CHECKSIG: 1 byte // - OP_ELSE: 1 byte // - OP_DATA: 1 byte (remotekey length) // - remotekey: 33 bytes // - OP_SWAP: 1 byte // - OP_SIZE: 1 byte // - OP_DATA: 1 byte (32 length) // - 32: 1 byte // - OP_EQUAL: 1 byte // - OP_IF: 1 byte // - OP_HASH160: 1 byte // - OP_DATA: 1 byte (RIPEMD160(payment_hash) length) // - RIPEMD160(payment_hash): 20 bytes // - OP_EQUALVERIFY: 1 byte // - 2: 1 byte // - OP_SWAP: 1 byte // - OP_DATA: 1 byte (localkey length) // - localkey: 33 bytes // - 2: 1 byte // - OP_CHECKMULTISIG: 1 byte // - OP_ELSE: 1 byte // - OP_DROP: 1 byte // - OP_DATA: 1 byte (cltv_expiry length) // - cltv_expiry: 4 bytes // - OP_CHECKLOCKTIMEVERIFY: 1 byte // - OP_DROP: 1 byte // - OP_CHECKSIG: 1 byte // - OP_ENDIF: 1 byte // - OP_1: 1 byte // These 3 extra bytes are only // - OP_CSV: 1 byte // present for the confirmed // - OP_DROP: 1 byte // HTLC script types. // - OP_ENDIF: 1 byte AcceptedHtlcScriptSize = 3*1 + 20 + 5*1 + 33 + 8*1 + 20 + 4*1 + 33 + 5*1 + 4 + 5*1 // AcceptedHtlcScriptSizeConfirmed 143 bytes. AcceptedHtlcScriptSizeConfirmed = AcceptedHtlcScriptSize + HtlcConfirmedScriptOverhead // AcceptedHtlcTimeoutWitnessSize 217 bytes // - number_of_witness_elements: 1 byte // - sender_sig_length: 1 byte // - sender_sig: 73 bytes // - nil_length: 1 byte // - witness_script_length: 1 byte // - witness_script: (accepted_htlc_script) AcceptedHtlcTimeoutWitnessSize = 1 + 1 + 73 + 1 + 1 + AcceptedHtlcScriptSize // AcceptedHtlcTimeoutWitnessSizeConfirmed 220 bytes. AcceptedHtlcTimeoutWitnessSizeConfirmed = 1 + 1 + 73 + 1 + 1 + AcceptedHtlcScriptSizeConfirmed // AcceptedHtlcPenaltyWitnessSize 250 bytes // - number_of_witness_elements: 1 byte // - revocation_sig_length: 1 byte // - revocation_sig: 73 bytes // - revocation_key_length: 1 byte // - revocation_key: 33 bytes // - witness_script_length: 1 byte // - witness_script (accepted_htlc_script) AcceptedHtlcPenaltyWitnessSize = 1 + 1 + 73 + 1 + 33 + 1 + AcceptedHtlcScriptSize // AcceptedHtlcPenaltyWitnessSizeConfirmed 253 bytes. AcceptedHtlcPenaltyWitnessSizeConfirmed = 1 + 1 + 73 + 1 + 33 + 1 + AcceptedHtlcScriptSizeConfirmed // AcceptedHtlcSuccessWitnessSize 324 bytes // - number_of_witness_elements: 1 byte // - nil_length: 1 byte // - sig_alice_length: 1 byte // - sig_alice: 73 bytes // - sig_bob_length: 1 byte // - sig_bob: 73 bytes // - preimage_length: 1 byte // - preimage: 32 bytes // - witness_script_length: 1 byte // - witness_script (accepted_htlc_script) // // Input to second level success tx, spending non-delayed HTLC output. AcceptedHtlcSuccessWitnessSize = 1 + 1 + 1 + 73 + 1 + 73 + 1 + 32 + 1 + AcceptedHtlcScriptSize // AcceptedHtlcSuccessWitnessSizeConfirmed 327 bytes // // Input to second level success tx, spending 1 CSV delayed HTLC output. AcceptedHtlcSuccessWitnessSizeConfirmed = 1 + 1 + 1 + 73 + 1 + 73 + 1 + 32 + 1 + AcceptedHtlcScriptSizeConfirmed // OfferedHtlcScriptSize 133 bytes // - OP_DUP: 1 byte // - OP_HASH160: 1 byte // - OP_DATA: 1 byte (RIPEMD160(SHA256(revocationkey)) length) // - RIPEMD160(SHA256(revocationkey)): 20 bytes // - OP_EQUAL: 1 byte // - OP_IF: 1 byte // - OP_CHECKSIG: 1 byte // - OP_ELSE: 1 byte // - OP_DATA: 1 byte (remotekey length) // - remotekey: 33 bytes // - OP_SWAP: 1 byte // - OP_SIZE: 1 byte // - OP_DATA: 1 byte (32 length) // - 32: 1 byte // - OP_EQUAL: 1 byte // - OP_NOTIF: 1 byte // - OP_DROP: 1 byte // - 2: 1 byte // - OP_SWAP: 1 byte // - OP_DATA: 1 byte (localkey length) // - localkey: 33 bytes // - 2: 1 byte // - OP_CHECKMULTISIG: 1 byte // - OP_ELSE: 1 byte // - OP_HASH160: 1 byte // - OP_DATA: 1 byte (RIPEMD160(payment_hash) length) // - RIPEMD160(payment_hash): 20 bytes // - OP_EQUALVERIFY: 1 byte // - OP_CHECKSIG: 1 byte // - OP_ENDIF: 1 byte // - OP_1: 1 byte // These 3 extra bytes are only // - OP_CSV: 1 byte // present for the confirmed // - OP_DROP: 1 byte // HTLC script types. // - OP_ENDIF: 1 byte OfferedHtlcScriptSize = 3*1 + 20 + 5*1 + 33 + 10*1 + 33 + 5*1 + 20 + 4*1 // OfferedHtlcScriptSizeConfirmed 136 bytes. OfferedHtlcScriptSizeConfirmed = OfferedHtlcScriptSize + HtlcConfirmedScriptOverhead // OfferedHtlcSuccessWitnessSize 242 bytes // - number_of_witness_elements: 1 byte // - receiver_sig_length: 1 byte // - receiver_sig: 73 bytes // - payment_preimage_length: 1 byte // - payment_preimage: 32 bytes // - witness_script_length: 1 byte // - witness_script (offered_htlc_script) OfferedHtlcSuccessWitnessSize = 1 + 1 + 73 + 1 + 32 + 1 + OfferedHtlcScriptSize // OfferedHtlcSuccessWitnessSizeConfirmed 245 bytes. OfferedHtlcSuccessWitnessSizeConfirmed = 1 + 1 + 73 + 1 + 32 + 1 + OfferedHtlcScriptSizeConfirmed // OfferedHtlcTimeoutWitnessSize 285 bytes // - number_of_witness_elements: 1 byte // - nil_length: 1 byte // - sig_alice_length: 1 byte // - sig_alice: 73 bytes // - sig_bob_length: 1 byte // - sig_bob: 73 bytes // - nil_length: 1 byte // - witness_script_length: 1 byte // - witness_script (offered_htlc_script) // // Input to second level timeout tx, spending non-delayed HTLC output. OfferedHtlcTimeoutWitnessSize = 1 + 1 + 1 + 73 + 1 + 73 + 1 + 1 + OfferedHtlcScriptSize // OfferedHtlcTimeoutWitnessSizeConfirmed 288 bytes // // Input to second level timeout tx, spending 1 CSV delayed HTLC output. OfferedHtlcTimeoutWitnessSizeConfirmed = 1 + 1 + 1 + 73 + 1 + 73 + 1 + 1 + OfferedHtlcScriptSizeConfirmed // OfferedHtlcPenaltyWitnessSize 243 bytes // - number_of_witness_elements: 1 byte // - revocation_sig_length: 1 byte // - revocation_sig: 73 bytes // - revocation_key_length: 1 byte // - revocation_key: 33 bytes // - witness_script_length: 1 byte // - witness_script (offered_htlc_script) OfferedHtlcPenaltyWitnessSize = 1 + 1 + 73 + 1 + 33 + 1 + OfferedHtlcScriptSize // OfferedHtlcPenaltyWitnessSizeConfirmed 246 bytes. OfferedHtlcPenaltyWitnessSizeConfirmed = 1 + 1 + 73 + 1 + 33 + 1 + OfferedHtlcScriptSizeConfirmed // AnchorScriptSize 40 bytes // - pubkey_length: 1 byte // - pubkey: 33 bytes // - OP_CHECKSIG: 1 byte // - OP_IFDUP: 1 byte // - OP_NOTIF: 1 byte // - OP_16: 1 byte // - OP_CSV 1 byte // - OP_ENDIF: 1 byte AnchorScriptSize = 1 + 33 + 6*1 // AnchorWitnessSize 116 bytes // - number_of_witnes_elements: 1 byte // - signature_length: 1 byte // - signature: 73 bytes // - witness_script_length: 1 byte // - witness_script (anchor_script) AnchorWitnessSize = 1 + 1 + 73 + 1 + AnchorScriptSize // TaprootSignatureWitnessSize 65 bytes // - sigLength: 1 byte // - sig: 64 bytes TaprootSignatureWitnessSize = 1 + 64 // TaprootKeyPathWitnessSize 66 bytes // - NumberOfWitnessElements: 1 byte // - sigLength: 1 byte // - sig: 64 bytes TaprootKeyPathWitnessSize = 1 + TaprootSignatureWitnessSize // TaprootKeyPathCustomSighashWitnessSize 67 bytes // - NumberOfWitnessElements: 1 byte // - sigLength: 1 byte // - sig: 64 bytes // - sighashFlag: 1 byte TaprootKeyPathCustomSighashWitnessSize = TaprootKeyPathWitnessSize + 1 // TaprootBaseControlBlockWitnessSize 33 bytes // - leafVersionAndParity: 1 byte // - schnorrPubKey: 32 byte TaprootBaseControlBlockWitnessSize = 33 ) // EstimateCommitTxWeight estimate commitment transaction weight depending on // the precalculated weight of base transaction, witness data, which is needed // for paying for funding tx, and htlc weight multiplied by their count. func EstimateCommitTxWeight(count int, prediction bool) int64 { // Make prediction about the size of commitment transaction with // additional HTLC. if prediction { count++ } htlcWeight := int64(count * HTLCWeight) baseWeight := int64(BaseCommitmentTxWeight) witnessWeight := int64(WitnessCommitmentTxWeight) return htlcWeight + baseWeight + witnessWeight } // TxWeightEstimator is able to calculate weight estimates for transactions // based on the input and output types. For purposes of estimation, all // signatures are assumed to be of the maximum possible size, 73 bytes. Each // method of the estimator returns an instance with the estimate applied. This // allows callers to chain each of the methods type TxWeightEstimator struct { hasWitness bool inputCount uint32 outputCount uint32 inputSize int inputWitnessSize int outputSize int } // AddP2PKHInput updates the weight estimate to account for an additional input // spending a P2PKH output. func (twe *TxWeightEstimator) AddP2PKHInput() *TxWeightEstimator { twe.inputSize += InputSize + P2PKHScriptSigSize twe.inputWitnessSize++ twe.inputCount++ return twe } // AddP2WKHInput updates the weight estimate to account for an additional input // spending a native P2PWKH output. func (twe *TxWeightEstimator) AddP2WKHInput() *TxWeightEstimator { twe.AddWitnessInput(P2WKHWitnessSize) return twe } // AddWitnessInput updates the weight estimate to account for an additional // input spending a native pay-to-witness output. This accepts the total size // of the witness as a parameter. func (twe *TxWeightEstimator) AddWitnessInput(witnessSize int) *TxWeightEstimator { twe.inputSize += InputSize twe.inputWitnessSize += witnessSize twe.inputCount++ twe.hasWitness = true return twe } // AddTapscriptInput updates the weight estimate to account for an additional // input spending a segwit v1 pay-to-taproot output using the script path. This // accepts the total size of the witness for the script leaf that is executed // and adds the size of the control block to the total witness size. // // NOTE: The leaf witness size must be calculated without the byte that accounts // for the number of witness elements, only the total size of all elements on // the stack that are consumed by the revealed script should be counted. func (twe *TxWeightEstimator) AddTapscriptInput(leafWitnessSize int, tapscript *waddrmgr.Tapscript) *TxWeightEstimator { // We add 1 byte for the total number of witness elements. controlBlockWitnessSize := 1 + TaprootBaseControlBlockWitnessSize + // 1 byte for the length of the element plus the element itself. 1 + len(tapscript.RevealedScript) + 1 + len(tapscript.ControlBlock.InclusionProof) twe.inputSize += InputSize twe.inputWitnessSize += leafWitnessSize + controlBlockWitnessSize twe.inputCount++ twe.hasWitness = true return twe } // AddTaprootKeySpendInput updates the weight estimate to account for an // additional input spending a segwit v1 pay-to-taproot output using the key // spend path. This accepts the sighash type being used since that has an // influence on the total size of the signature. func (twe *TxWeightEstimator) AddTaprootKeySpendInput( hashType txscript.SigHashType) *TxWeightEstimator { twe.inputSize += InputSize if hashType == txscript.SigHashDefault { twe.inputWitnessSize += TaprootKeyPathWitnessSize } else { twe.inputWitnessSize += TaprootKeyPathCustomSighashWitnessSize } twe.inputCount++ twe.hasWitness = true return twe } // AddNestedP2WKHInput updates the weight estimate to account for an additional // input spending a P2SH output with a nested P2WKH redeem script. func (twe *TxWeightEstimator) AddNestedP2WKHInput() *TxWeightEstimator { twe.inputSize += InputSize + NestedP2WPKHSize twe.inputWitnessSize += P2WKHWitnessSize twe.inputCount++ twe.hasWitness = true return twe } // AddNestedP2WSHInput updates the weight estimate to account for an additional // input spending a P2SH output with a nested P2WSH redeem script. func (twe *TxWeightEstimator) AddNestedP2WSHInput(witnessSize int) *TxWeightEstimator { twe.inputSize += InputSize + NestedP2WSHSize twe.inputWitnessSize += witnessSize twe.inputCount++ twe.hasWitness = true return twe } // AddTxOutput adds a known TxOut to the weight estimator. func (twe *TxWeightEstimator) AddTxOutput(txOut *wire.TxOut) *TxWeightEstimator { twe.outputSize += txOut.SerializeSize() twe.outputCount++ return twe } // AddP2PKHOutput updates the weight estimate to account for an additional P2PKH // output. func (twe *TxWeightEstimator) AddP2PKHOutput() *TxWeightEstimator { twe.outputSize += P2PKHOutputSize twe.outputCount++ return twe } // AddP2WKHOutput updates the weight estimate to account for an additional // native P2WKH output. func (twe *TxWeightEstimator) AddP2WKHOutput() *TxWeightEstimator { twe.outputSize += P2WKHOutputSize twe.outputCount++ return twe } // AddP2WSHOutput updates the weight estimate to account for an additional // native P2WSH output. func (twe *TxWeightEstimator) AddP2WSHOutput() *TxWeightEstimator { twe.outputSize += P2WSHOutputSize twe.outputCount++ return twe } // AddP2TROutput updates the weight estimate to account for an additional native // SegWit v1 P2TR output. func (twe *TxWeightEstimator) AddP2TROutput() *TxWeightEstimator { twe.outputSize += P2TROutputSize twe.outputCount++ return twe } // AddP2SHOutput updates the weight estimate to account for an additional P2SH // output. func (twe *TxWeightEstimator) AddP2SHOutput() *TxWeightEstimator { twe.outputSize += P2SHOutputSize twe.outputCount++ return twe } // Weight gets the estimated weight of the transaction. func (twe *TxWeightEstimator) Weight() int { txSizeStripped := BaseTxSize + wire.VarIntSerializeSize(uint64(twe.inputCount)) + twe.inputSize + wire.VarIntSerializeSize(uint64(twe.outputCount)) + twe.outputSize weight := txSizeStripped * witnessScaleFactor if twe.hasWitness { weight += WitnessHeaderSize + twe.inputWitnessSize } return weight } // VSize gets the estimated virtual size of the transactions, in vbytes. func (twe *TxWeightEstimator) VSize() int { // A tx's vsize is 1/4 of the weight, rounded up. return (twe.Weight() + witnessScaleFactor - 1) / witnessScaleFactor }