1 #include <qt/stakepage.h>
2 #include <qt/forms/ui_stakepage.h>
3
4 #include <qt/bitcoinunits.h>
5 #include <qt/clientmodel.h>
6 #include <qt/guiconstants.h>
7 #include <qt/guiutil.h>
8 #include <qt/optionsmodel.h>
9 #include <qt/platformstyle.h>
10 #include <qt/transactionfilterproxy.h>
11 #include <qt/transactiontablemodel.h>
12 #include <qt/walletmodel.h>
13 #include <interfaces/wallet.h>
14 #include <interfaces/node.h>
15 #include <qt/transactiondescdialog.h>
16 #include <qt/styleSheet.h>
17 #include <qt/transactionview.h>
18 #include <amount.h>
19
20 #include <miner.h>
21
22 #include <QSortFilterProxyModel>
23
Q_DECLARE_METATYPE(interfaces::WalletBalances)24 Q_DECLARE_METATYPE(interfaces::WalletBalances)
25
26 StakePage::StakePage(const PlatformStyle *_platformStyle, QWidget *parent) :
27 QWidget(parent),
28 ui(new Ui::StakePage),
29 clientModel(nullptr),
30 walletModel(nullptr),
31 platformStyle(_platformStyle),
32 transactionView(0),
33 m_subsidy(0),
34 m_networkWeight(0),
35 m_expectedAnnualROI(0)
36 {
37 ui->setupUi(this);
38 ui->checkStake->setEnabled(gArgs.GetBoolArg("-staking", DEFAULT_STAKE));
39 transactionView = new TransactionView(platformStyle, this, true);
40 ui->frameStakeRecords->layout()->addWidget(transactionView);
41 }
42
~StakePage()43 StakePage::~StakePage()
44 {
45 delete ui;
46 }
47
setClientModel(ClientModel * _clientModel)48 void StakePage::setClientModel(ClientModel *_clientModel)
49 {
50 this->clientModel = _clientModel;
51
52 if (_clientModel) {
53 connect(_clientModel, &ClientModel::numBlocksChanged, this, &StakePage::numBlocksChanged);
54 int height = _clientModel->node().getNumBlocks();
55 ui->labelHeight->setText(QString::number(height));
56 m_subsidy = _clientModel->node().getBlockSubsidy(height);
57 m_networkWeight = _clientModel->node().getNetworkStakeWeight();
58 m_expectedAnnualROI = _clientModel->node().getEstimatedAnnualROI();
59 updateNetworkWeight();
60 updateAnnualROI();
61 }
62 }
63
setWalletModel(WalletModel * model)64 void StakePage::setWalletModel(WalletModel *model)
65 {
66 this->walletModel = model;
67 if(model && model->getOptionsModel())
68 {
69 transactionView->setModel(model);
70 transactionView->chooseType(6);
71 ui->checkStake->setChecked(model->wallet().getEnabledStaking());
72
73 // Keep up to date with wallet
74 interfaces::Wallet& wallet = model->wallet();
75 interfaces::WalletBalances balances = wallet.getBalances();
76 setBalance(balances);
77 connect(model, &WalletModel::balanceChanged, this, &StakePage::setBalance);
78
79 connect(model->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &StakePage::updateDisplayUnit);
80 }
81
82 // update the display unit, to not use the default ("BTC")
83 updateDisplayUnit();
84 }
85
setBalance(const interfaces::WalletBalances & balances)86 void StakePage::setBalance(const interfaces::WalletBalances& balances)
87 {
88 int unit = walletModel->getOptionsModel()->getDisplayUnit();
89 m_balances = balances;
90 ui->labelAssets->setText(BitcoinUnits::formatWithUnit(unit, balances.balance, false, BitcoinUnits::separatorAlways));
91 ui->labelStake->setText(BitcoinUnits::formatWithUnit(unit, balances.stake, false, BitcoinUnits::separatorAlways));
92 }
93
on_checkStake_clicked(bool checked)94 void StakePage::on_checkStake_clicked(bool checked)
95 {
96 if(!walletModel)
97 return;
98
99 this->walletModel->wallet().setEnabledStaking(checked);
100
101 if(checked && WalletModel::Locked == walletModel->getEncryptionStatus())
102 Q_EMIT requireUnlock(true);
103 }
104
updateDisplayUnit()105 void StakePage::updateDisplayUnit()
106 {
107 if(walletModel && walletModel->getOptionsModel())
108 {
109 if (m_balances.balance != -1) {
110 setBalance(m_balances);
111 }
112 updateSubsidy();
113 }
114 }
115
numBlocksChanged(int count,const QDateTime &,double,bool headers)116 void StakePage::numBlocksChanged(int count, const QDateTime &, double, bool headers)
117 {
118 if(!headers && clientModel && walletModel)
119 {
120 ui->labelHeight->setText(BitcoinUnits::formatInt(count));
121 m_subsidy = clientModel->node().getBlockSubsidy(count);
122 m_networkWeight = clientModel->node().getNetworkStakeWeight();
123 m_expectedAnnualROI = clientModel->node().getEstimatedAnnualROI();
124 updateSubsidy();
125 updateNetworkWeight();
126 updateAnnualROI();
127 }
128 }
129
updateSubsidy()130 void StakePage::updateSubsidy()
131 {
132 int unit = walletModel->getOptionsModel()->getDisplayUnit();
133 QString strSubsidy = BitcoinUnits::formatWithUnit(unit, m_subsidy, false, BitcoinUnits::separatorAlways) + "/Block";
134 ui->labelReward->setText(strSubsidy);
135 }
136
updateNetworkWeight()137 void StakePage::updateNetworkWeight()
138 {
139 ui->labelWeight->setText(BitcoinUnits::formatInt(m_networkWeight / COIN));
140 }
141
updateAnnualROI()142 void StakePage::updateAnnualROI()
143 {
144 ui->labelROI->setText(QString::number(m_expectedAnnualROI, 'f', 2) + "%");
145 }
146
updateEncryptionStatus()147 void StakePage::updateEncryptionStatus()
148 {
149 if(!walletModel)
150 return;
151
152 int status = walletModel->getEncryptionStatus();
153 switch(status)
154 {
155 case WalletModel::Unlocked:
156 if(walletModel->wallet().getEnabledStaking())
157 {
158 bool checked = ui->checkStake->isChecked();
159 if(!checked) ui->checkStake->onStatusChanged();
160 }
161 break;
162 case WalletModel::Locked:
163 if(!walletModel->getWalletUnlockStakingOnly())
164 {
165 bool checked = ui->checkStake->isChecked();
166 if(checked) ui->checkStake->onStatusChanged();
167 }
168 break;
169 }
170 }
171