adityapk00
6 years ago
committed by
GitHub
22 changed files with 1490 additions and 102 deletions
@ -0,0 +1,369 @@ |
|||
#include "turnstile.h" |
|||
#include "mainwindow.h" |
|||
#include "unspentoutput.h" |
|||
#include "rpc.h" |
|||
#include "utils.h" |
|||
#include "settings.h" |
|||
|
|||
#include "precompiled.h" |
|||
|
|||
using json = nlohmann::json; |
|||
|
|||
Turnstile::Turnstile(RPC* _rpc, MainWindow* mainwindow) { |
|||
this->rpc = _rpc; |
|||
this->mainwindow = mainwindow; |
|||
} |
|||
|
|||
Turnstile::~Turnstile() { |
|||
} |
|||
|
|||
void printPlan(QList<TurnstileMigrationItem> plan) { |
|||
for (auto item : plan) { |
|||
//qDebug() << item.fromAddr << item.intTAddr
|
|||
// << item.destAddr << item.amount << item.blockNumber << item.status;
|
|||
} |
|||
} |
|||
|
|||
QString Turnstile::writeableFile() { |
|||
auto filename = QStringLiteral("turnstilemigrationplan.dat"); |
|||
|
|||
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); |
|||
if (!dir.exists()) |
|||
QDir().mkpath(dir.absolutePath()); |
|||
|
|||
if (Settings::getInstance()->isTestnet()) { |
|||
return dir.filePath("testnet-" % filename); |
|||
} else { |
|||
return dir.filePath(filename); |
|||
} |
|||
} |
|||
|
|||
void Turnstile::removeFile() { |
|||
QFile(writeableFile()).remove(); |
|||
} |
|||
|
|||
// Data stream write/read methods for migration items
|
|||
QDataStream &operator<<(QDataStream& ds, const TurnstileMigrationItem& item) { |
|||
return ds << QString("v1") << item.fromAddr << item.intTAddr |
|||
<< item.destAddr << item.amount << item.blockNumber << item.status; |
|||
} |
|||
|
|||
QDataStream &operator>>(QDataStream& ds, TurnstileMigrationItem& item) { |
|||
QString version; |
|||
return ds >> version >> item.fromAddr >> item.intTAddr |
|||
>> item.destAddr >> item.amount >> item.blockNumber >> item.status; |
|||
} |
|||
|
|||
void Turnstile::writeMigrationPlan(QList<TurnstileMigrationItem> plan) { |
|||
//qDebug() << QString("Writing plan");
|
|||
printPlan(plan); |
|||
|
|||
QFile file(writeableFile()); |
|||
file.open(QIODevice::ReadWrite | QIODevice::Truncate); |
|||
QDataStream out(&file); // we will serialize the data into the file
|
|||
out << plan; |
|||
file.close(); |
|||
} |
|||
|
|||
QList<TurnstileMigrationItem> Turnstile::readMigrationPlan() { |
|||
QFile file(writeableFile()); |
|||
|
|||
QList<TurnstileMigrationItem> plan; |
|||
if (!file.exists()) return plan; |
|||
|
|||
file.open(QIODevice::ReadOnly); |
|||
QDataStream in(&file); // read the data serialized from the file
|
|||
in >> plan; |
|||
|
|||
file.close(); |
|||
|
|||
// Sort to see when the next step is.
|
|||
std::sort(plan.begin(), plan.end(), [&] (auto a, auto b) { |
|||
return a.blockNumber < b.blockNumber; |
|||
}); |
|||
|
|||
return plan; |
|||
} |
|||
|
|||
void Turnstile::planMigration(QString zaddr, QString destAddr, int numsplits, int numBlocks) { |
|||
// First, get the balance and split up the amounts
|
|||
auto bal = rpc->getAllBalances()->value(zaddr); |
|||
auto splits = splitAmount(bal, numsplits); |
|||
|
|||
// Then, generate an intermediate t-Address for each part using getBatchRPC
|
|||
rpc->getBatchRPC<double>(splits, |
|||
[=] (double /*unused*/) { |
|||
json payload = { |
|||
{"jsonrpc", "1.0"}, |
|||
{"id", "someid"}, |
|||
{"method", "getnewaddress"}, |
|||
}; |
|||
return payload; |
|||
}, |
|||
[=] (QMap<double, json>* newAddrs) { |
|||
// Get block numbers
|
|||
auto curBlock = Settings::getInstance()->getBlockNumber(); |
|||
auto blockNumbers = getBlockNumbers(curBlock, curBlock + numBlocks, splits.size()); |
|||
|
|||
// Assign the amounts to the addresses.
|
|||
QList<TurnstileMigrationItem> migItems; |
|||
|
|||
for (int i=0; i < splits.size(); i++) { |
|||
auto tAddr = newAddrs->values()[i].get<json::string_t>(); |
|||
auto item = TurnstileMigrationItem { zaddr, QString::fromStdString(tAddr), destAddr, |
|||
blockNumbers[i], splits[i], |
|||
TurnstileMigrationItemStatus::NotStarted }; |
|||
migItems.push_back(item); |
|||
} |
|||
|
|||
// The first migration is shifted to the current block, so the user sees something
|
|||
// happening immediately
|
|||
if (migItems.size() == 0) { |
|||
// Show error and abort
|
|||
QMessageBox::warning(mainwindow, |
|||
"Locked funds", "Could not initiate migration.\nYou either have unconfirmed funds or the balance is too low for an automatic migration."); |
|||
return; |
|||
} |
|||
|
|||
migItems[0].blockNumber = curBlock; |
|||
|
|||
std::sort(migItems.begin(), migItems.end(), [&] (auto a, auto b) { |
|||
return a.blockNumber < b.blockNumber; |
|||
}); |
|||
|
|||
writeMigrationPlan(migItems); |
|||
rpc->refresh(true); // Force refresh, to start the migration immediately
|
|||
} |
|||
); |
|||
} |
|||
|
|||
|
|||
QList<int> Turnstile::getBlockNumbers(int start, int end, int count) { |
|||
QList<int> blocks; |
|||
// Generate 'count' numbers between [start, end]
|
|||
for (int i=0; i < count; i++) { |
|||
auto blk = (std::rand() % (end - start)) + start; |
|||
blocks.push_back(blk); |
|||
} |
|||
|
|||
return blocks; |
|||
} |
|||
|
|||
// Need at least 0.0005 ZEC for this
|
|||
double Turnstile::minMigrationAmount = 0.0005; |
|||
|
|||
QList<double> Turnstile::splitAmount(double amount, int parts) { |
|||
QList<double> amounts; |
|||
|
|||
if (amount < minMigrationAmount) |
|||
return amounts; |
|||
|
|||
fillAmounts(amounts, amount, parts); |
|||
//qDebug() << amounts;
|
|||
|
|||
// Ensure they all add up!
|
|||
double sumofparts = 0; |
|||
for (auto a : amounts) { |
|||
sumofparts += a; |
|||
} |
|||
|
|||
// Add the Tx fees
|
|||
sumofparts += amounts.size() * Utils::getMinerFee(); |
|||
|
|||
//qDebug() << QString::number(sumofparts, 'f', 8) << QString::number(amount, 'f', 8);
|
|||
//Q_ASSERT(QString::number(sumofparts, 'f', 8) == QString::number(amount, 'f', 8));
|
|||
return amounts; |
|||
} |
|||
|
|||
void Turnstile::fillAmounts(QList<double>& amounts, double amount, int count) { |
|||
if (count == 1 || amount < 0.01) { |
|||
// Also account for the fees needed to send all these transactions
|
|||
auto actual = amount - (Utils::getMinerFee() * (amounts.size() + 1)); |
|||
|
|||
amounts.push_back(actual); |
|||
return; |
|||
} |
|||
|
|||
// Get a random amount off the amount (between half and full) and call recursively.
|
|||
// Multiply by hundered, because we'll operate on 0.01 ZEC minimum. We'll divide by 100 later
|
|||
double curAmount = std::rand() % (int)std::floor(amount * 100); |
|||
|
|||
// Try to round it off
|
|||
auto places = (int)std::floor(std::log10(curAmount)); |
|||
if (places > 0) { |
|||
auto a = std::pow(10, places); |
|||
curAmount = std::floor(curAmount / a) * a; |
|||
} |
|||
|
|||
// And divide by 100
|
|||
curAmount = curAmount / 100; |
|||
|
|||
if (curAmount > 0) |
|||
amounts.push_back(curAmount); |
|||
|
|||
fillAmounts(amounts, amount - curAmount, count - 1); |
|||
} |
|||
|
|||
QList<TurnstileMigrationItem>::Iterator |
|||
Turnstile::getNextStep(QList<TurnstileMigrationItem>& plan) { |
|||
// Get to the next unexecuted step
|
|||
auto fnIsEligibleItem = [&] (auto item) { |
|||
return item.status == TurnstileMigrationItemStatus::NotStarted || |
|||
item.status == TurnstileMigrationItemStatus::SentToT; |
|||
}; |
|||
|
|||
// Find the next step
|
|||
auto nextStep = std::find_if(plan.begin(), plan.end(), fnIsEligibleItem); |
|||
return nextStep; |
|||
} |
|||
|
|||
bool Turnstile::isMigrationPresent() { |
|||
auto plan = readMigrationPlan(); |
|||
if (plan.isEmpty()) return false; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
ProgressReport Turnstile::getPlanProgress() { |
|||
auto plan = readMigrationPlan(); |
|||
|
|||
auto nextStep = getNextStep(plan); |
|||
|
|||
auto step = std::distance(plan.begin(), nextStep) * 2; // 2 steps per item
|
|||
if (nextStep != plan.end() && |
|||
nextStep->status == TurnstileMigrationItemStatus::SentToT) |
|||
step++; |
|||
|
|||
auto total = plan.size(); |
|||
|
|||
auto nextBlock = nextStep == plan.end() ? 0 : nextStep->blockNumber; |
|||
|
|||
bool hasErrors = std::find_if(plan.begin(), plan.end(), [=] (auto i) { |
|||
return i.status == TurnstileMigrationItemStatus::NotEnoughBalance || |
|||
i.status == TurnstileMigrationItemStatus::UnknownError; |
|||
}) != plan.end(); |
|||
|
|||
return ProgressReport{(int)step, total*2, nextBlock, hasErrors}; |
|||
} |
|||
|
|||
void Turnstile::executeMigrationStep() { |
|||
auto plan = readMigrationPlan(); |
|||
|
|||
//qDebug() << QString("Executing step");
|
|||
printPlan(plan); |
|||
|
|||
// Get to the next unexecuted step
|
|||
auto fnIsEligibleItem = [&] (auto item) { |
|||
return item.status == TurnstileMigrationItemStatus::NotStarted || |
|||
item.status == TurnstileMigrationItemStatus::SentToT; |
|||
}; |
|||
|
|||
// Fn to find if there are any unconfirmed funds for this address.
|
|||
auto fnHasUnconfirmed = [=] (QString addr) { |
|||
auto utxoset = rpc->getUTXOs(); |
|||
return std::find_if(utxoset->begin(), utxoset->end(), [=] (auto utxo) { |
|||
return utxo.address == addr && utxo.confirmations == 0 && utxo.spendable; |
|||
}) != utxoset->end(); |
|||
}; |
|||
|
|||
// Find the next step
|
|||
auto nextStep = std::find_if(plan.begin(), plan.end(), fnIsEligibleItem); |
|||
|
|||
if (nextStep == plan.end()) |
|||
return; // Nothing to do
|
|||
|
|||
if (nextStep->blockNumber > Settings::getInstance()->getBlockNumber()) |
|||
return; |
|||
|
|||
// Is this the last step for this address?
|
|||
auto lastStep = std::find_if(std::next(nextStep), plan.end(), fnIsEligibleItem) == plan.end(); |
|||
|
|||
// Execute this step
|
|||
if (nextStep->status == TurnstileMigrationItemStatus::NotStarted) { |
|||
// Does this z addr have enough balance?
|
|||
if (fnHasUnconfirmed(nextStep->fromAddr)) { |
|||
//qDebug() << QString("unconfirmed, waiting");
|
|||
return; |
|||
} |
|||
|
|||
auto balance = rpc->getAllBalances()->value(nextStep->fromAddr); |
|||
if (nextStep->amount > balance) { |
|||
qDebug() << "Not enough balance!"; |
|||
nextStep->status = TurnstileMigrationItemStatus::NotEnoughBalance; |
|||
writeMigrationPlan(plan); |
|||
return; |
|||
} |
|||
|
|||
auto to = ToFields{ nextStep->intTAddr, nextStep->amount, "", "" }; |
|||
|
|||
// If this is the last step, then send the remaining amount instead of the actual amount.
|
|||
if (lastStep) { |
|||
auto remainingAmount = balance - Utils::getMinerFee(); |
|||
if (remainingAmount > 0) { |
|||
to.amount = remainingAmount; |
|||
} |
|||
} |
|||
|
|||
// Create the Tx
|
|||
auto tx = Tx{ nextStep->fromAddr, { to }, Utils::getMinerFee() }; |
|||
|
|||
// And send it
|
|||
doSendTx(tx, [=] () { |
|||
// Update status and write plan to disk
|
|||
nextStep->status = TurnstileMigrationItemStatus::SentToT; |
|||
writeMigrationPlan(plan); |
|||
}); |
|||
|
|||
} else if (nextStep->status == TurnstileMigrationItemStatus::SentToT) { |
|||
// First thing to do is check to see if the funds are confirmed.
|
|||
// We'll check both the original sprout address and the intermediate T addr for safety.
|
|||
if (fnHasUnconfirmed(nextStep->intTAddr) || fnHasUnconfirmed(nextStep->fromAddr)) { |
|||
//qDebug() << QString("unconfirmed, waiting");
|
|||
return; |
|||
} |
|||
|
|||
if (!rpc->getAllBalances()->keys().contains(nextStep->intTAddr)) { |
|||
qDebug() << QString("The intermediate Taddress doesn't have balance, even though it is confirmed"); |
|||
return; |
|||
} |
|||
|
|||
// Send it to the final destination address.
|
|||
auto bal = rpc->getAllBalances()->value(nextStep->intTAddr); |
|||
auto sendAmt = bal - Utils::getMinerFee(); |
|||
|
|||
if (sendAmt < 0) { |
|||
qDebug() << "Not enough balance!." << bal << ":" << sendAmt; |
|||
nextStep->status = TurnstileMigrationItemStatus::NotEnoughBalance; |
|||
writeMigrationPlan(plan); |
|||
return; |
|||
} |
|||
|
|||
QList<ToFields> to = { ToFields{ nextStep->destAddr, sendAmt, "", "" } }; |
|||
|
|||
// Create the Tx
|
|||
auto tx = Tx{ nextStep->intTAddr, to, Utils::getMinerFee() }; |
|||
|
|||
// And send it
|
|||
doSendTx(tx, [=] () { |
|||
// Update status and write plan to disk
|
|||
nextStep->status = TurnstileMigrationItemStatus::SentToZS; |
|||
writeMigrationPlan(plan); |
|||
}); |
|||
} |
|||
} |
|||
|
|||
void Turnstile::doSendTx(Tx tx, std::function<void(void)> cb) { |
|||
json params = json::array(); |
|||
rpc->fillTxJsonParams(params, tx); |
|||
std::cout << std::setw(2) << params << std::endl; |
|||
rpc->sendZTransaction(params, [=] (const json& reply) { |
|||
QString opid = QString::fromStdString(reply.get<json::string_t>()); |
|||
//qDebug() << opid;
|
|||
mainwindow->ui->statusBar->showMessage("Computing Tx: " % opid); |
|||
|
|||
// And then start monitoring the transaction
|
|||
rpc->addNewTxToWatch(tx, opid); |
|||
|
|||
cb(); |
|||
}); |
|||
} |
@ -0,0 +1,67 @@ |
|||
#ifndef TURNSTILE_H |
|||
#define TURNSTILE_H |
|||
|
|||
#include "precompiled.h" |
|||
|
|||
class RPC; |
|||
class MainWindow; |
|||
struct Tx; |
|||
|
|||
|
|||
struct TurnstileMigrationItem { |
|||
QString fromAddr; |
|||
QString intTAddr; |
|||
QString destAddr; |
|||
int blockNumber; |
|||
double amount; |
|||
int status; |
|||
}; |
|||
|
|||
enum TurnstileMigrationItemStatus { |
|||
NotStarted = 0, |
|||
SentToT, |
|||
SentToZS, |
|||
NotEnoughBalance, |
|||
UnknownError |
|||
}; |
|||
|
|||
struct ProgressReport { |
|||
int step; |
|||
int totalSteps; |
|||
int nextBlock; |
|||
bool hasErrors; |
|||
}; |
|||
|
|||
class Turnstile |
|||
{ |
|||
public: |
|||
Turnstile(RPC* _rpc, MainWindow* mainwindow); |
|||
~Turnstile(); |
|||
|
|||
void planMigration(QString zaddr, QString destAddr, int splits, int numBlocks); |
|||
QList<double> splitAmount(double amount, int parts); |
|||
void fillAmounts(QList<double>& amounts, double amount, int count); |
|||
|
|||
QList<TurnstileMigrationItem> readMigrationPlan(); |
|||
void writeMigrationPlan(QList<TurnstileMigrationItem> plan); |
|||
void removeFile(); |
|||
|
|||
void executeMigrationStep(); |
|||
ProgressReport getPlanProgress(); |
|||
bool isMigrationPresent(); |
|||
|
|||
static double minMigrationAmount; |
|||
private: |
|||
QList<int> getBlockNumbers(int start, int end, int count); |
|||
QString writeableFile(); |
|||
|
|||
void doSendTx(Tx tx, std::function<void(void)> cb); |
|||
|
|||
|
|||
QList<TurnstileMigrationItem>::Iterator getNextStep(QList<TurnstileMigrationItem>& plan); |
|||
|
|||
RPC* rpc; |
|||
MainWindow* mainwindow; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,228 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>Turnstile</class> |
|||
<widget class="QDialog" name="Turnstile"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>565</width> |
|||
<height>416</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Turnstile Migration</string> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox"> |
|||
<property name="title"> |
|||
<string>Turnstile Migration</string> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_2"> |
|||
<item> |
|||
<layout class="QGridLayout" name="gridLayout"> |
|||
<item row="0" column="0"> |
|||
<widget class="QLabel" name="msgIcon"> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="5" column="0"> |
|||
<widget class="QLabel" name="label_2"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Privacy Level</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="0"> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>From</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="1" colspan="2"> |
|||
<widget class="QComboBox" name="migrateZaddList"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="editable"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="currentText"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="5" column="1" colspan="2"> |
|||
<widget class="QComboBox" name="privLevel"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="1" colspan="2"> |
|||
<widget class="QLabel" name="label_8"> |
|||
<property name="text"> |
|||
<string><html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html></string> |
|||
</property> |
|||
<property name="wordWrap"> |
|||
<bool>true</bool> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="4" column="0"> |
|||
<widget class="QLabel" name="label_9"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>To</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="4" column="1" colspan="2"> |
|||
<widget class="QComboBox" name="migrateTo"/> |
|||
</item> |
|||
<item row="1" column="0" colspan="3"> |
|||
<widget class="Line" name="line"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="3" column="1"> |
|||
<widget class="QLabel" name="fromBalance"> |
|||
<property name="text"> |
|||
<string>Balance</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="7" column="0" rowspan="2" colspan="3"> |
|||
<spacer name="verticalSpacer"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Vertical</enum> |
|||
</property> |
|||
<property name="sizeHint" stdset="0"> |
|||
<size> |
|||
<width>20</width> |
|||
<height>40</height> |
|||
</size> |
|||
</property> |
|||
</spacer> |
|||
</item> |
|||
<item row="6" column="0"> |
|||
<widget class="QLabel" name="label_5"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Miner Fees</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="6" column="1" colspan="2"> |
|||
<widget class="QLabel" name="minerFee"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>0.0004 ZEC $0.04</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="3" column="0"> |
|||
<widget class="QLabel" name="label_3"> |
|||
<property name="text"> |
|||
<string>Total Balance</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QDialogButtonBox" name="buttonBox"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
<property name="standardButtons"> |
|||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<resources/> |
|||
<connections> |
|||
<connection> |
|||
<sender>buttonBox</sender> |
|||
<signal>accepted()</signal> |
|||
<receiver>Turnstile</receiver> |
|||
<slot>accept()</slot> |
|||
<hints> |
|||
<hint type="sourcelabel"> |
|||
<x>248</x> |
|||
<y>254</y> |
|||
</hint> |
|||
<hint type="destinationlabel"> |
|||
<x>157</x> |
|||
<y>274</y> |
|||
</hint> |
|||
</hints> |
|||
</connection> |
|||
<connection> |
|||
<sender>buttonBox</sender> |
|||
<signal>rejected()</signal> |
|||
<receiver>Turnstile</receiver> |
|||
<slot>reject()</slot> |
|||
<hints> |
|||
<hint type="sourcelabel"> |
|||
<x>316</x> |
|||
<y>260</y> |
|||
</hint> |
|||
<hint type="destinationlabel"> |
|||
<x>286</x> |
|||
<y>274</y> |
|||
</hint> |
|||
</hints> |
|||
</connection> |
|||
</connections> |
|||
</ui> |
@ -0,0 +1,157 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>TurnstileProgress</class> |
|||
<widget class="QDialog" name="TurnstileProgress"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>400</width> |
|||
<height>300</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Turnstile Migration Progress</string> |
|||
</property> |
|||
<layout class="QGridLayout" name="gridLayout"> |
|||
<item row="3" column="0" colspan="3"> |
|||
<widget class="QProgressBar" name="progressBar"> |
|||
<property name="value"> |
|||
<number>33</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="7" column="1" colspan="2"> |
|||
<widget class="QLabel" name="label_4"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Please ensure you have your wallet.dat backed up!</string> |
|||
</property> |
|||
<property name="wordWrap"> |
|||
<bool>true</bool> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="4" column="0" colspan="3"> |
|||
<widget class="Line" name="line"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="5" column="0" colspan="3"> |
|||
<widget class="QLabel" name="nextTx"> |
|||
<property name="text"> |
|||
<string>Next Transaction in 4 hours</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="2"> |
|||
<widget class="QLabel" name="progressTxt"> |
|||
<property name="text"> |
|||
<string>4 / 12</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="0" colspan="2"> |
|||
<widget class="QLabel" name="label_2"> |
|||
<property name="text"> |
|||
<string>Migration Progress</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="7" column="0"> |
|||
<widget class="QLabel" name="msgIcon"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>TextLabel</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="9" column="0" colspan="3"> |
|||
<widget class="QDialogButtonBox" name="buttonBox"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
<property name="standardButtons"> |
|||
<set>QDialogButtonBox::Close|QDialogButtonBox::Discard|QDialogButtonBox::Ok</set> |
|||
</property> |
|||
<property name="centerButtons"> |
|||
<bool>false</bool> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="6" column="0" colspan="3"> |
|||
<spacer name="verticalSpacer"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Vertical</enum> |
|||
</property> |
|||
<property name="sizeHint" stdset="0"> |
|||
<size> |
|||
<width>20</width> |
|||
<height>40</height> |
|||
</size> |
|||
</property> |
|||
</spacer> |
|||
</item> |
|||
<item row="8" column="0" colspan="3"> |
|||
<widget class="Line" name="line_2"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<resources/> |
|||
<connections> |
|||
<connection> |
|||
<sender>buttonBox</sender> |
|||
<signal>accepted()</signal> |
|||
<receiver>TurnstileProgress</receiver> |
|||
<slot>accept()</slot> |
|||
<hints> |
|||
<hint type="sourcelabel"> |
|||
<x>248</x> |
|||
<y>254</y> |
|||
</hint> |
|||
<hint type="destinationlabel"> |
|||
<x>157</x> |
|||
<y>274</y> |
|||
</hint> |
|||
</hints> |
|||
</connection> |
|||
<connection> |
|||
<sender>buttonBox</sender> |
|||
<signal>rejected()</signal> |
|||
<receiver>TurnstileProgress</receiver> |
|||
<slot>reject()</slot> |
|||
<hints> |
|||
<hint type="sourcelabel"> |
|||
<x>316</x> |
|||
<y>260</y> |
|||
</hint> |
|||
<hint type="destinationlabel"> |
|||
<x>286</x> |
|||
<y>274</y> |
|||
</hint> |
|||
</hints> |
|||
</connection> |
|||
</connections> |
|||
</ui> |
@ -0,0 +1,205 @@ |
|||
/********************************************************************************
|
|||
** Form generated from reading UI file 'turnstile.ui' |
|||
** |
|||
** Created by: Qt User Interface Compiler version 5.11.2 |
|||
** |
|||
** WARNING! All changes made in this file will be lost when recompiling UI file! |
|||
********************************************************************************/ |
|||
|
|||
#ifndef UI_TURNSTILE_H |
|||
#define UI_TURNSTILE_H |
|||
|
|||
#include <QtCore/QVariant> |
|||
#include <QtWidgets/QApplication> |
|||
#include <QtWidgets/QComboBox> |
|||
#include <QtWidgets/QDialog> |
|||
#include <QtWidgets/QDialogButtonBox> |
|||
#include <QtWidgets/QFrame> |
|||
#include <QtWidgets/QGridLayout> |
|||
#include <QtWidgets/QGroupBox> |
|||
#include <QtWidgets/QLabel> |
|||
#include <QtWidgets/QSpacerItem> |
|||
#include <QtWidgets/QVBoxLayout> |
|||
|
|||
QT_BEGIN_NAMESPACE |
|||
|
|||
class Ui_Turnstile |
|||
{ |
|||
public: |
|||
QVBoxLayout *verticalLayout; |
|||
QGroupBox *groupBox; |
|||
QVBoxLayout *verticalLayout_2; |
|||
QGridLayout *gridLayout; |
|||
QLabel *msgIcon; |
|||
QLabel *label_2; |
|||
QLabel *label; |
|||
QComboBox *migrateZaddList; |
|||
QComboBox *privLevel; |
|||
QLabel *label_8; |
|||
QLabel *label_9; |
|||
QComboBox *migrateTo; |
|||
QFrame *line; |
|||
QLabel *fromBalance; |
|||
QSpacerItem *verticalSpacer; |
|||
QLabel *label_5; |
|||
QLabel *minerFee; |
|||
QLabel *label_3; |
|||
QDialogButtonBox *buttonBox; |
|||
|
|||
void setupUi(QDialog *Turnstile) |
|||
{ |
|||
if (Turnstile->objectName().isEmpty()) |
|||
Turnstile->setObjectName(QStringLiteral("Turnstile")); |
|||
Turnstile->resize(565, 416); |
|||
verticalLayout = new QVBoxLayout(Turnstile); |
|||
verticalLayout->setObjectName(QStringLiteral("verticalLayout")); |
|||
groupBox = new QGroupBox(Turnstile); |
|||
groupBox->setObjectName(QStringLiteral("groupBox")); |
|||
verticalLayout_2 = new QVBoxLayout(groupBox); |
|||
verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2")); |
|||
gridLayout = new QGridLayout(); |
|||
gridLayout->setObjectName(QStringLiteral("gridLayout")); |
|||
msgIcon = new QLabel(groupBox); |
|||
msgIcon->setObjectName(QStringLiteral("msgIcon")); |
|||
msgIcon->setAlignment(Qt::AlignCenter); |
|||
|
|||
gridLayout->addWidget(msgIcon, 0, 0, 1, 1); |
|||
|
|||
label_2 = new QLabel(groupBox); |
|||
label_2->setObjectName(QStringLiteral("label_2")); |
|||
QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); |
|||
sizePolicy.setHorizontalStretch(0); |
|||
sizePolicy.setVerticalStretch(0); |
|||
sizePolicy.setHeightForWidth(label_2->sizePolicy().hasHeightForWidth()); |
|||
label_2->setSizePolicy(sizePolicy); |
|||
|
|||
gridLayout->addWidget(label_2, 5, 0, 1, 1); |
|||
|
|||
label = new QLabel(groupBox); |
|||
label->setObjectName(QStringLiteral("label")); |
|||
sizePolicy.setHeightForWidth(label->sizePolicy().hasHeightForWidth()); |
|||
label->setSizePolicy(sizePolicy); |
|||
|
|||
gridLayout->addWidget(label, 2, 0, 1, 1); |
|||
|
|||
migrateZaddList = new QComboBox(groupBox); |
|||
migrateZaddList->setObjectName(QStringLiteral("migrateZaddList")); |
|||
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Fixed); |
|||
sizePolicy1.setHorizontalStretch(0); |
|||
sizePolicy1.setVerticalStretch(0); |
|||
sizePolicy1.setHeightForWidth(migrateZaddList->sizePolicy().hasHeightForWidth()); |
|||
migrateZaddList->setSizePolicy(sizePolicy1); |
|||
migrateZaddList->setEditable(false); |
|||
|
|||
gridLayout->addWidget(migrateZaddList, 2, 1, 1, 2); |
|||
|
|||
privLevel = new QComboBox(groupBox); |
|||
privLevel->setObjectName(QStringLiteral("privLevel")); |
|||
sizePolicy1.setHeightForWidth(privLevel->sizePolicy().hasHeightForWidth()); |
|||
privLevel->setSizePolicy(sizePolicy1); |
|||
|
|||
gridLayout->addWidget(privLevel, 5, 1, 1, 2); |
|||
|
|||
label_8 = new QLabel(groupBox); |
|||
label_8->setObjectName(QStringLiteral("label_8")); |
|||
label_8->setWordWrap(true); |
|||
|
|||
gridLayout->addWidget(label_8, 0, 1, 1, 2); |
|||
|
|||
label_9 = new QLabel(groupBox); |
|||
label_9->setObjectName(QStringLiteral("label_9")); |
|||
sizePolicy.setHeightForWidth(label_9->sizePolicy().hasHeightForWidth()); |
|||
label_9->setSizePolicy(sizePolicy); |
|||
|
|||
gridLayout->addWidget(label_9, 4, 0, 1, 1); |
|||
|
|||
migrateTo = new QComboBox(groupBox); |
|||
migrateTo->setObjectName(QStringLiteral("migrateTo")); |
|||
|
|||
gridLayout->addWidget(migrateTo, 4, 1, 1, 2); |
|||
|
|||
line = new QFrame(groupBox); |
|||
line->setObjectName(QStringLiteral("line")); |
|||
line->setFrameShape(QFrame::HLine); |
|||
line->setFrameShadow(QFrame::Sunken); |
|||
|
|||
gridLayout->addWidget(line, 1, 0, 1, 3); |
|||
|
|||
fromBalance = new QLabel(groupBox); |
|||
fromBalance->setObjectName(QStringLiteral("fromBalance")); |
|||
|
|||
gridLayout->addWidget(fromBalance, 3, 1, 1, 1); |
|||
|
|||
verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); |
|||
|
|||
gridLayout->addItem(verticalSpacer, 7, 0, 2, 3); |
|||
|
|||
label_5 = new QLabel(groupBox); |
|||
label_5->setObjectName(QStringLiteral("label_5")); |
|||
sizePolicy.setHeightForWidth(label_5->sizePolicy().hasHeightForWidth()); |
|||
label_5->setSizePolicy(sizePolicy); |
|||
|
|||
gridLayout->addWidget(label_5, 6, 0, 1, 1); |
|||
|
|||
minerFee = new QLabel(groupBox); |
|||
minerFee->setObjectName(QStringLiteral("minerFee")); |
|||
QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred); |
|||
sizePolicy2.setHorizontalStretch(0); |
|||
sizePolicy2.setVerticalStretch(0); |
|||
sizePolicy2.setHeightForWidth(minerFee->sizePolicy().hasHeightForWidth()); |
|||
minerFee->setSizePolicy(sizePolicy2); |
|||
minerFee->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter); |
|||
|
|||
gridLayout->addWidget(minerFee, 6, 1, 1, 2); |
|||
|
|||
label_3 = new QLabel(groupBox); |
|||
label_3->setObjectName(QStringLiteral("label_3")); |
|||
|
|||
gridLayout->addWidget(label_3, 3, 0, 1, 1); |
|||
|
|||
|
|||
verticalLayout_2->addLayout(gridLayout); |
|||
|
|||
|
|||
verticalLayout->addWidget(groupBox); |
|||
|
|||
buttonBox = new QDialogButtonBox(Turnstile); |
|||
buttonBox->setObjectName(QStringLiteral("buttonBox")); |
|||
buttonBox->setOrientation(Qt::Horizontal); |
|||
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); |
|||
|
|||
verticalLayout->addWidget(buttonBox); |
|||
|
|||
|
|||
retranslateUi(Turnstile); |
|||
QObject::connect(buttonBox, SIGNAL(accepted()), Turnstile, SLOT(accept())); |
|||
QObject::connect(buttonBox, SIGNAL(rejected()), Turnstile, SLOT(reject())); |
|||
|
|||
QMetaObject::connectSlotsByName(Turnstile); |
|||
} // setupUi
|
|||
|
|||
void retranslateUi(QDialog *Turnstile) |
|||
{ |
|||
Turnstile->setWindowTitle(QApplication::translate("Turnstile", "Turnstile Migration", nullptr)); |
|||
groupBox->setTitle(QApplication::translate("Turnstile", "Turnstile Migration", nullptr)); |
|||
msgIcon->setText(QString()); |
|||
label_2->setText(QApplication::translate("Turnstile", "Privacy Level", nullptr)); |
|||
label->setText(QApplication::translate("Turnstile", "From", nullptr)); |
|||
migrateZaddList->setCurrentText(QString()); |
|||
label_8->setText(QApplication::translate("Turnstile", "<html><head/><body><p>Funds from Sprout z-Addresses (which start with "zc") need to be moved to the upgraded Sapling z-Addresses (which start with "zs"). The funds cannot be moved directly, but need to be sent through intermediate "transparent" addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html>", nullptr)); |
|||
label_9->setText(QApplication::translate("Turnstile", "To", nullptr)); |
|||
fromBalance->setText(QApplication::translate("Turnstile", "Balance", nullptr)); |
|||
label_5->setText(QApplication::translate("Turnstile", "Miner Fees", nullptr)); |
|||
minerFee->setText(QApplication::translate("Turnstile", "0.0004 ZEC $0.04", nullptr)); |
|||
label_3->setText(QApplication::translate("Turnstile", "Total Balance", nullptr)); |
|||
} // retranslateUi
|
|||
|
|||
}; |
|||
|
|||
namespace Ui { |
|||
class Turnstile: public Ui_Turnstile {}; |
|||
} // namespace Ui
|
|||
|
|||
QT_END_NAMESPACE |
|||
|
|||
#endif // UI_TURNSTILE_H
|
@ -0,0 +1,142 @@ |
|||
/********************************************************************************
|
|||
** Form generated from reading UI file 'turnstileprogress.ui' |
|||
** |
|||
** Created by: Qt User Interface Compiler version 5.11.2 |
|||
** |
|||
** WARNING! All changes made in this file will be lost when recompiling UI file! |
|||
********************************************************************************/ |
|||
|
|||
#ifndef UI_TURNSTILEPROGRESS_H |
|||
#define UI_TURNSTILEPROGRESS_H |
|||
|
|||
#include <QtCore/QVariant> |
|||
#include <QtWidgets/QApplication> |
|||
#include <QtWidgets/QDialog> |
|||
#include <QtWidgets/QDialogButtonBox> |
|||
#include <QtWidgets/QFrame> |
|||
#include <QtWidgets/QGridLayout> |
|||
#include <QtWidgets/QLabel> |
|||
#include <QtWidgets/QProgressBar> |
|||
#include <QtWidgets/QSpacerItem> |
|||
|
|||
QT_BEGIN_NAMESPACE |
|||
|
|||
class Ui_TurnstileProgress |
|||
{ |
|||
public: |
|||
QGridLayout *gridLayout; |
|||
QProgressBar *progressBar; |
|||
QLabel *label_4; |
|||
QFrame *line; |
|||
QLabel *nextTx; |
|||
QLabel *progressTxt; |
|||
QLabel *label_2; |
|||
QLabel *msgIcon; |
|||
QDialogButtonBox *buttonBox; |
|||
QSpacerItem *verticalSpacer; |
|||
QFrame *line_2; |
|||
|
|||
void setupUi(QDialog *TurnstileProgress) |
|||
{ |
|||
if (TurnstileProgress->objectName().isEmpty()) |
|||
TurnstileProgress->setObjectName(QStringLiteral("TurnstileProgress")); |
|||
TurnstileProgress->resize(400, 300); |
|||
gridLayout = new QGridLayout(TurnstileProgress); |
|||
gridLayout->setObjectName(QStringLiteral("gridLayout")); |
|||
progressBar = new QProgressBar(TurnstileProgress); |
|||
progressBar->setObjectName(QStringLiteral("progressBar")); |
|||
progressBar->setValue(33); |
|||
|
|||
gridLayout->addWidget(progressBar, 3, 0, 1, 3); |
|||
|
|||
label_4 = new QLabel(TurnstileProgress); |
|||
label_4->setObjectName(QStringLiteral("label_4")); |
|||
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); |
|||
sizePolicy.setHorizontalStretch(0); |
|||
sizePolicy.setVerticalStretch(0); |
|||
sizePolicy.setHeightForWidth(label_4->sizePolicy().hasHeightForWidth()); |
|||
label_4->setSizePolicy(sizePolicy); |
|||
label_4->setWordWrap(true); |
|||
|
|||
gridLayout->addWidget(label_4, 7, 1, 1, 2); |
|||
|
|||
line = new QFrame(TurnstileProgress); |
|||
line->setObjectName(QStringLiteral("line")); |
|||
line->setFrameShape(QFrame::HLine); |
|||
line->setFrameShadow(QFrame::Sunken); |
|||
|
|||
gridLayout->addWidget(line, 4, 0, 1, 3); |
|||
|
|||
nextTx = new QLabel(TurnstileProgress); |
|||
nextTx->setObjectName(QStringLiteral("nextTx")); |
|||
|
|||
gridLayout->addWidget(nextTx, 5, 0, 1, 3); |
|||
|
|||
progressTxt = new QLabel(TurnstileProgress); |
|||
progressTxt->setObjectName(QStringLiteral("progressTxt")); |
|||
progressTxt->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); |
|||
|
|||
gridLayout->addWidget(progressTxt, 2, 2, 1, 1); |
|||
|
|||
label_2 = new QLabel(TurnstileProgress); |
|||
label_2->setObjectName(QStringLiteral("label_2")); |
|||
|
|||
gridLayout->addWidget(label_2, 2, 0, 1, 2); |
|||
|
|||
msgIcon = new QLabel(TurnstileProgress); |
|||
msgIcon->setObjectName(QStringLiteral("msgIcon")); |
|||
QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred); |
|||
sizePolicy1.setHorizontalStretch(0); |
|||
sizePolicy1.setVerticalStretch(0); |
|||
sizePolicy1.setHeightForWidth(msgIcon->sizePolicy().hasHeightForWidth()); |
|||
msgIcon->setSizePolicy(sizePolicy1); |
|||
msgIcon->setAlignment(Qt::AlignCenter); |
|||
|
|||
gridLayout->addWidget(msgIcon, 7, 0, 1, 1); |
|||
|
|||
buttonBox = new QDialogButtonBox(TurnstileProgress); |
|||
buttonBox->setObjectName(QStringLiteral("buttonBox")); |
|||
buttonBox->setOrientation(Qt::Horizontal); |
|||
buttonBox->setStandardButtons(QDialogButtonBox::Close|QDialogButtonBox::Discard|QDialogButtonBox::Ok); |
|||
buttonBox->setCenterButtons(false); |
|||
|
|||
gridLayout->addWidget(buttonBox, 9, 0, 1, 3); |
|||
|
|||
verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); |
|||
|
|||
gridLayout->addItem(verticalSpacer, 6, 0, 1, 3); |
|||
|
|||
line_2 = new QFrame(TurnstileProgress); |
|||
line_2->setObjectName(QStringLiteral("line_2")); |
|||
line_2->setFrameShape(QFrame::HLine); |
|||
line_2->setFrameShadow(QFrame::Sunken); |
|||
|
|||
gridLayout->addWidget(line_2, 8, 0, 1, 3); |
|||
|
|||
|
|||
retranslateUi(TurnstileProgress); |
|||
QObject::connect(buttonBox, SIGNAL(accepted()), TurnstileProgress, SLOT(accept())); |
|||
QObject::connect(buttonBox, SIGNAL(rejected()), TurnstileProgress, SLOT(reject())); |
|||
|
|||
QMetaObject::connectSlotsByName(TurnstileProgress); |
|||
} // setupUi
|
|||
|
|||
void retranslateUi(QDialog *TurnstileProgress) |
|||
{ |
|||
TurnstileProgress->setWindowTitle(QApplication::translate("TurnstileProgress", "Turnstile Migration Progress", nullptr)); |
|||
label_4->setText(QApplication::translate("TurnstileProgress", "Please ensure you have your wallet.dat backed up!", nullptr)); |
|||
nextTx->setText(QApplication::translate("TurnstileProgress", "Next Transaction in 4 hours", nullptr)); |
|||
progressTxt->setText(QApplication::translate("TurnstileProgress", "4 / 12", nullptr)); |
|||
label_2->setText(QApplication::translate("TurnstileProgress", "Migration Progress", nullptr)); |
|||
msgIcon->setText(QApplication::translate("TurnstileProgress", "TextLabel", nullptr)); |
|||
} // retranslateUi
|
|||
|
|||
}; |
|||
|
|||
namespace Ui { |
|||
class TurnstileProgress: public Ui_TurnstileProgress {}; |
|||
} // namespace Ui
|
|||
|
|||
QT_END_NAMESPACE |
|||
|
|||
#endif // UI_TURNSTILEPROGRESS_H
|
Loading…
Reference in new issue