Skip to content

Commit b2350a9

Browse files
committed
Add payment sidechain, bug fixes, refactoring, gui
* Added payment sidechain keypair * Fixed several GUI bugs related to multi-sidechain support * Fixed several wallet bugs related to multi-sidechain support * Fixed several validation bugs related to multi-sidechain support
1 parent b9e49de commit b2350a9

17 files changed

Lines changed: 159 additions & 101 deletions

src/Makefile.qt.include

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ RES_ICONS = \
293293
qt/res/icons/remove.png \
294294
qt/res/icons/send.png \
295295
qt/res/icons/sidechain_one.png \
296+
qt/res/icons/sidechain_payments.png \
296297
qt/res/icons/synced.png \
297298
qt/res/icons/transaction0.png \
298299
qt/res/icons/transaction2.png \

src/init.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1786,8 +1786,11 @@ bool AppInitMain()
17861786

17871787
// Watch sidechain deposit addresses
17881788
for (const Sidechain& sidechain : ValidSidechains) {
1789-
std::vector<unsigned char> data(ParseHex(std::string(sidechain.sidechainHex)));
1789+
std::vector<unsigned char> data;
1790+
data = std::vector<unsigned char>(ParseHex(sidechain.sidechainHex));
1791+
17901792
CScript script(data.begin(), data.end());
1793+
17911794
if (!pwallet->HaveWatchOnly(script)) {
17921795
pwallet->AddWatchOnly(script, 0 /* nCreateTime */);
17931796
}

src/primitives/transaction.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -161,28 +161,27 @@ bool CCriticalData::IsBMMRequest(uint8_t& nSidechain, uint16_t& nPrevBlockRef) c
161161
if (bytes[0] != 0x00 || bytes[1] != 0xbf || bytes[2] != 0x00)
162162
return false;
163163

164-
// Convert bytes to script for easy parsing
165-
CScript script(bytes.begin(), bytes.end());
166-
167-
// Get nSidechain
168-
CScript::const_iterator psidechain = script.begin() + 3;
169-
opcodetype opcode;
170-
std::vector<unsigned char> vchSidechain;
171-
if (!script.GetOp(psidechain, opcode, vchSidechain))
172-
return false;
173-
174-
// Is nSidechain valid?
175-
nSidechain = CScriptNum(vchSidechain, true).getint();
176-
if (!IsSidechainNumberValid(nSidechain))
177-
return false;
178-
179-
// Get prevBlockRef
180-
CScript::const_iterator pprevblock = psidechain + vchSidechain.size() + 1;
181-
std::vector<unsigned char> vchPrevBlockRef;
182-
if (!script.GetOp(pprevblock, opcode, vchPrevBlockRef))
183-
return false;
184-
185-
nPrevBlockRef = CScriptNum(vchPrevBlockRef, true).getint();
164+
if (bytes.size() == 4) {
165+
nSidechain = 0;
166+
if (!IsSidechainNumberValid(nSidechain))
167+
return false;
168+
169+
std::vector<unsigned char> vch;
170+
vch.push_back(bytes[3]);
171+
nPrevBlockRef = CScriptNum(vch, false).getint();
172+
173+
} else {
174+
std::vector<unsigned char> vch;
175+
vch.push_back(bytes[3]);
176+
177+
nSidechain = CScriptNum(vch, false).getint();
178+
if (!IsSidechainNumberValid(nSidechain))
179+
return false;
180+
181+
std::vector<unsigned char> vchPrev;
182+
vchPrev.push_back(bytes[4]);
183+
nPrevBlockRef = CScriptNum(vchPrev, false).getint();
184+
}
186185

187186
return true;
188187
}

src/qt/drivenet.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<file alias="overview">res/icons/overview.png</file>
3131
<file alias="export">res/icons/export.png</file>
3232
<file alias="sidechain_one">res/icons/sidechain_one.png</file>
33+
<file alias="sidechain_payments">res/icons/sidechain_payments.png</file>
3334
<file alias="synced">res/icons/synced.png</file>
3435
<file alias="remove">res/icons/remove.png</file>
3536
<file alias="tx_mined">res/icons/tx_mined.png</file>

src/qt/forms/sidechainpage.ui

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,8 @@
5454
<item>
5555
<widget class="QComboBox" name="comboBoxSidechains">
5656
<property name="currentText">
57-
<string>Sidechain One</string>
57+
<string/>
5858
</property>
59-
<item>
60-
<property name="text">
61-
<string>Sidechain One</string>
62-
</property>
63-
</item>
6459
</widget>
6560
</item>
6661
<item>
@@ -180,13 +175,13 @@
180175
<item>
181176
<widget class="QPushButton" name="pushButtonDeposit">
182177
<property name="sizePolicy">
183-
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
178+
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
184179
<horstretch>0</horstretch>
185180
<verstretch>0</verstretch>
186181
</sizepolicy>
187182
</property>
188183
<property name="text">
189-
<string>Deposit</string>
184+
<string/>
190185
</property>
191186
<property name="icon">
192187
<iconset resource="../drivenet.qrc">
328 KB
Loading

src/qt/sidechainpage.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <miner.h>
2222
#include <net.h>
2323
#include <primitives/block.h>
24-
#include <sidechain.h>
2524
#include <txdb.h>
2625
#include <validation.h>
2726
#include <wallet/coincontrol.h>
@@ -48,20 +47,24 @@ SidechainPage::SidechainPage(QWidget *parent) :
4847
for (const Sidechain& s : ValidSidechains) {
4948
QListWidgetItem *item = new QListWidgetItem(ui->listWidgetSidechains);
5049

51-
// TODO keep list of sidechain icons and display correct icon based on nSidechain
5250
// Set icon
53-
QIcon icon(":/icons/sidechain_one");
51+
QIcon icon(SidechainIcons[s.nSidechain]);
5452
item->setIcon(icon);
5553

5654
// Set text
5755
item->setText(QString::fromStdString(s.GetSidechainName()));
5856
QFont font = item->font();
59-
font.setPointSize(22);
57+
font.setPointSize(16);
6058
item->setFont(font);
6159

6260
ui->listWidgetSidechains->addItem(item);
6361
}
6462

63+
// Setup sidechain selection combo box
64+
for (const Sidechain& s : ValidSidechains) {
65+
ui->comboBoxSidechains->addItem(QString::fromStdString(s.GetSidechainName()));
66+
}
67+
6568
// Initialize models
6669
escrowModel = new SidechainEscrowTableModel(this);
6770
withdrawalModel = new SidechainWithdrawalTableModel(this);
@@ -207,7 +210,7 @@ void SidechainPage::on_pushButtonDeposit_clicked()
207210
// Successful deposit message box
208211
messageBox.setWindowTitle("Deposit transaction created!");
209212
QString result = "Deposited to " + QString::fromStdString(GetSidechainName(nSidechain));
210-
result += " Sidechain.\n";
213+
result += "\n";
211214
result += "txid: " + QString::fromStdString(tx->GetHash().ToString());
212215
result += "\n";
213216
result += "Amount deposited: ";
@@ -228,6 +231,24 @@ void SidechainPage::on_pushButtonClear_clicked()
228231
ui->payTo->clear();
229232
}
230233

234+
void SidechainPage::on_comboBoxSidechains_currentIndexChanged(const int i)
235+
{
236+
if (!IsSidechainNumberValid(i))
237+
return;
238+
239+
ui->listWidgetSidechains->setCurrentRow(i);
240+
241+
// Update deposit button text
242+
QString strSidechain = QString::fromStdString(GetSidechainName(i));
243+
QString str = "Deposit to: " + strSidechain;
244+
ui->pushButtonDeposit->setText(str);
245+
}
246+
247+
void SidechainPage::on_listWidgetSidechains_doubleClicked(const QModelIndex& i)
248+
{
249+
ui->comboBoxSidechains->setCurrentIndex(i.row());
250+
}
251+
231252
bool SidechainPage::validateDepositAmount()
232253
{
233254
if (!ui->payAmount->validate()) {

src/qt/sidechainpage.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
#ifndef SIDECHAINPAGE_H
66
#define SIDECHAINPAGE_H
77

8+
#include <QString>
89
#include <QWidget>
910

1011
#include <amount.h>
12+
#include <sidechain.h>
1113
#include <uint256.h>
1214

1315
#include <string>
@@ -22,6 +24,13 @@ namespace Ui {
2224
class SidechainPage;
2325
}
2426

27+
// Sidechain icons
28+
static const std::array<QString, VALID_SIDECHAINS_COUNT> SidechainIcons =
29+
{{
30+
{":/icons/sidechain_one"},
31+
{":/icons/sidechain_payments"},
32+
}};
33+
2534
class SidechainPage : public QWidget
2635
{
2736
Q_OBJECT
@@ -43,6 +52,10 @@ public Q_SLOTS:
4352

4453
void on_pushButtonClear_clicked();
4554

55+
void on_comboBoxSidechains_currentIndexChanged(const int index);
56+
57+
void on_listWidgetSidechains_doubleClicked(const QModelIndex& index);
58+
4659
private:
4760
Ui::SidechainPage *ui;
4861

@@ -54,6 +67,7 @@ public Q_SLOTS:
5467
void SetupTables();
5568

5669
bool validateDepositAmount();
70+
5771
};
5872

5973
#endif // SIDECHAINPAGE_H

src/rpc/misc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -727,8 +727,8 @@ UniValue createbmmcriticaldatatx(const JSONRPCRequest& request)
727727
bytes[1] = 0xbf;
728728
bytes[2] = 0x00;
729729

730-
bytes << CScriptNum::serialize(nSidechain);
731-
bytes << CScriptNum::serialize(nDAG);
730+
bytes << CScriptNum(nSidechain);
731+
bytes << CScriptNum(nDAG);
732732

733733
CCriticalData criticalData;
734734
criticalData.bytes = std::vector<unsigned char>(bytes.begin(), bytes.end());
@@ -800,7 +800,7 @@ UniValue listsidechainctip(const JSONRPCRequest& request)
800800
#endif
801801

802802
// Is nSidechain valid?
803-
uint8_t nSidechain = std::stoi(request.params[0].getValStr());
803+
uint8_t nSidechain = (unsigned int)request.params[0].get_int();
804804
if (!IsSidechainNumberValid(nSidechain))
805805
throw std::runtime_error("Invalid sidechain number");
806806

src/sidechain.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ std::string Sidechain::GetSidechainName() const
2323
switch (nSidechain) {
2424
case SIDECHAIN_ONE:
2525
return "Sidechain One";
26+
case SIDECHAIN_PAYMENT:
27+
return "Payment Sidechain";
2628
default:
2729
break;
2830
}
@@ -166,14 +168,10 @@ bool SCDBIndex::GetMember(uint256 hashWT, SidechainWTPrimeState& wt) const
166168

167169
bool IsSidechainNumberValid(uint8_t nSidechain)
168170
{
169-
if (!(nSidechain < ValidSidechains.size()))
170-
return false;
171-
172-
// Check that number corresponds to a valid sidechain
173-
switch (nSidechain) {
174-
case SIDECHAIN_ONE:
175-
return true;
176-
default:
177-
return false;
171+
for (const Sidechain& s : ValidSidechains) {
172+
if (s.nSidechain == nSidechain)
173+
return true;
178174
}
175+
176+
return false;
179177
}

0 commit comments

Comments
 (0)