upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorbitflash-maintainer <noreply@bitflash.invalid>2026-08-09 03:18:25 +0000
committerbitflash-maintainer <noreply@bitflash.invalid>2026-08-19 22:48:26 +0000
commitd6972a0ca2269441c7a1125d528fc577c242be7d (patch)
treef257f8beccc28a0cea5a75a9560416752ca017f8 /src/main.cpp
parent82ac5bbc05a1de2be752e2f89110af1e424bc863 (diff)
payout: say what actually failed instead of blaming transaction size
SendMoney's "oversized transaction that requires a transaction fee of 0.00" is not an oversized transaction and there is no fee. That branch is taken when nValue + nFeeRequired > GetBalance() -- an empty spendable balance -- and the fee reads 0.00 because CreateTransaction failed before setting one. 3,267 of these in debug.log sent me looking for a transaction-size problem that does not exist. Report what is short, by how much, and against what balance. Name COINBASE_SPENDABLE_DEPTH in main.h and derive GetBlocksToMaturity from it, because the distinction it captures is genuinely surprising: CMerkleTx::GetCredit values a mined coinbase at zero until COINBASE_MATURITY+20 deep, not COINBASE_MATURITY. I first changed the payout gate to that deeper value, on the theory that each payout was firing 20 blocks before its own coinbase could be spent. Measuring it refuted that: across 934 payments, 96% succeeded at depth 100, the moment they were queued, which is only possible because a payout is funded from whatever coin is already mature rather than from its own block. The gate stays at COINBASE_MATURITY, with a comment recording the measurement so the next person does not re-make the same change. The real shortfall is structural and not addressed here: the pool pays out ~99% of each block's subsidy while only matured coinbases are spendable, so it runs with almost no buffer, and any orphaned block it queued a payout for drains that buffer permanently. The 24h retry loop absorbs this -- 0 payouts forfeited -- but the buffer is what needs fixing. (cherry picked from commit e28df01f90d621b0cd818f28d70a20b8ab5d1a8d)
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp
index f84f209..382a008 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1513,7 +1513,7 @@ int CMerkleTx::GetBlocksToMaturity() const
1513{ 1513{
1514 if (!IsCoinBase()) 1514 if (!IsCoinBase())
1515 return 0; 1515 return 0;
1516 return max(0, (COINBASE_MATURITY+20) - GetDepthInMainChain()); 1516 return max(0, COINBASE_SPENDABLE_DEPTH - GetDepthInMainChain());
1517} 1517}
1518 1518
1519 1519
@@ -4812,7 +4812,18 @@ bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew)
4812 { 4812 {
4813 string strError; 4813 string strError;
4814 if (nValue + nFeeRequired > GetBalance()) 4814 if (nValue + nFeeRequired > GetBalance())
4815 strError = strprintf("Error: This is an oversized transaction that requires a transaction fee of %s ", FormatMoney(nFeeRequired).c_str()); 4815 // Not an oversized transaction -- this branch is simply "the
4816 // spendable balance is too small". Saying otherwise (with a fee
4817 // of 0.00, because CreateTransaction failed before setting one)
4818 // sends anyone reading the log after a failed payout hunting a
4819 // transaction-size problem that does not exist.
4820 strError = strprintf("Error: insufficient spendable balance:"
4821 " need %s (plus fee %s) but only %s is spendable"
4822 " -- mined coin counts as zero until it is %d deep",
4823 FormatMoney(nValue).c_str(),
4824 FormatMoney(nFeeRequired).c_str(),
4825 FormatMoney(GetBalance()).c_str(),
4826 COINBASE_SPENDABLE_DEPTH);
4816 else 4827 else
4817 strError = "Error: Transaction creation failed "; 4828 strError = "Error: Transaction creation failed ";
4818 return error("SendMoney() : %s\n", strError.c_str()); 4829 return error("SendMoney() : %s\n", strError.c_str());