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