void MultisigDialog::setModel(WalletModel *model) { this->model = model; for(int i = 0; i < ui->pubkeyEntries->count(); i++) { MultisigAddressEntry *entry = qobject_cast<MultisigAddressEntry *>(ui->pubkeyEntries->itemAt(i)->widget()); if(entry) entry->setModel(model); } for(int i = 0; i < ui->inputs->count(); i++) { MultisigInputEntry *entry = qobject_cast<MultisigInputEntry *>(ui->inputs->itemAt(i)->widget()); if(entry) entry->setModel(model); } for(int i = 0; i < ui->outputs->count(); i++) { SendCoinsEntry *entry = qobject_cast<SendCoinsEntry *>(ui->outputs->itemAt(i)->widget()); if(entry) entry->setModel(model); } }
void MultisigDialog::updateRemoveEnabled() { bool enabled = (ui->pubkeyEntries->count() > 2); for(int i = 0; i < ui->pubkeyEntries->count(); i++) { MultisigAddressEntry *entry = qobject_cast<MultisigAddressEntry *>(ui->pubkeyEntries->itemAt(i)->widget()); if(entry) entry->setRemoveEnabled(enabled); } QString maxSigsStr; maxSigsStr.setNum(ui->pubkeyEntries->count()); ui->maxSignaturesLabel->setText(QString("/ ") + maxSigsStr); enabled = (ui->inputs->count() > 1); for(int i = 0; i < ui->inputs->count(); i++) { MultisigInputEntry *entry = qobject_cast<MultisigInputEntry *>(ui->inputs->itemAt(i)->widget()); if(entry) entry->setRemoveEnabled(enabled); } enabled = (ui->outputs->count() > 1); for(int i = 0; i < ui->outputs->count(); i++) { SendCoinsEntry *entry = qobject_cast<SendCoinsEntry *>(ui->outputs->itemAt(i)->widget()); if(entry) entry->setRemoveEnabled(enabled); } }
void MultisigDialog::on_createAddressButton_clicked() { ui->multisigAddress->clear(); ui->redeemScript->clear(); if(!model) return; std::vector<CPubKey> pubkeys; unsigned int required = ui->requiredSignatures->text().toUInt(); for(int i = 0; i < ui->pubkeyEntries->count(); i++) { MultisigAddressEntry *entry = qobject_cast<MultisigAddressEntry *>(ui->pubkeyEntries->itemAt(i)->widget()); if(!entry->validate()) return; QString str = entry->getPubkey(); CPubKey vchPubKey(ParseHex(str.toStdString().c_str())); if(!vchPubKey.IsFullyValid()) return; pubkeys.push_back(vchPubKey); } if((required == 0) || (required > pubkeys.size())) return; CScript script; script.SetMultisig(required, pubkeys); CScriptID scriptID = script.GetID(); CBitcoinAddress address(scriptID); ui->multisigAddress->setText(address.ToString().c_str()); ui->redeemScript->setText(HexStr(script.begin(), script.end()).c_str()); }
void MultisigDialog::on_createAddressButton_clicked() { ui->multisigAddress->clear(); ui->redeemScript->clear(); if(!model) return; std::vector<CKey> pubkeys; pubkeys.resize(ui->pubkeyEntries->count()); unsigned int required = ui->requiredSignatures->text().toUInt(); for(int i = 0; i < ui->pubkeyEntries->count(); i++) { MultisigAddressEntry *entry = qobject_cast<MultisigAddressEntry *>(ui->pubkeyEntries->itemAt(i)->widget()); if(!entry->validate()) return; QString str = entry->getPubkey(); CPubKey vchPubKey(ParseHex(str.toStdString().c_str())); if(!vchPubKey.IsValid()) return; pubkeys[i].SetPubKey(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) { 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); ui->multisigAddress->setText(address.ToString().c_str()); ui->redeemScript->setText(HexStr(script.begin(), script.end()).c_str()); }
MultisigAddressEntry * MultisigDialog::addPubKey() { MultisigAddressEntry *entry = new MultisigAddressEntry(this); entry->setModel(model); ui->pubkeyEntries->addWidget(entry); connect(entry, SIGNAL(removeEntry(MultisigAddressEntry *)), this, SLOT(removeEntry(MultisigAddressEntry *))); updateRemoveEnabled(); entry->clear(); ui->scrollAreaWidgetContents->resize(ui->scrollAreaWidgetContents->sizeHint()); QScrollBar *bar = ui->scrollArea->verticalScrollBar(); if(bar) bar->setSliderPosition(bar->maximum()); return entry; }