X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fqt%2Fmultisigdialog.cpp;h=c804c99f30e1077f3ceeec9c50b531e601f8d27a;hp=9d9418c333731f86b1378a31bd76b2701b9ac136;hb=27ce22da0815f4c1fa0e949cc4740e3f4dd1ea9c;hpb=43fa9dabffa5d022cc80c85219cbdd438f8e7ab6 diff --git a/src/qt/multisigdialog.cpp b/src/qt/multisigdialog.cpp index 9d9418c..c804c99 100644 --- a/src/qt/multisigdialog.cpp +++ b/src/qt/multisigdialog.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "addresstablemodel.h" @@ -24,7 +25,7 @@ #include "txdb-bdb.h" #endif -MultisigDialog::MultisigDialog(QWidget *parent) : QDialog(parent), ui(new Ui::MultisigDialog), model(0) +MultisigDialog::MultisigDialog(QWidget *parent) : QWidget(parent), ui(new Ui::MultisigDialog), model(0) { ui->setupUi(this); @@ -45,7 +46,6 @@ MultisigDialog::MultisigDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Mu addInput(); addOutput(); - updateAmounts(); connect(ui->addInputButton, SIGNAL(clicked()), this, SLOT(addInput())); connect(ui->addOutputButton, SIGNAL(clicked()), this, SLOT(addOutput())); @@ -54,6 +54,26 @@ MultisigDialog::MultisigDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Mu ui->sendTransactionButton->setEnabled(false); } +void MultisigDialog::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); + + if (!model) + return; + + updateAmounts(); +} + +void MultisigDialog::hideEvent(QHideEvent *event) +{ + QWidget::hideEvent(event); + + if (!model) + return; + + clear(); +} + MultisigDialog::~MultisigDialog() { delete ui; @@ -129,7 +149,7 @@ void MultisigDialog::on_createAddressButton_clicked() if(!model) return; - std::vector pubkeys; + std::vector pubkeys; pubkeys.resize(ui->pubkeyEntries->count()); unsigned int required = ui->requiredSignatures->text().toUInt(); @@ -142,14 +162,34 @@ void MultisigDialog::on_createAddressButton_clicked() CPubKey vchPubKey(ParseHex(str.toStdString().c_str())); if(!vchPubKey.IsValid()) return; - pubkeys[i].SetPubKey(vchPubKey); + pubkeys[i] = vchPubKey; + } + + if(pubkeys.size() > 16) + { + QMessageBox::warning(this, tr("Error"), tr("Number of addresses involved in the address creation > %1\nReduce the number").arg(16), QMessageBox::Ok); + return; } - if((required == 0) || (required > pubkeys.size())) + if(required == 0) + { + QMessageBox::warning(this, tr("Error"), tr("Number of required signatures is 0\nNumber of required signatures must be between 1 and number of keys involved in the creation of address."), QMessageBox::Ok); return; + } + if(required > pubkeys.size()) + { + QMessageBox::warning(this, tr("Error"), tr("Number of required signatures > Number of keys involved in the creation of address."), QMessageBox::Ok); + return; + } + CScript script; script.SetMultisig(required, pubkeys); + if (script.size() > MAX_SCRIPT_ELEMENT_SIZE) + { + QMessageBox::warning(this, tr("Error"), tr("Redeem script exceeds size limit: %1 > %2\nReduce the number of addresses involved in the address creation.").arg(script.size()).arg(MAX_SCRIPT_ELEMENT_SIZE), QMessageBox::Ok); + return; + } CScriptID scriptID = script.GetID(); CBitcoinAddress address(scriptID); @@ -203,8 +243,8 @@ void MultisigDialog::on_saveMultisigAddressButton_clicked() LOCK(wallet->cs_wallet); if(!wallet->HaveCScript(scriptID)) wallet->AddCScript(script); - if(!wallet->mapAddressBook.count(CBitcoinAddress(address).Get())) - wallet->SetAddressBookName(CBitcoinAddress(address).Get(), label); + if(!wallet->mapAddressBook.count(CBitcoinAddress(address))) + wallet->SetAddressBookName(CBitcoinAddress(address), label); } void MultisigDialog::clear() @@ -272,8 +312,8 @@ void MultisigDialog::on_createTransactionButton_clicked() SendCoinsRecipient recipient = entry->getValue(); CBitcoinAddress address(recipient.address.toStdString()); CScript scriptPubKey; - scriptPubKey.SetDestination(address.Get()); - int64 amount = recipient.amount; + scriptPubKey.SetAddress(address); + int64_t amount = recipient.amount; CTxOut output(amount, scriptPubKey); transaction.vout.push_back(output); } @@ -307,7 +347,7 @@ void MultisigDialog::on_transaction_textChanged() { ss >> tx; } - catch(std::exception &e) + catch(const std::exception&) { return; } @@ -377,7 +417,7 @@ void MultisigDialog::on_signTransactionButton_clicked() { ss >> tx; } - catch(std::exception &e) + catch(const std::exception&) { return; } @@ -385,7 +425,7 @@ void MultisigDialog::on_signTransactionButton_clicked() // Fetch previous transactions (inputs) std::map mapPrevOut; - for(int i = 0; i < mergedTx.vin.size(); i++) + for(unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTransaction tempTx; MapPrevTx mapPrevTx; @@ -426,7 +466,7 @@ void MultisigDialog::on_signTransactionButton_clicked() // Sign what we can bool fComplete = true; - for(int i = 0; i < mergedTx.vin.size(); i++) + for(unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTxIn& txin = mergedTx.vin[i]; if(mapPrevOut.count(txin.prevout) == 0) @@ -468,13 +508,13 @@ void MultisigDialog::on_copySignedTransactionButton_clicked() void MultisigDialog::on_sendTransactionButton_clicked() { - int64 transactionSize = ui->signedTransaction->text().size() / 2; + int64_t transactionSize = ui->signedTransaction->text().size() / 2; if(transactionSize == 0) return; // Check the fee - int64 fee = (int64 ) (ui->fee->text().toDouble() * COIN); - int64 minFee = MIN_TX_FEE * (1 + (int64) transactionSize / 1000); + int64_t fee = (int64_t ) (ui->fee->text().toDouble() * COIN); + int64_t minFee = MIN_TX_FEE * (1 + (int64_t) transactionSize / 1000); if(fee < minFee) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Confirm send transaction"), tr("The fee of the transaction (%1 NVC) is smaller than the expected fee (%2 NVC). Do you want to send the transaction anyway?").arg((double) fee / COIN).arg((double) minFee / COIN), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); @@ -496,7 +536,7 @@ void MultisigDialog::on_sendTransactionButton_clicked() { ssData >> tx; } - catch(std::exception &e) + catch(const std::exception&) { return; } @@ -571,7 +611,7 @@ void MultisigDialog::removeEntry(SendCoinsEntry *entry) void MultisigDialog::updateAmounts() { // Update inputs amount - int64 inputsAmount = 0; + int64_t inputsAmount = 0; for(int i = 0; i < ui->inputs->count(); i++) { MultisigInputEntry *entry = qobject_cast(ui->inputs->itemAt(i)->widget()); @@ -583,7 +623,7 @@ void MultisigDialog::updateAmounts() ui->inputsAmount->setText(inputsAmountStr); // Update outputs amount - int64 outputsAmount = 0; + int64_t outputsAmount = 0; for(int i = 0; i < ui->outputs->count(); i++) { SendCoinsEntry *entry = qobject_cast(ui->outputs->itemAt(i)->widget()); @@ -595,8 +635,23 @@ void MultisigDialog::updateAmounts() ui->outputsAmount->setText(outputsAmountStr); // Update Fee amount - int64 fee = inputsAmount - outputsAmount; + int64_t fee = inputsAmount - outputsAmount; QString feeStr; feeStr.sprintf("%.6f", (double) fee / COIN); ui->fee->setText(feeStr); -} \ No newline at end of file +} + +void MultisigDialog::keyPressEvent(QKeyEvent *event) +{ +#ifdef ANDROID + if(windowType() != Qt::Widget && event->key() == Qt::Key_Back) + { + close(); + } +#else + if(windowType() != Qt::Widget && event->key() == Qt::Key_Escape) + { + close(); + } +#endif +}