Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
17491eb
refactor: drop `emitCoinJoinEnabledChanged()`, use `setOption()` instead
kwvg Jan 28, 2026
2deba78
refactor: improve CoinJoin tab nullptr checks, bail-out condition
kwvg Jan 21, 2026
8a0907c
move-only: move `subFeeFromAmount` into `verticalLayout_2`
kwvg Jan 18, 2026
45da71c
chore: enforce alphabetical sorting in `src/Makefile.qt.include`
kwvg Jan 20, 2026
c8558b8
refactor: add `getScaledFont` helper, keep `getFont` internal
kwvg Jan 22, 2026
1c7cfcc
refactor: add `pruneStaleEntities` helper to deduplicate pruning
kwvg Jan 20, 2026
fa48b81
move-only: split proposal model out to `src/qt/proposalmodel.{cpp,h}`
kwvg Jan 28, 2026
a709391
fix: use `unique_ptr` and more bounds checking in `qt/proposalmodel`
kwvg Jan 22, 2026
ae70706
refactor: drop `QObject` inheritance, precalculate hash string
kwvg Jan 22, 2026
8a7f4e9
qt: add styling support for QTextEdit `<b>` and `<h{1-3}>` elements
kwvg Jan 28, 2026
804a239
qt: use show/hide for "Governance" tab to avoid client restart
kwvg Jan 21, 2026
ef0a787
refactor: track "Governance" tab show/hide in `OptionsModel`
kwvg Jan 21, 2026
765213c
qt: use show/hide for "Masternodes" tab to avoid client restart
kwvg Jan 21, 2026
a4d51e2
refactor: track "Masternodes" tab show/hide in `OptionsModel`
kwvg Jan 21, 2026
8265b49
refactor: repurpose `transactiondescdialog` as a generic desc. container
kwvg Jan 22, 2026
bd2979b
qt: reorder columns in "Governance" tab, make width elastic for key cols
kwvg Jan 22, 2026
4166586
qt: change layout of "Governance" tab controls for readability
kwvg Jan 24, 2026
d24ecbb
qt: report compact voting status and expanded details in tooltip
kwvg Jan 22, 2026
db6deb7
qt: use monospace font for hashes in "Governance" tab
kwvg Jan 22, 2026
86b9f5e
qt: report proposal info using QTextEdit instead of an alert with JSON
kwvg Jan 22, 2026
f4bd648
qt: report more proposal information in description, calculate payments
kwvg Jan 22, 2026
5473a74
qt: cleanup proposal context menu, add copy JSON and visit URL options
kwvg Jan 22, 2026
2feba7f
qt: replace "Active" column with icons that reflect lifecycle status
kwvg Jan 24, 2026
9f2d8dc
qt: increment in-progress icon progression based on time within cycle
kwvg Jan 24, 2026
86063b3
fix: pre-calculate icons to avoid resize stutter
kwvg Jan 24, 2026
7b72a2f
qt: list locally recorded proposals in "Governance" tab
kwvg Jan 22, 2026
af9f09f
qt: add blank canvas if there's no proposals to display
kwvg Jan 22, 2026
6d0bc31
qt: adjust layout of details page of proposal wizard to resemble DGT
kwvg Jan 20, 2026
4a75714
qt: drop JSON/hex confirmation page, use description dialogs instead
kwvg Jan 21, 2026
4014ea0
qt: use `SendConfirmationDialog` instead of `QMessageBox` for confirm
kwvg Jan 20, 2026
a45de4c
qt: remove remaining pages from proposal wizard
kwvg Jan 20, 2026
d386673
qt: add "Resume Proposal" button for post-confirmation broadcast
kwvg Jan 22, 2026
781c4b3
qt: disable proposal buttons until synced, creation button w/o funds
kwvg Jan 21, 2026
55cc251
qt: simplify `reconcile()` routine, discard old data wholesale.
kwvg Jan 24, 2026
de9cb71
refactor: `qt/proposalwizard.{cpp,h}` -> `qt/proposalcreate.{cpp,h}`
kwvg Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 66 additions & 59 deletions src/Makefile.qt.include
Original file line number Diff line number Diff line change
Expand Up @@ -20,33 +20,33 @@ QT_FORMS_UI = \
qt/forms/askpassphrasedialog.ui \
qt/forms/coincontroldialog.ui \
qt/forms/createwalletdialog.ui \
qt/forms/debugwindow.ui \
qt/forms/descriptiondialog.ui \
qt/forms/editaddressdialog.ui \
qt/forms/governancelist.ui \
qt/forms/proposalwizard.ui \
qt/forms/helpmessagedialog.ui \
qt/forms/intro.ui \
qt/forms/modaloverlay.ui \
qt/forms/masternodelist.ui \
qt/forms/mnemonicverificationdialog.ui \
qt/forms/qrdialog.ui \
qt/forms/modaloverlay.ui \
qt/forms/openuridialog.ui \
qt/forms/optionsdialog.ui \
qt/forms/overviewpage.ui \
qt/forms/proposalcreate.ui \
qt/forms/proposalresume.ui \
qt/forms/psbtoperationsdialog.ui \
qt/forms/qrdialog.ui \
qt/forms/receivecoinsdialog.ui \
qt/forms/receiverequestdialog.ui \
qt/forms/debugwindow.ui \
qt/forms/sendcoinsdialog.ui \
qt/forms/sendcoinsentry.ui \
qt/forms/signverifymessagedialog.ui \
qt/forms/transactiondescdialog.ui
qt/forms/signverifymessagedialog.ui

QT_MOC_CPP = \
qt/moc_addressbookpage.cpp \
qt/moc_addresstablemodel.cpp \
qt/moc_appearancewidget.cpp \
qt/moc_askpassphrasedialog.cpp \
qt/moc_createwalletdialog.cpp \
qt/moc_bantablemodel.cpp \
qt/moc_bitcoin.cpp \
qt/moc_bitcoinaddressvalidator.cpp \
Expand All @@ -56,26 +56,30 @@ QT_MOC_CPP = \
qt/moc_clientmodel.cpp \
qt/moc_coincontroldialog.cpp \
qt/moc_coincontroltreewidget.cpp \
qt/moc_createwalletdialog.cpp \
qt/moc_csvmodelwriter.cpp \
qt/moc_descriptiondialog.cpp \
qt/moc_editaddressdialog.cpp \
qt/moc_governancelist.cpp \
qt/moc_proposalwizard.cpp \
qt/moc_guiutil.cpp \
qt/moc_initexecutor.cpp \
qt/moc_intro.cpp \
qt/moc_macdockiconhandler.cpp \
qt/moc_macnotificationhandler.cpp \
qt/moc_modaloverlay.cpp \
qt/moc_masternodelist.cpp \
qt/moc_mnemonicverificationdialog.cpp \
qt/moc_modaloverlay.cpp \
qt/moc_notificator.cpp \
qt/moc_openuridialog.cpp \
qt/moc_optionsdialog.cpp \
qt/moc_optionsmodel.cpp \
qt/moc_overviewpage.cpp \
qt/moc_paymentserver.cpp \
qt/moc_peertablemodel.cpp \
qt/moc_peertablesortproxy.cpp \
qt/moc_paymentserver.cpp \
qt/moc_proposalmodel.cpp \
qt/moc_proposalcreate.cpp \
qt/moc_proposalresume.cpp \
qt/moc_psbtoperationsdialog.cpp \
qt/moc_qrdialog.cpp \
qt/moc_qrimagewidget.cpp \
Expand All @@ -91,7 +95,6 @@ QT_MOC_CPP = \
qt/moc_splashscreen.cpp \
qt/moc_trafficgraphwidget.cpp \
qt/moc_transactiondesc.cpp \
qt/moc_transactiondescdialog.cpp \
qt/moc_transactionfilterproxy.cpp \
qt/moc_transactionoverviewwidget.cpp \
qt/moc_transactiontablemodel.cpp \
Expand Down Expand Up @@ -134,9 +137,9 @@ BITCOIN_QT_H = \
qt/coincontroltreewidget.h \
qt/createwalletdialog.h \
qt/csvmodelwriter.h \
qt/descriptiondialog.h \
qt/editaddressdialog.h \
qt/governancelist.h \
qt/proposalwizard.h \
qt/guiconstants.h \
qt/guiutil.h \
qt/guiutil_font.h \
Expand All @@ -145,9 +148,9 @@ BITCOIN_QT_H = \
qt/macdockiconhandler.h \
qt/macnotificationhandler.h \
qt/macos_appnap.h \
qt/modaloverlay.h \
qt/masternodelist.h \
qt/mnemonicverificationdialog.h \
qt/modaloverlay.h \
qt/networkstyle.h \
qt/notificator.h \
qt/openuridialog.h \
Expand All @@ -157,6 +160,9 @@ BITCOIN_QT_H = \
qt/paymentserver.h \
qt/peertablemodel.h \
qt/peertablesortproxy.h \
qt/proposalcreate.h \
qt/proposalmodel.h \
qt/proposalresume.h \
qt/psbtoperationsdialog.h \
qt/qrdialog.h \
qt/qrimagewidget.h \
Expand All @@ -174,7 +180,6 @@ BITCOIN_QT_H = \
qt/trafficgraphdata.h \
qt/trafficgraphwidget.h \
qt/transactiondesc.h \
qt/transactiondescdialog.h \
qt/transactionfilterproxy.h \
qt/transactionoverviewwidget.h \
qt/transactionrecord.h \
Expand All @@ -189,36 +194,36 @@ BITCOIN_QT_H = \
qt/winshutdownmonitor.h

QT_RES_ICONS = \
qt/res/icons/dash.ico \
qt/res/icons/dash_testnet.ico \
qt/res/icons/dash.png \
qt/res/icons/warning.png \
qt/res/icons/address-book.png \
qt/res/icons/transaction0.png \
qt/res/icons/transaction1.png \
qt/res/icons/transaction2.png \
qt/res/icons/transaction3.png \
qt/res/icons/transaction4.png \
qt/res/icons/transaction5.png \
qt/res/icons/transaction_abandoned.png \
qt/res/icons/transaction_locked.png \
qt/res/icons/connect1_16.png \
qt/res/icons/connect2_16.png \
qt/res/icons/connect3_16.png \
qt/res/icons/connect4_16.png \
qt/res/icons/dash.ico \
qt/res/icons/dash.png \
qt/res/icons/dash_testnet.ico \
qt/res/icons/editcopy.png \
qt/res/icons/editpaste.png \
qt/res/icons/eye.png \
qt/res/icons/eye_minus.png \
qt/res/icons/eye_plus.png \
qt/res/icons/fontbigger.png \
qt/res/icons/fontsmaller.png \
qt/res/icons/hd_enabled.png \
qt/res/icons/lock_closed.png \
qt/res/icons/lock_open.png \
qt/res/icons/proxy.png \
qt/res/icons/remove.png \
qt/res/icons/synced.png \
qt/res/icons/fontbigger.png \
qt/res/icons/fontsmaller.png
qt/res/icons/transaction0.png \
qt/res/icons/transaction1.png \
qt/res/icons/transaction2.png \
qt/res/icons/transaction3.png \
qt/res/icons/transaction4.png \
qt/res/icons/transaction5.png \
qt/res/icons/transaction_abandoned.png \
qt/res/icons/transaction_locked.png \
qt/res/icons/warning.png

BITCOIN_QT_BASE_CPP = \
qt/appearancewidget.cpp \
Expand Down Expand Up @@ -258,14 +263,17 @@ BITCOIN_QT_WALLET_CPP = \
qt/coincontroldialog.cpp \
qt/coincontroltreewidget.cpp \
qt/createwalletdialog.cpp \
qt/descriptiondialog.cpp \
qt/editaddressdialog.cpp \
qt/governancelist.cpp \
qt/proposalwizard.cpp \
qt/masternodelist.cpp \
qt/mnemonicverificationdialog.cpp \
qt/openuridialog.cpp \
qt/overviewpage.cpp \
qt/paymentserver.cpp \
qt/proposalcreate.cpp \
qt/proposalmodel.cpp \
qt/proposalresume.cpp \
qt/psbtoperationsdialog.cpp \
qt/qrdialog.cpp \
qt/qrimagewidget.cpp \
Expand All @@ -276,7 +284,6 @@ BITCOIN_QT_WALLET_CPP = \
qt/sendcoinsentry.cpp \
qt/signverifymessagedialog.cpp \
qt/transactiondesc.cpp \
qt/transactiondescdialog.cpp \
qt/transactionfilterproxy.cpp \
qt/transactionoverviewwidget.cpp \
qt/transactionrecord.cpp \
Expand All @@ -301,50 +308,50 @@ QT_RES_IMAGES = \
qt/res/images/arrow_down_light.png \
qt/res/images/arrow_left_dark.png \
qt/res/images/arrow_left_light.png \
qt/res/images/arrow_right_dark.png \
qt/res/images/arrow_right_light.png \
qt/res/images/arrow_up_dark.png \
qt/res/images/arrow_up_light.png \
qt/res/images/arrow_light_down_normal.png \
qt/res/images/arrow_light_down_hover.png \
qt/res/images/arrow_light_left_normal.png \
qt/res/images/arrow_light_down_normal.png \
qt/res/images/arrow_light_left_hover.png \
qt/res/images/arrow_light_right_normal.png \
qt/res/images/arrow_light_left_normal.png \
qt/res/images/arrow_light_right_hover.png \
qt/res/images/arrow_light_up_normal.png \
qt/res/images/arrow_light_right_normal.png \
qt/res/images/arrow_light_up_hover.png \
qt/res/images/checkbox_normal_dark.png \
qt/res/images/checkbox_normal_hover_dark.png \
qt/res/images/checkbox_normal_disabled_dark.png \
qt/res/images/arrow_light_up_normal.png \
qt/res/images/arrow_right_dark.png \
qt/res/images/arrow_right_light.png \
qt/res/images/arrow_up_dark.png \
qt/res/images/arrow_up_light.png \
qt/res/images/checkbox_checked_dark.png \
qt/res/images/checkbox_checked_hover_dark.png \
qt/res/images/checkbox_checked_disabled_dark.png \
qt/res/images/checkbox_checked_disabled_light.png \
qt/res/images/checkbox_checked_hover_dark.png \
qt/res/images/checkbox_checked_hover_light.png \
qt/res/images/checkbox_checked_light.png \
qt/res/images/checkbox_normal_dark.png \
qt/res/images/checkbox_normal_disabled_dark.png \
qt/res/images/checkbox_normal_disabled_light.png \
qt/res/images/checkbox_normal_hover_dark.png \
qt/res/images/checkbox_normal_hover_light.png \
qt/res/images/checkbox_normal_light.png \
qt/res/images/checkbox_partly_checked_dark.png \
qt/res/images/checkbox_partly_checked_hover_dark.png \
qt/res/images/checkbox_partly_checked_disabled_dark.png \
qt/res/images/checkbox_normal_light.png \
qt/res/images/checkbox_normal_hover_light.png \
qt/res/images/checkbox_normal_disabled_light.png \
qt/res/images/checkbox_checked_light.png \
qt/res/images/checkbox_checked_hover_light.png \
qt/res/images/checkbox_checked_disabled_light.png \
qt/res/images/checkbox_partly_checked_light.png \
qt/res/images/checkbox_partly_checked_hover_light.png \
qt/res/images/checkbox_partly_checked_disabled_light.png \
qt/res/images/checkbox_partly_checked_hover_dark.png \
qt/res/images/checkbox_partly_checked_hover_light.png \
qt/res/images/checkbox_partly_checked_light.png \
qt/res/images/dash_logo_toolbar.png \
qt/res/images/dash_logo_toolbar_blue.png \
qt/res/images/radio_normal_dark.png \
qt/res/images/radio_normal_hover_dark.png \
qt/res/images/radio_checked_dark.png \
qt/res/images/radio_checked_hover_dark.png \
qt/res/images/radio_normal_disabled_dark.png \
qt/res/images/radio_checked_disabled_dark.png \
qt/res/images/radio_normal_light.png \
qt/res/images/radio_normal_hover_light.png \
qt/res/images/radio_checked_light.png \
qt/res/images/radio_checked_disabled_light.png \
qt/res/images/radio_checked_hover_dark.png \
qt/res/images/radio_checked_hover_light.png \
qt/res/images/radio_checked_light.png \
qt/res/images/radio_normal_dark.png \
qt/res/images/radio_normal_disabled_dark.png \
qt/res/images/radio_normal_disabled_light.png \
qt/res/images/radio_checked_disabled_light.png \
qt/res/images/radio_normal_hover_dark.png \
qt/res/images/radio_normal_hover_light.png \
qt/res/images/radio_normal_light.png \
qt/res/images/splash.png

QT_RES_CSS = \
Expand Down
5 changes: 5 additions & 0 deletions src/interfaces/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,11 @@ class GOV
virtual ~GOV() {}
virtual void getAllNewerThan(std::vector<CGovernanceObject> &objs, int64_t nMoreThanTime) = 0;
virtual int32_t getObjAbsYesCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) = 0;
virtual int32_t getObjYesCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) = 0;
virtual int32_t getObjNoCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) = 0;
virtual int32_t getObjAbstainCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) = 0;
virtual bool getObjLocalValidity(const CGovernanceObject& obj, std::string& error, bool check_collateral) = 0;
virtual bool existsObj(const uint256& hash) = 0;
virtual bool isEnabled() = 0;
virtual bool processVoteAndRelay(const CGovernanceVote& vote, std::string& error) = 0;
struct GovernanceInfo {
Expand All @@ -150,6 +154,7 @@ class GOV
int requiredConfs{6};
};
virtual GovernanceInfo getGovernanceInfo() = 0;
virtual std::optional<int32_t> getProposalFundedHeight(const uint256& proposal_hash) = 0;
virtual std::optional<CGovernanceObject> createProposal(int32_t revision, int64_t created_time,
const std::string& data_hex, std::string& error) = 0;
virtual bool submitProposal(const uint256& parent, int32_t revision, int64_t created_time, const std::string& data_hex,
Expand Down
51 changes: 44 additions & 7 deletions src/node/interfaces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,34 @@ class GOVImpl : public GOV
}
return 0;
}
int32_t getObjAbstainCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) override
{
if (context().govman != nullptr && context().dmnman != nullptr) {
return obj.GetAbstainCount(context().dmnman->GetListAtChainTip(), vote_signal);
}
return 0;
}
int32_t getObjYesCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) override
{
if (context().govman != nullptr && context().dmnman != nullptr) {
return obj.GetYesCount(context().dmnman->GetListAtChainTip(), vote_signal);
}
return 0;
}
int32_t getObjNoCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) override
{
if (context().govman != nullptr && context().dmnman != nullptr) {
return obj.GetNoCount(context().dmnman->GetListAtChainTip(), vote_signal);
}
return 0;
}
bool existsObj(const uint256& hash) override
{
if (context().govman != nullptr) {
return context().govman->HaveObjectForHash(hash);
}
return false;
}
bool getObjLocalValidity(const CGovernanceObject& obj, std::string& error, bool check_collateral) override
{
if (context().govman != nullptr && context().chainman != nullptr && context().dmnman != nullptr) {
Expand Down Expand Up @@ -271,13 +299,7 @@ class GOVImpl : public GOV
const Consensus::Params& consensusParams = Params().GetConsensus();

if (ctx.chainman) {
const CBlockIndex* tip = WITH_LOCK(::cs_main, return ctx.chainman->ActiveChain().Tip());
int last = 0;
int next = 0;
const int height = tip ? tip->nHeight : 0;
CSuperblock::GetNearestSuperblocksHeights(height, last, next);
info.lastsuperblock = last;
info.nextsuperblock = next;
CSuperblock::GetNearestSuperblocksHeights(ctx.chainman->ActiveHeight(), info.lastsuperblock, info.nextsuperblock);
}
info.proposalfee = GOVERNANCE_PROPOSAL_FEE_TX;
info.superblockcycle = consensusParams.nSuperblockCycle;
Expand All @@ -292,6 +314,21 @@ class GOVImpl : public GOV
}
return info;
}
std::optional<int32_t> getProposalFundedHeight(const uint256& proposal_hash) override
{
if (context().govman != nullptr && context().chainman != nullptr) {
const int32_t nTipHeight = context().chainman->ActiveHeight();
for (const auto& trigger : context().govman->GetActiveTriggers()) {
if (!trigger || trigger->GetBlockHeight() > nTipHeight) continue;
for (const auto& hash : trigger->GetProposalHashes()) {
if (hash == proposal_hash) {
return trigger->GetBlockHeight();
}
}
}
}
return std::nullopt;
}
std::optional<CGovernanceObject> createProposal(int32_t revision, int64_t created_time,
const std::string& data_hex, std::string& error) override
{
Expand Down
Loading
Loading