void MultisigDialog::on_transaction_textChanged() { while(ui->inputs->count()) delete ui->inputs->takeAt(0)->widget(); while(ui->outputs->count()) delete ui->outputs->takeAt(0)->widget(); if(ui->transaction->text().size() > 0) ui->signTransactionButton->setEnabled(true); else ui->signTransactionButton->setEnabled(false); // Decode the raw transaction std::vector<unsigned char> txData(ParseHex(ui->transaction->text().toStdString())); CDataStream ss(txData, SER_NETWORK, PROTOCOL_VERSION); CTransaction tx; try { ss >> tx; } catch(std::exception &e) { (void)e; return; } // Fill input list int index = -1; BOOST_FOREACH(const CTxIn& txin, tx.vin) { uint256 prevoutHash = txin.prevout.hash; addInput(); index++; MultisigInputEntry *entry = qobject_cast<MultisigInputEntry *>(ui->inputs->itemAt(index)->widget()); if(entry) { entry->setTransactionId(QString(prevoutHash.GetHex().c_str())); entry->setTransactionOutputIndex(txin.prevout.n); } } // Fill output list index = -1; BOOST_FOREACH(const CTxOut& txout, tx.vout) { CScript scriptPubKey = txout.scriptPubKey; CTxDestination addr; ExtractDestination(scriptPubKey, addr); CBitcoinAddress address(addr); SendCoinsRecipient recipient; recipient.address = QString(address.ToString().c_str()); recipient.amount = txout.nValue; addOutput(); index++; SendCoinsEntry *entry = qobject_cast<SendCoinsEntry *>(ui->outputs->itemAt(index)->widget()); if(entry) { entry->setValue(recipient); } } updateRemoveEnabled(); }
void MultisigDialog::on_transaction_textChanged() { ui->fee->setStyleSheet(""); ui->statusLabel->setText(""); while(ui->inputs->count()) delete ui->inputs->takeAt(0)->widget(); while(ui->outputs->count()) delete ui->outputs->takeAt(0)->widget(); if(ui->transaction->text().size() > 0) ui->signTransactionButton->setEnabled(true); else ui->signTransactionButton->setEnabled(false); // Decode the raw transaction std::vector<unsigned char> txData(ParseHex(ui->transaction->text().toStdString())); CDataStream ss(txData, SER_NETWORK, PROTOCOL_VERSION); CTransaction tx; try { ss >> tx; } catch(std::exception &e) { return; } // Fill input list int index = -1; BOOST_FOREACH(const CTxIn& txin, tx.vin) { uint256 prevoutHash = txin.prevout.hash; addInput(); index++; MultisigInputEntry *entry = qobject_cast<MultisigInputEntry *>(ui->inputs->itemAt(index)->widget()); if(entry) { entry->setTransactionId(QString(prevoutHash.GetHex().c_str())); entry->setTransactionOutputIndex(txin.prevout.n); } } // Fill output list index = -1; BOOST_FOREACH(const CTxOut& txout, tx.vout) { CScript scriptPubKey = txout.scriptPubKey; CTxDestination addr; ExtractDestination(scriptPubKey, addr); CBitcoinAddress address(addr); SendCoinsRecipient recipient; recipient.address = QString(address.ToString().c_str()); recipient.amount = txout.nValue; addOutput(); index++; SendCoinsEntry *entry = qobject_cast<SendCoinsEntry *>(ui->outputs->itemAt(index)->widget()); if(entry) { entry->setValue(recipient); } } updateRemoveEnabled(); // Check the fee int64_t transactionSize = ui->transaction->text().size() / 2; if(transactionSize == 0) return; transactionSize += ui->inputs->count() * 73; // Future ECDSA signatures in DER format int64_t fee = (int64_t ) (ui->fee->text().toDouble() * COIN); int64_t minFee = MIN_TX_FEE * (1 + (int64_t) transactionSize / 1000); if(fee < minFee) { ui->fee->setStyleSheet("color:red;"); ui->statusLabel->setText(tr("The transaction fee might be too small.")); } else if(fee > minFee) { ui->fee->setStyleSheet("color:red;"); ui->statusLabel->setText(tr("The transaction fee might be too big. Don't forget to add an output for the change address.")); } }