[Dev] Documenting Feathercoin Specific Software settings - Part 9
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/chainparams.cpp
- //vSeeds.push_back(CDNSSeedData("block.ftc-c.com", "block.ftc-c.com")); - //vSeeds.push_back(CDNSSeedData("pool.ftc-c.com", "pool.ftc-c.com")); + vSeeds.push_back(CDNSSeedData("block.ftc-c.com", "block.ftc-c.com")); + vSeeds.push_back(CDNSSeedData("pool.ftc-c.com", "pool.ftc-c.com"));
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/core.h
+extern int nBestHeight; +static const unsigned int LOCKTIME_THRESHOLD2 = 500000000; // Tue Nov 5 00:53:20 1985 UTC
Code added
+ + bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const + { + // Time based nLockTime implemented in 0.1.6 + if (nLockTime == 0) + return true; + if (nBlockHeight == 0) + nBlockHeight = nBestHeight; + if (nBlockTime == 0) + nBlockTime = GetAdjustedTime(); + if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD2 ? (int64)nBlockHeight : nBlockTime)) + return true; + BOOST_FOREACH(const CTxIn& txin, vin) + if (!txin.IsFinal()) + return false; + return true; + }
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/Makefile.am
- forms/snapwidget.ui + forms/snapwidget.ui \ + forms/createmultisigaddrdialog.ui \ + forms/multisigdialog.ui
Code replaced
+ moc_reportview.cpp \ + moc_createmultisigaddrdialog.cpp \ + moc_multisigdialog.cpp + reportview.h \ + createmultisigaddrdialog.h \ + multisigdialog.h + res/icons/account-report.png \ + res/icons/multisig.png + qimagesource.cpp \ + createmultisigaddrdialog.cpp \ + multisigdialog.cpp
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/addressbookpage.cpp
+#include "signverifymessagedialog.h" +#include "wallet.h" +#include "walletmodel.h" +#include "init.h" +#include "base58.h" + +#include "walletview.h" +#include "createmultisigaddrdialog.h" +
Code added
+#include "json/json_spirit.h" +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +using namespace json_spirit; + + ui->signMessage->setVisible(false); + ui->signMessage->setVisible(true); + ui->newMultiSigAddress->setVisible(false); + QAction *sendCoinsAction = new QAction(tr("Send &Coins"), this); + QAction *signMessageAction = new QAction(ui->signMessage->text(), this); + QAction *verifyMessageAction = new QAction(ui->verifyMessage->text(), this); + QAction *copyPubKeyAction = new QAction(tr("Copy &Public Key"), this); + QAction *copyPriKeyAction = new QAction(tr("Copy Private Key"), this);
Code added
+ { contextMenu->addAction(deleteAction); + //contextMenu->addAction(sendCoinsAction); + }
Code added
+ if(tab == ReceivingTab) + { + contextMenu->addAction(signMessageAction); + contextMenu->addAction(copyPubKeyAction); + contextMenu->addAction(copyPriKeyAction); + } + else if(tab == SendingTab) + contextMenu->addAction(verifyMessageAction); + + QAction *MultiSigExportAction = new QAction(tr("Export MultiSig Address"), this); + contextMenu->addAction(MultiSigExportAction); + + contextMenuMultiSig = new QMenu(); + contextMenuMultiSig->addAction(copyAddressAction); + contextMenuMultiSig->addAction(copyLabelAction); + contextMenuMultiSig->addAction(editAction); + contextMenuMultiSig->addAction(deleteAction); + contextMenuMultiSig->addSeparator(); + //contextMenuMultiSig->addAction(sendCoinsAction); +#ifdef USE_QRCODE + contextMenuMultiSig->addAction(showQRCodeAction); +#endif + contextMenuMultiSig->addAction(MultiSigExportAction);
Code added
+ connect(signMessageAction, SIGNAL(triggered()), this, SLOT(on_signMessage_clicked())); + connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(on_verifyMessage_clicked())); + connect(copyPubKeyAction, SIGNAL(triggered()), this, SLOT(on_copyPubKey_clicked())); + connect(copyPriKeyAction, SIGNAL(triggered()), this, SLOT(on_copyPriKey_clicked())); + connect(ui->newMultiSigAddress, SIGNAL(clicked()), this, SLOT(createAddress())); + connect(MultiSigExportAction, SIGNAL(triggered()), this, SLOT(exportAddress())); + connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(onSendCoinsAction()));
Code added
-#if QT_VERSION < 0x050000 +/*#if QT_VERSION < 0x050000 -#endif +#endif*/
Code commented out
+ ui->tableView->horizontalHeader()->resizeSection(1, 850); + //ui->tableView->horizontalHeader()->resizeSection(2, 100); + ui->tableView->horizontalHeader()->setStretchLastSection(true);
UI code changed
+void AddressBookPage::on_copyPubKey_clicked() +{ + QModelIndexList selection = ui->tableView->selectionModel()->selectedRows(AddressTableModel::Address); + if(!selection.isEmpty()) + { + QString addrStr = selection.at(0).data(Qt::EditRole).toString(); + CBitcoinAddress address(addrStr.toStdString()); + CKeyID keyID; + if ( !address.GetKeyID(keyID) ) + { + QMessageBox::warning(this, windowTitle(), + tr("Address \"%1\" doesn't have public key ").arg(addrStr), + QMessageBox::Ok, QMessageBox::Ok); + return; + } + CPubKey vchPubKey; + if ( !pwalletMain->GetPubKey(keyID, vchPubKey)) + { + QMessageBox::warning(this, windowTitle(), + tr("Address \"%1\" doesn't have public key ").arg(addrStr), + QMessageBox::Ok, QMessageBox::Ok); + return; + } + GUIUtil::setClipboard(QString::fromStdString(HexStr(vchPubKey))); + } +} + +void AddressBookPage::on_copyPriKey_clicked() +{ + QModelIndexList selection = ui->tableView->selectionModel()->selectedRows(AddressTableModel::Address); + if(!selection.isEmpty()) + { + QString addrStr = selection.at(0).data(Qt::EditRole).toString(); + CBitcoinAddress address(addrStr.toStdString()); + CKeyID keyID; + if ( !address.GetKeyID(keyID) ) + { + QMessageBox::warning(this, windowTitle(), + tr("Address \"%1\" doesn't have public key ").arg(addrStr), + QMessageBox::Ok, QMessageBox::Ok); + return; + } + CSecret vchSecret; + bool fCompressed; + if (!pwalletMain->GetSecret(keyID, vchSecret, fCompressed)) + { + QMessageBox::warning(this, windowTitle(), + tr("Address \"%1\" doesn't have private key ").arg(addrStr), + QMessageBox::Ok, QMessageBox::Ok); + return; + } + GUIUtil::setClipboard(CBitcoinSecret(vchSecret, fCompressed).ToString().c_str()); + } +} + +void AddressBookPage::on_signMessage_clicked() +{ + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + + foreach (QModelIndex index, indexes) + { + QString address = index.data().toString(); + //emit signMessage(address); + SignVerifyMessageDialog *signVerifyMessageDialog = new SignVerifyMessageDialog(this); + signVerifyMessageDialog->setAttribute(Qt::WA_DeleteOnClose); + //signVerifyMessageDialog->setModel(walletModel); + signVerifyMessageDialog->showTab_SM(true); + + if (!address.isEmpty()) + signVerifyMessageDialog->setAddress_SM(address); + } +} + +void AddressBookPage::on_verifyMessage_clicked() +{ + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + + foreach (QModelIndex index, indexes) + { + QString address = index.data().toString(); + //emit verifyMessage(address); + SignVerifyMessageDialog *signVerifyMessageDialog = new SignVerifyMessageDialog(this); + signVerifyMessageDialog->setAttribute(Qt::WA_DeleteOnClose); + //signVerifyMessageDialog->setModel(walletModel); + signVerifyMessageDialog->showTab_VM(true); + + if (!address.isEmpty()) + signVerifyMessageDialog->setAddress_VM(address); + } +} +
Section of code added
+ //contextMenu->exec(QCursor::pos()); + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Category); + + foreach (QModelIndex index1, indexes){ + QString Category = index1.data().toString(); + if ( Category == "MultiSig" ) + contextMenuMultiSig->exec(QCursor::pos()); + else + contextMenu->exec(QCursor::pos()); + + break; + }
Code replaced
+ +void AddressBookPage::onSendCoinsAction() +{ + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + + foreach (QModelIndex index, indexes) + { + QString address = index.data().toString(); + emit sendCoins(address); + //parent.gotoSendCoinsPage(address); + //WalletView(&parent)->gotoSendCoinsPage(address); + close(); + } +} + +void AddressBookPage::createAddress() +{ + CreateMultiSigAddrDialog dlg(this); + if(dlg.exec()) + { + } +} + +bool writeString(const QString &filename, const QString& hex); +void AddressBookPage::exportAddress() +{ + QString s; + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + + //foreach (QModelIndex index, indexes) + s = indexes[0].data().toString(); + + CBitcoinAddress address(s.toStdString()); + + CScript subscript; + CScriptID scriptID; + address.GetScriptID(scriptID); + pwalletMain->GetCScript(scriptID, subscript); + + json_spirit::Object addrJson; + addrJson.push_back(json_spirit::Pair("address", address.ToString())); + addrJson.push_back(json_spirit::Pair("redeemScript", HexStr(subscript.begin(), subscript.end()))); + std::string ss = json_spirit::write_string(json_spirit::Value(addrJson), false); + QString addrJsonStr = QString::fromStdString(ss); + + QString filename = GUIUtil::getSaveFileName( + this, + tr("Save MultiSig Address"), QString(), + tr("MultiSig Address file (*.msa)"), NULL); + + if (filename.isNull()) return; + + if(!writeString(filename, addrJsonStr)) + { + QMessageBox::critical(this, tr("Exporting Failed"), tr("Could not write to file %1.").arg(filename), + QMessageBox::Abort, QMessageBox::Abort); + } +}
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/addressbookpage.h
+ QMenu *contextMenuMultiSig;
Code added
+ /** Copy public key of currently selected address to clipboard */ + void on_copyPubKey_clicked(); + /** Copy private key of currently selected address to clipboard */ + void on_copyPriKey_clicked(); + /** Open the sign message tab in the Sign/Verify Message dialog with currently selected address */ + void on_signMessage_clicked(); + /** Open the verify message tab in the Sign/Verify Message dialog with currently selected address */ + void on_verifyMessage_clicked(); + /** Open send coins dialog for currently selected address (no button) */ + void onSendCoinsAction();
Code added
+ + void createAddress(); + void exportAddress();
Code added
+ void signMessage(QString addr); + void verifyMessage(QString addr);
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/addresstablemodel.cpp
+ + enum Category { + Normal, + MultiSig + };
Code added
+ AddressTableEntry() { categoryStrList << "Normal" << "MultiSig"; } + AddressTableEntry(Type type, const QString &label, const QString &address, const bool &stealth = false, Category cate = Normal): + type(type), label(label), address(address), stealth(stealth), category(cate) { categoryStrList << "Normal" << "MultiSig"; }
Code replaced
+ const std::string& strName = item.second.name; + bool fMyShare = IsMyShare(*wallet, address.Get());
Code added
+ AddressTableEntry::Category cate = AddressTableEntry::Normal; + if ( fMyShare ) + { + cate = AddressTableEntry::MultiSig; + addressType = AddressTableEntry::Sending; + }
Code replaced
+ QString::fromStdString(address.ToString()),false,cate));
Code replaced
+ true,AddressTableEntry::Normal));
Code replaced
- cachedAddressTable.insert(lowerIndex, + } parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex);
AddressTableEntry(newEntryType, label, address));
+ if (address.at(0)==‘f’)
+ {
+ cachedAddressTable.insert(lowerIndex, AddressTableEntry(newEntryType, label, address,false,AddressTableEntry::MultiSig));
+ }
+ else
+ {
+ cachedAddressTable.insert(lowerIndex, AddressTableEntry(newEntryType, label, address,false,AddressTableEntry::Normal));
+ }Code replaced
+ //columns << tr("Label") << tr("Address")<< tr("Category"); + case Category: + //return rec->categoryStrList[rec->category]; + return rec->category;
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/addresstablemodel.h
+ Label = 0, /**< User specified label */ Address = 1, /**< Bitcoin address */ - Type = 2 /**< Address type */ + Type = 2, /**< Address type */ + Category = 3 /**< Address Category : Normal or MultiSig*/
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/bitcoingui.cpp
+ + multiSigAction = new QAction(QIcon(":/icons/multisig"), tr("&MultiSig"), this); + multiSigAction->setStatusTip(tr("Manage MultiSig transactions")); + multiSigAction->setToolTip(multiSigAction->statusTip()); + multiSigAction->setCheckable(true); + multiSigAction->setShortcut(QKeySequence(Qt::ALT+ Qt::Key_6)); + tabGroup->addAction(multiSigAction);
Code added
+ connect(multiSigAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(multiSigAction, SIGNAL(triggered()), this, SLOT(gotoMultiSigPage())); + advanced->addAction(multiSigAction); + toolbar->addAction(multiSigAction); + multiSigAction->setEnabled(enabled); +void BitcoinGUI::gotoMultiSigPage() +{ + multiSigAction->setChecked(true); + if (walletFrame) walletFrame->gotoMultiSigPage(); +} +
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/bitcoingui.h
+ QAction *multiSigAction;
Code added
+ /** Switch to MultiSig page */ + void gotoMultiSigPage(); +
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/createmultisigaddrdialog.cpp
New file Large amount of new code, 298 lines
+#include "createmultisigaddrdialog.h" +#include "ui_createmultisigaddrdialog.h" + +#include "addresstablemodel.h" +#include "guiutil.h" + +#include "wallet.h" +#include "base58.h" +#include "init.h" +#include "util.h" + +#include "json/json_spirit.h" +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +using namespace json_spirit; + +#include <QSortFilterProxyModel> +#include <QClipboard> +#include <QMessageBox> +#include <QMenu> +#include <QTextDocument> +#include <QScrollBar> +#include <QFile> +#include <QTextStream> +#include <QDataWidgetMapper> + +CreateMultiSigAddrDialog::CreateMultiSigAddrDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::CreateMultiSigAddrDialog) +{ + ui->setupUi(this); + + connect(ui->btnCreate, SIGNAL(clicked()), this, SLOT(create())); + connect(ui->btnCancel, SIGNAL(clicked()), this, SLOT(cancel())); + + ui->comboBoxRequire->addItem(QString("1"), QVariant(1)); + ui->comboBoxRequire->addItem(QString("2"), QVariant(2)); + ui->comboBoxRequire->addItem(QString("3"), QVariant(3)); + ui->comboBoxRequire->setCurrentIndex(1); + + ui->comboBoxTotal->addItem(QString("2"), QVariant(2)); + ui->comboBoxTotal->addItem(QString("3"), QVariant(3)); + ui->comboBoxTotal->setCurrentIndex(0); + currentPubkeyNum = 2; + connect(ui->comboBoxTotal, SIGNAL(currentIndexChanged(int)), this, SLOT(handleSelectionChanged(int)));
Start of new file code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/createmultisigaddrdialog.h
New file 40 lines code
+#ifndef CREATEMULTISIGADDRESSDIALOG_H +#define CREATEMULTISIGADDRESSDIALOG_H + +#include <QDialog> + +QT_BEGIN_NAMESPACE +class QLabel; +QT_END_NAMESPACE + +namespace Ui { + class CreateMultiSigAddrDialog; +} + +/** Dialog for editing an address and associated information. + */ +class CreateMultiSigAddrDialog : public QDialog +{ + Q_OBJECT + +public: + explicit CreateMultiSigAddrDialog(QWidget *parent = 0); + ~CreateMultiSigAddrDialog(); + +public slots: + void create(); + void cancel(); + void handleSelectionChanged(int idx); + void onTextChanged0(const QString & text); + void onTextChanged1(const QString & text); + void onTextChanged2(const QString & text); + void importAddress(); + void updatePromptText(); + +private: + Ui::CreateMultiSigAddrDialog *ui; + int currentPubkeyNum; + void onTextChanged(QLabel* label, const QString & text); +}; + +#endif // CREATEMULTISIGADDRESSDIALOG_H
Code added new file
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/editaddressdialog.cpp
+ tr("The entered address \"%1\" is not a valid Feathercoin address.").arg(ui->addressEdit->text()),
Name change to Feathercoin
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/feathercoin.qrc
+ <file alias="multisig">res/icons/multisig.png</file>
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/forms/addressbookpage.ui
Amount of ui changes
+ <string>&New Address</string> + </property> + <property name="icon"> + <iconset resource="../feathercoin.qrc"> + <normaloff>:/icons/add</normaloff>:/icons/add</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="newMultiSigAddress"> + <property name="text"> + <string>New MultiSig</string>
Example code replaced
+ <widget class="QPushButton" name="signMessage"> + <property name="toolTip"> + <string>Sign a message to prove you own a FTC address</string> + </property> + <property name="text"> + <string>Sign &Message</string> + </property> + <property name="icon"> + <iconset resource="../feathercoin.qrc"> + <normaloff>:/icons/edit</normaloff>:/icons/edit</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="verifyMessage"> + <property name="toolTip"> + <string>Verify a message to ensure it was signed with a specified FTC address</string> + </property> + <property name="text"> + <string>&Verify Message</string> + </property> + <property name="icon"> + <iconset resource="../feathercoin.qrc"> + <normaloff>:/icons/transaction_0</normaloff>:/icons/transaction_0</iconset> + </property> + </widget> + </item> + <item>
Code replaced
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/forms/createmultisigaddrdialog.ui
Large new file, 159 lines of code
+<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CreateMultiSigAddrDialog</class> + <widget class="QDialog" name="CreateMultiSigAddrDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>506</width> + <height>209</height> + </rect> + </property> + <property name="windowTitle"> + <string>Create MultiSig Address</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QLabel" name="label0"> + <property name="text"> + <string>PublicKey</string> + </property> + </widget> + </item>
Example new code
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/forms/multisigdialog.ui
New file, 729 lines of code
+<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MultiSigDialog</class> + <widget class="QDialog" name="MultiSigDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>850</width> + <height>400</height> + </rect> + </property> + <property name="windowTitle"> + <string>Send Coins</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0"> + <property name="bottomMargin"> + <number>8</number> + </property> + <item> + <widget class="QFrame" name="frameCoinControl">
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/guiutil.cpp
+QString getLoadFileName(QWidget *parent, const QString &caption, + const QString &dir, + const QString &filter, + QString *selectedSuffixOut) +{ + QString selectedFilter; + QString myDir; + if(dir.isEmpty()) // Default to user documents location + { +#if QT_VERSION < 0x050000 + myDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); +#else + myDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); +#endif + } + else + { + myDir = dir; + } + QString result = QFileDialog::getOpenFileName(parent, caption, myDir, filter, &selectedFilter); + + /* Extract first suffix from filter pattern "Description (*.foo)" or "Description (*.foo *.bar ...) */ + QRegExp filter_re(".* \\(\\*\\.(.*)[ \\)]"); + QString selectedSuffix; + if(filter_re.exactMatch(selectedFilter)) + { + selectedSuffix = filter_re.cap(1); + } + + /* Add suffix if needed */ + QFileInfo info(result); + if(!result.isEmpty()) + { + if(info.suffix().isEmpty() && !selectedSuffix.isEmpty()) + { + /* No suffix specified, add selected suffix */ + if(!result.endsWith(".")) + result.append("."); + result.append(selectedSuffix); + } + } + + /* Return selected suffix if asked to */ + if(selectedSuffixOut) + { + *selectedSuffixOut = selectedSuffix; + } + return result; +} +
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/guiutil.h
+ QString getLoadFileName(QWidget *parent=0, const QString &caption=QString(), + const QString &dir=QString(), const QString &filter=QString(), + QString *selectedSuffixOut=0);
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/locale/bitcoin_zh_CN.ts
Translation file
+ <source>&New Address</source> + <translation>新建(&N)地址</translation> + </message> + <message> + <source>New MultiSig</source> + <translation>新建多重签名</translation>
Code replaced
+ <message> + <source>Sign &Message</source> + <translation>消息签名(&M)</translation> + </message> + <message> + <source>&Verify Message</source> + <translation>验证消息(&V)</translation> + </message> + <message> + <source>Copy &Public Key</source> + <translation>复制公匙(&P)</translation> + </message> + <message> + <source>Copy Private Key</source> + <translation>复制私匙</translation> + </message> + <message> + <source>Export MultiSig Address</source> + <translation>导出多重签名地址</translation> + </message> + <message> + <source>Address "%1" doesn't have public key </source> + <translation>%1在地址簿中不存在公匙</translation> + </message> + <message> + <source>Address "%1" doesn't have private key </source> + <translation>%1在地址簿中不存在死匙</translation> + </message> + <message> + <source>Save MultiSig Address</source> + <translation>保存多重签名地址</translation> + </message> + <message> + <source>Could not write to file %1.</source> + <translation>不能写入文件%1</translation> + </message>
Code added
+ <name>CreateMultiSigAddrDialog</name> + <message> + <source>Create MultiSig Address</source> + <translation>创建多重签名地址</translation> + </message> + <message> + <source>PublicKey</source> + <translation>公匙</translation> + </message> + <message> + <source>You need y keys to create a x-of-y Multisig address</source> + <translation>你需要创建多重签名地址的签名组合</translation> + </message> + <message> + <source>Require</source> + <translation>满足</translation> + </message> + <message> + <source>of</source> + <translation>总数</translation> + </message> + <message> + <source>Import</source> + <translation>导入</translation> + </message> + <message> + <source>Create</source> + <translation>创建</translation> + </message> + <message> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <source>All public keys belong to this wallet!</source> + <translation>所有的公私属于这个钱包!</translation> + </message> + <message> + <source>You need </source> + <translation>你需要</translation> + </message> + <message> + <source> keys to create a </source> + <translation>把钥匙创建一个满足</translation> + </message> + <message> + <source>-of-</source> + <translation>总共</translation> + </message> + <message> + <source> MultiSig address</source> + <translation>的多重签名地址</translation> + </message> + <message> + <source>Load MultiSig Address</source> + <translation>加载多重签名地址</translation> + </message> + <message> + <source>Invalid public key "%1" </source> + <translation>不可用的公匙%1</translation> + </message> +</context> +<context> + <name>MultiSigDialog</name> + <message> + <source>Total balance:</source> + <translation>总额:</translation> + </message> + <message> + <source> Addresses:</source> + <translation> 地址:</translation> + </message> + <message> + <source>Address</source> + <translation>地址</translation> + </message> + <message> + <source>Available: </source> + <translation>可用:</translation> + </message> + <message> + <source>Require 0 of 0 signatures</source> + <translation>要求签名数量满足条件</translation> + </message> + <message> + <source>Import Raw Tx</source> + <translation>导入交易</translation> + </message> + <message> + <source>Export Raw Tx</source> + <translation>导出交易</translation> + </message> + <message> + <source>Unsigned</source> + <translation>未签名</translation> + </message> + <message> + <source>Signed</source> + <translation>签名</translation> + </message> + <message> + <source>Add &Recipient</source> + <translation>添加收款人</translation> + </message> + <message> + <source>Clear &All</source> + <translation>全部清除</translation> + </message> + <message> + <source>S&end</source> + <translation>发送</translation> + </message> + <message> + <source>Send Coins</source> + <translation>支付硬币</translation> + </message> + <message> + <source>Confirm send coins</source> + <translation>确认支付</translation> + </message> + <message> + <source>Are you sure you want to send %1?</source> + <translation>你确定要支付%1个币吗?</translation> + </message> + <message> + <source> and </source> + <translation>和</translation> + </message> + <message> + <source>Load Feathercoin Transaction</source> + <translation>加载羽毛币交易</translation> + </message> + <message> + <source>Feathercoin transaction file (*.ftc)</source> + <translation>羽毛币交易文件(*.ftc)</translation> + </message> + <message> + <source>Save Feathercoin Transaction</source> + <translation>保存羽毛币交易</translation> + </message> + <message> + <source>Error exporting</source> + <translation>导出错误</translation> + </message> + <message> + <source>Could not write to file %1.</source> + <translation>不能写入文件%1。</translation> + </message> + <message> + <source>Require </source> + <translation>满足 </translation> + </message> + <message> + <source> of </source> + <translation> 总共 </translation> + </message> + <message> + <source> signatures </source> + <translation> 签名 </translation> + </message> + <message> + <source>The recipient address is not valid, please recheck.</source> + <translation>收款人地址不合法,请检查。</translation> + </message> + <message> + <source>The amount to pay must be larger than 0.</source> + <translation>支付金额必须大于0。</translation> + </message> + <message> + <source>The amount exceeds your balance.</source> + <translation>金额超出您的账上余额。</translation> + </message> + <message> + <source>The total exceeds your balance when the %1 transaction fee is included.</source> + <translation>计入 %1 交易费后的金额超出您的账上余额。</translation> + </message> + <message> + <source>Duplicate address found, can only send to each address once per send operation.</source> + <translation>发现重复的地址, 每次只能对同一地址发送一次。</translation> + </message> + <message> + <source>Transaction creation failed!</source> + <translation>交易创建失败!</translation> + </message> + <message> + <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> + <translation>错误:该交易被拒绝!发生这种错误的原因可能是:钱包中的羽毛币已经被用掉,有可能您复制了wallet.dat钱包文件,然后用复制的钱包文件支付了羽毛币,但是这个钱包文件中没有记录。</translation> + </message> +</context> +<context>
Code added
+ <source>Get my account report</source> + <translation>查看我的账户报表</translation> + </message> + <message> + <source>Manage MultiSig transactions</source> + <translation>管理多重签名交易</translation> + </message> + <message>
Code added
+ <source>&MultiSig</source> + <translation>重签签名</translation> + </message> + <message>
Code added
+ <source>Address "%1" doesn't have public key </source> + <translation>地址“%1”公匙不存在于地址簿中</translation> + </message> + <message> + <source>Address "%1" doesn't have private key </source> + <translation>地址“%1”私匙不存在于地址簿中</translation> + </message> + <message>
Code added
+ <message> + <source>Public Key</source> + <translation>公匙</translation> + </message> + <message> + <source>Private Key</source> + <translation>私匙</translation> + </message> + <message> + <source>Scan Pubkey</source> + <translation>扫描公匙</translation> + </message> + <message> + <source>Scan Secret</source> + <translation>扫描私匙</translation> + </message> + <message> + <source>Spend Pubkey</source> + <translation>发送公匙</translation> + </message> + <message> + <source>Spend Secret</source> + <translation>发送私匙</translation> + </message>
Code added
-
Feathercoin specific changes made to convert Bitcoin to FTC 0.9.6.*
Add Multisgin Page : - commit
https://github.com/FeatherCoin/Feathercoin/commit/83737e90c292f18fe0285677cefbd70125492e1a
Include a multi-signature address Page
src/qt/multisigdialog.cpp
Large new file, 966 lines of code
+#include "multisigdialog.h" +#include "ui_multisigdialog.h" + +#include "wallet.h" +#include "walletmodel.h" +#include "bitcoinunits.h" +#include "addressbookpage.h" +#include "optionsmodel.h" +#include "sendcoinsentry.h" +#include "guiutil.h" +#include "askpassphrasedialog.h" +#include "base58.h" +#include "init.h" +#include "coincontrol.h" +#include "createmultisigaddrdialog.h" +#include "rpcprotocol.h" + +#include "json/json_spirit.h" +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +#include "json/json_spirit_utils.h" +#include "json/json_spirit_value.h" +using namespace json_spirit; + +#include <QMessageBox> +#include <QTextDocument> +#include <QScrollBar> +#include <QFile> +#include <QTextStream> + +CCoinControl* MultiSigDialog::coinControl = new CCoinControl(); +CTransaction* MultiSigDialog::rawTx = new CTransaction(); + +MultiSigDialog::MultiSigDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::MultiSigDialog), + model(0) +{ + ui->setupUi(this);
Example / start of new code