Skip to content

Commit f642fd9

Browse files
committed
qt: Modernize 'confirmed' terminology in shown tx status
These days we regard transactions with one confirmation to be 'Confirmed'. Waiting for 6 confirmations is a recommendation but should not keep the transaction shown as unconfirmed. Misc code sanity: - Merge maturity/status enums, they had become completely disjunct - 'confirmed' flag is now called 'countsForBalance' for clarity
1 parent 7ac375d commit f642fd9

File tree

3 files changed

+111
-128
lines changed

3 files changed

+111
-128
lines changed

src/qt/transactionrecord.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx)
164164
(wtx.IsCoinBase() ? 1 : 0),
165165
wtx.nTimeReceived,
166166
idx);
167-
status.confirmed = wtx.IsTrusted();
167+
status.countsForBalance = wtx.IsTrusted() && !(wtx.GetBlocksToMaturity() > 0);
168168
status.depth = wtx.GetDepthInMainChain();
169169
status.cur_num_blocks = chainActive.Height();
170170

@@ -181,52 +181,55 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx)
181181
status.open_for = wtx.nLockTime;
182182
}
183183
}
184-
else
185-
{
186-
if (status.depth < 0)
187-
{
188-
status.status = TransactionStatus::Conflicted;
189-
}
190-
else if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
191-
{
192-
status.status = TransactionStatus::Offline;
193-
}
194-
else if (status.depth < NumConfirmations)
195-
{
196-
status.status = TransactionStatus::Unconfirmed;
197-
}
198-
else
199-
{
200-
status.status = TransactionStatus::HaveConfirmations;
201-
}
202-
}
203-
204184
// For generated transactions, determine maturity
205-
if(type == TransactionRecord::Generated)
185+
else if(type == TransactionRecord::Generated)
206186
{
207-
int64_t nCredit = wtx.GetCredit(true);
208-
if (nCredit == 0)
187+
if (wtx.GetBlocksToMaturity() > 0)
209188
{
210-
status.maturity = TransactionStatus::Immature;
189+
status.status = TransactionStatus::Immature;
211190

212191
if (wtx.IsInMainChain())
213192
{
214193
status.matures_in = wtx.GetBlocksToMaturity();
215194

216195
// Check if the block was requested by anyone
217196
if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
218-
status.maturity = TransactionStatus::MaturesWarning;
197+
status.status = TransactionStatus::MaturesWarning;
219198
}
220199
else
221200
{
222-
status.maturity = TransactionStatus::NotAccepted;
201+
status.status = TransactionStatus::NotAccepted;
223202
}
224203
}
225204
else
226205
{
227-
status.maturity = TransactionStatus::Mature;
206+
status.status = TransactionStatus::Confirmed;
207+
}
208+
}
209+
else
210+
{
211+
if (status.depth < 0)
212+
{
213+
status.status = TransactionStatus::Conflicted;
214+
}
215+
else if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
216+
{
217+
status.status = TransactionStatus::Offline;
218+
}
219+
else if (status.depth == 0)
220+
{
221+
status.status = TransactionStatus::Unconfirmed;
222+
}
223+
else if (status.depth < RecommendedNumConfirmations)
224+
{
225+
status.status = TransactionStatus::Confirming;
226+
}
227+
else
228+
{
229+
status.status = TransactionStatus::Confirmed;
228230
}
229231
}
232+
230233
}
231234

232235
bool TransactionRecord::statusUpdateNeeded()

src/qt/transactionrecord.h

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,32 @@ class TransactionStatus
1919
{
2020
public:
2121
TransactionStatus():
22-
confirmed(false), sortKey(""), maturity(Mature),
22+
countsForBalance(false), sortKey(""),
2323
matures_in(0), status(Offline), depth(0), open_for(0), cur_num_blocks(-1)
2424
{ }
2525

26-
enum Maturity
27-
{
28-
Immature,
29-
Mature,
30-
MaturesWarning, /**< Transaction will likely not mature because no nodes have confirmed */
31-
NotAccepted
32-
};
33-
3426
enum Status {
35-
OpenUntilDate,
36-
OpenUntilBlock,
37-
Offline,
38-
Unconfirmed,
39-
HaveConfirmations,
40-
Conflicted
27+
Confirmed, /**< Have 6 or more confirmations (normal tx) or fully mature (mined tx) **/
28+
/// Normal (sent/received) transactions
29+
OpenUntilDate, /**< Transaction not yet final, waiting for date */
30+
OpenUntilBlock, /**< Transaction not yet final, waiting for block */
31+
Offline, /**< Not sent to any other nodes **/
32+
Unconfirmed, /**< Not yet mined into a block **/
33+
Confirming, /**< Confirmed, but waiting for the recommended number of confirmations **/
34+
Conflicted, /**< Conflicts with other transaction or mempool **/
35+
/// Generated (mined) transactions
36+
Immature, /**< Mined but waiting for maturity */
37+
MaturesWarning, /**< Transaction will likely not mature because no nodes have confirmed */
38+
NotAccepted /**< Mined but not accepted */
4139
};
4240

43-
bool confirmed;
41+
/// Transaction counts towards available balance
42+
bool countsForBalance;
43+
/// Sorting key based on status
4444
std::string sortKey;
4545

4646
/** @name Generated (mined) transactions
4747
@{*/
48-
Maturity maturity;
4948
int matures_in;
5049
/**@}*/
5150

@@ -79,8 +78,8 @@ class TransactionRecord
7978
SendToSelf
8079
};
8180

82-
/** Number of confirmation needed for transaction */
83-
static const int NumConfirmations = 6;
81+
/** Number of confirmation recommended for accepting a transaction */
82+
static const int RecommendedNumConfirmations = 6;
8483

8584
TransactionRecord():
8685
hash(), time(0), type(Other), address(""), debit(0), credit(0), idx(0)

src/qt/transactiontablemodel.cpp

Lines changed: 62 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -285,45 +285,38 @@ QString TransactionTableModel::formatTxStatus(const TransactionRecord *wtx) cons
285285
{
286286
QString status;
287287

288-
if(wtx->type == TransactionRecord::Generated)
288+
switch(wtx->status.status)
289289
{
290-
switch(wtx->status.maturity)
291-
{
292-
case TransactionStatus::Immature:
293-
status = tr("Immature (%1 confirmations, will be available after %2)").arg(wtx->status.depth).arg(wtx->status.depth + wtx->status.matures_in);
294-
break;
295-
case TransactionStatus::Mature:
296-
status = tr("Confirmed (%1 confirmations)").arg(wtx->status.depth);
297-
break;
298-
case TransactionStatus::MaturesWarning:
299-
status = tr("This block was not received by any other nodes and will probably not be accepted!");
300-
break;
301-
case TransactionStatus::NotAccepted:
302-
status = tr("Generated but not accepted");
303-
break;
304-
}
305-
} else {
306-
switch(wtx->status.status)
307-
{
308-
case TransactionStatus::OpenUntilBlock:
309-
status = tr("Open for %n more block(s)","",wtx->status.open_for);
310-
break;
311-
case TransactionStatus::OpenUntilDate:
312-
status = tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx->status.open_for));
313-
break;
314-
case TransactionStatus::Offline:
315-
status = tr("Offline");
316-
break;
317-
case TransactionStatus::Unconfirmed:
318-
status = tr("Unconfirmed (%1 of %2 confirmations)").arg(wtx->status.depth).arg(TransactionRecord::NumConfirmations);
319-
break;
320-
case TransactionStatus::HaveConfirmations:
321-
status = tr("Confirmed (%1 confirmations)").arg(wtx->status.depth);
322-
break;
323-
case TransactionStatus::Conflicted:
324-
status = tr("Conflicted");
325-
break;
326-
}
290+
case TransactionStatus::OpenUntilBlock:
291+
status = tr("Open for %n more block(s)","",wtx->status.open_for);
292+
break;
293+
case TransactionStatus::OpenUntilDate:
294+
status = tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx->status.open_for));
295+
break;
296+
case TransactionStatus::Offline:
297+
status = tr("Offline");
298+
break;
299+
case TransactionStatus::Unconfirmed:
300+
status = tr("Unconfirmed");
301+
break;
302+
case TransactionStatus::Confirming:
303+
status = tr("Confirming (%1 of %2 recommended confirmations)").arg(wtx->status.depth).arg(TransactionRecord::RecommendedNumConfirmations);
304+
break;
305+
case TransactionStatus::Confirmed:
306+
status = tr("Confirmed (%1 confirmations)").arg(wtx->status.depth);
307+
break;
308+
case TransactionStatus::Conflicted:
309+
status = tr("Conflicted");
310+
break;
311+
case TransactionStatus::Immature:
312+
status = tr("Immature (%1 confirmations, will be available after %2)").arg(wtx->status.depth).arg(wtx->status.depth + wtx->status.matures_in);
313+
break;
314+
case TransactionStatus::MaturesWarning:
315+
status = tr("This block was not received by any other nodes and will probably not be accepted!");
316+
break;
317+
case TransactionStatus::NotAccepted:
318+
status = tr("Generated but not accepted");
319+
break;
327320
}
328321

329322
return status;
@@ -441,7 +434,7 @@ QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool
441434
QString str = BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), wtx->credit + wtx->debit);
442435
if(showUnconfirmed)
443436
{
444-
if(!wtx->status.confirmed || wtx->status.maturity != TransactionStatus::Mature)
437+
if(!wtx->status.countsForBalance)
445438
{
446439
str = QString("[") + str + QString("]");
447440
}
@@ -451,46 +444,36 @@ QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool
451444

452445
QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) const
453446
{
454-
if(wtx->type == TransactionRecord::Generated)
455-
{
456-
switch(wtx->status.maturity)
457-
{
458-
case TransactionStatus::Immature: {
459-
int total = wtx->status.depth + wtx->status.matures_in;
460-
int part = (wtx->status.depth * 4 / total) + 1;
461-
return QIcon(QString(":/icons/transaction_%1").arg(part));
462-
}
463-
case TransactionStatus::Mature:
464-
return QIcon(":/icons/transaction_confirmed");
465-
case TransactionStatus::MaturesWarning:
466-
case TransactionStatus::NotAccepted:
467-
return QIcon(":/icons/transaction_0");
468-
}
469-
}
470-
else
447+
switch(wtx->status.status)
471448
{
472-
switch(wtx->status.status)
449+
case TransactionStatus::OpenUntilBlock:
450+
case TransactionStatus::OpenUntilDate:
451+
return QColor(64,64,255);
452+
case TransactionStatus::Offline:
453+
return QColor(192,192,192);
454+
case TransactionStatus::Unconfirmed:
455+
return QIcon(":/icons/transaction_0");
456+
case TransactionStatus::Confirming:
457+
switch(wtx->status.depth)
473458
{
474-
case TransactionStatus::OpenUntilBlock:
475-
case TransactionStatus::OpenUntilDate:
476-
return QColor(64,64,255);
477-
case TransactionStatus::Offline:
478-
return QColor(192,192,192);
479-
case TransactionStatus::Unconfirmed:
480-
switch(wtx->status.depth)
481-
{
482-
case 0: return QIcon(":/icons/transaction_0");
483-
case 1: return QIcon(":/icons/transaction_1");
484-
case 2: return QIcon(":/icons/transaction_2");
485-
case 3: return QIcon(":/icons/transaction_3");
486-
case 4: return QIcon(":/icons/transaction_4");
487-
default: return QIcon(":/icons/transaction_5");
488-
};
489-
case TransactionStatus::HaveConfirmations:
490-
return QIcon(":/icons/transaction_confirmed");
491-
case TransactionStatus::Conflicted:
492-
return QIcon(":/icons/transaction_conflicted");
459+
case 1: return QIcon(":/icons/transaction_1");
460+
case 2: return QIcon(":/icons/transaction_2");
461+
case 3: return QIcon(":/icons/transaction_3");
462+
case 4: return QIcon(":/icons/transaction_4");
463+
default: return QIcon(":/icons/transaction_5");
464+
};
465+
case TransactionStatus::Confirmed:
466+
return QIcon(":/icons/transaction_confirmed");
467+
case TransactionStatus::Conflicted:
468+
return QIcon(":/icons/transaction_conflicted");
469+
case TransactionStatus::Immature: {
470+
int total = wtx->status.depth + wtx->status.matures_in;
471+
int part = (wtx->status.depth * 4 / total) + 1;
472+
return QIcon(QString(":/icons/transaction_%1").arg(part));
493473
}
474+
case TransactionStatus::MaturesWarning:
475+
case TransactionStatus::NotAccepted:
476+
return QIcon(":/icons/transaction_0");
494477
}
495478
return QColor(0,0,0);
496479
}
@@ -557,8 +540,8 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
557540
case Qt::TextAlignmentRole:
558541
return column_alignments[index.column()];
559542
case Qt::ForegroundRole:
560-
// Non-confirmed transactions are grey
561-
if(!rec->status.confirmed)
543+
// Non-confirmed (but not immature) as transactions are grey
544+
if(!rec->status.countsForBalance && rec->status.status != TransactionStatus::Immature)
562545
{
563546
return COLOR_UNCONFIRMED;
564547
}
@@ -586,9 +569,7 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
586569
case TxIDRole:
587570
return rec->getTxID();
588571
case ConfirmedRole:
589-
// Return True if transaction counts for balance
590-
return rec->status.confirmed && !(rec->type == TransactionRecord::Generated &&
591-
rec->status.maturity != TransactionStatus::Mature);
572+
return rec->status.countsForBalance;
592573
case FormattedAmountRole:
593574
return formatTxAmount(rec, false);
594575
case StatusRole:

0 commit comments

Comments
 (0)