Skip to content

Commit 9c30f5e

Browse files
committed
Merge bitcoin-core#766: Fix coin control input size accounting for taproot spends
00a52e6 gui: fix coin control input size accounting for taproot spends (Sebastian Falbesoner) Pull request description: If manual coin control is used in the GUI, the input size accounting for P2TR is currently overshooting, as it still assumes P2WPKH (segwitv0) spends which have a larger witness, as ECDSA signatures are longer and the pubkey also has to be provided. Fix that by adding sizes depending on the witness version. Note that the total accounting including outputs is still off and there is some weird logic involved depending on whether SFFO is used, but it's (hopefully) a first step into the right direction. ACKs for top commit: maflcko: lgtm ACK 00a52e6 furszy: utACK 00a52e6 Tree-SHA512: 9633642f8473247cc3d8e6e0ef502fd515e1dde0e2939d28d6754d0cececedd6a328df22a3d4c85eb2846fd0417cf224b92594613f6e84ada82d2d7d84fc455f
2 parents fbcf102 + 00a52e6 commit 9c30f5e

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

src/qt/coincontroldialog.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,19 @@ void CoinControlDialog::updateLabels(CCoinControl& m_coin_control, WalletModel *
421421
std::vector<unsigned char> witnessprogram;
422422
if (out.txout.scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram))
423423
{
424-
nBytesInputs += (32 + 4 + 1 + (107 / WITNESS_SCALE_FACTOR) + 4);
424+
// add input skeleton bytes (outpoint, scriptSig size, nSequence)
425+
nBytesInputs += (32 + 4 + 1 + 4);
426+
427+
if (witnessversion == 0) { // P2WPKH
428+
// 1 WU (witness item count) + 72 WU (ECDSA signature with len byte) + 34 WU (pubkey with len byte)
429+
nBytesInputs += 107 / WITNESS_SCALE_FACTOR;
430+
} else if (witnessversion == 1) { // P2TR key-path spend
431+
// 1 WU (witness item count) + 65 WU (Schnorr signature with len byte)
432+
nBytesInputs += 66 / WITNESS_SCALE_FACTOR;
433+
} else {
434+
// not supported, should be unreachable
435+
throw std::runtime_error("Trying to spend future segwit version script");
436+
}
425437
fWitness = true;
426438
}
427439
else if(ExtractDestination(out.txout.scriptPubKey, address))

0 commit comments

Comments
 (0)