From: fsb4000 Date: Sat, 29 Nov 2014 18:50:15 +0000 (+0600) Subject: multisig dialog X-Git-Tag: nvc-v0.5.0~13^2 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=43fa9dabffa5d022cc80c85219cbdd438f8e7ab6 multisig dialog Взято отсюда: https://github.com/Peerunity/Peerunity/pull/136 --- diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj index 2139f6b..5da0c92 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj @@ -51,7 +51,7 @@ false - v110 + v110_xp release\ false Application @@ -296,6 +296,9 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ + + + @@ -784,6 +787,60 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ build\moc_mintingview.cpp;%(Outputs) build\moc_mintingview.cpp;%(Outputs) + + ..\..\src\qt\multisigaddressentry.h;%(AdditionalInputs) + ..\..\src\qt\multisigaddressentry.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisigaddressentry.h -o build\moc_multisigaddressentry.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisigaddressentry.h -o build\moc_multisigaddressentry.cpp + MOC ..\..\src\qt\multisigaddressentry.h + MOC ..\..\src\qt\multisigaddressentry.h + build\moc_multisigaddressentry.cpp;%(Outputs) + build\moc_multisigaddressentry.cpp;%(Outputs) + ..\..\src\qt\multisigaddressentry.h;%(AdditionalInputs) + ..\..\src\qt\multisigaddressentry.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisigaddressentry.h -o build\moc_multisigaddressentry.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisigaddressentry.h -o build\moc_multisigaddressentry.cpp + MOC ..\..\src\qt\multisigaddressentry.h + MOC ..\..\src\qt\multisigaddressentry.h + build\moc_multisigaddressentry.cpp;%(Outputs) + build\moc_multisigaddressentry.cpp;%(Outputs) + + + ..\..\src\qt\multisigdialog.h;%(AdditionalInputs) + ..\..\src\qt\multisigdialog.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisigdialog.h -o build\moc_multisigdialog.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisigdialog.h -o build\moc_multisigdialog.cpp + MOC ..\..\src\qt\multisigdialog.h + MOC ..\..\src\qt\multisigdialog.h + build\moc_multisigdialog.cpp;%(Outputs) + build\moc_multisigdialog.cpp;%(Outputs) + ..\..\src\qt\multisigdialog.h;%(AdditionalInputs) + ..\..\src\qt\multisigdialog.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisigdialog.h -o build\moc_multisigdialog.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisigdialog.h -o build\moc_multisigdialog.cpp + MOC ..\..\src\qt\multisigdialog.h + MOC ..\..\src\qt\multisigdialog.h + build\moc_multisigdialog.cpp;%(Outputs) + build\moc_multisigdialog.cpp;%(Outputs) + + + ..\..\src\qt\multisiginputentry.h;%(AdditionalInputs) + ..\..\src\qt\multisiginputentry.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisiginputentry.h -o build\moc_multisiginputentry.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisiginputentry.h -o build\moc_multisiginputentry.cpp + MOC ..\..\src\qt\multisiginputentry.h + MOC ..\..\src\qt\multisiginputentry.h + build\moc_multisiginputentry.cpp;%(Outputs) + build\moc_multisiginputentry.cpp;%(Outputs) + ..\..\src\qt\multisiginputentry.h;%(AdditionalInputs) + ..\..\src\qt\multisiginputentry.h;%(AdditionalInputs) + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2/qtbase/include/QtCore ..\..\src\qt\multisiginputentry.h -o build\moc_multisiginputentry.cpp + C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\moc.exe -DUNICODE -DWIN32 -DQT_GUI -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/mkspecs/win32-msvc2012 -IC:/MyProjects/Novacoin/MSVC/mynovacoinqt -IC:/MyProjects/Novacoin/src -IC:/MyProjects/Novacoin/src/json -IC:/MyProjects/Novacoin/src/qt -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtWidgets -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtNetwork -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtGui -IC:/MyProjects/Deps/qt-everywhere-opensource-src-5.3.2-64/qtbase/include/QtCore ..\..\src\qt\multisiginputentry.h -o build\moc_multisiginputentry.cpp + MOC ..\..\src\qt\multisiginputentry.h + MOC ..\..\src\qt\multisiginputentry.h + build\moc_multisiginputentry.cpp;%(Outputs) + build\moc_multisiginputentry.cpp;%(Outputs) + ..\..\src\qt\qvalidatedlineedit.h;%(AdditionalInputs) @@ -990,6 +1047,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ build\moc_transactionview.cpp;%(Outputs) build\moc_transactionview.cpp;%(Outputs) + @@ -1052,6 +1110,9 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ + + + Document ..\..\src\qt\overviewpage.cpp;%(AdditionalInputs) @@ -1213,6 +1274,63 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ build\ui_editaddressdialog.h;%(Outputs) build\ui_editaddressdialog.h;%(Outputs) + + Document + ..\..\src\qt\forms\multisigaddressentry.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisigaddressentry.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigaddressentry.ui -o build\ui_multisigaddressentry.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigaddressentry.ui -o build\ui_multisigaddressentry.h + UIC ..\..\src\qt\forms\multisigaddressentry.ui + UIC ..\..\src\qt\forms\multisigaddressentry.ui + build\ui_multisigaddressentry.h;%(Outputs) + build\ui_multisigaddressentry.h;%(Outputs) + ..\..\src\qt\forms\multisigaddressentry.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisigaddressentry.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigaddressentry.ui -o build\ui_multisigaddressentry.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigaddressentry.ui -o build\ui_multisigaddressentry.h + UIC ..\..\src\qt\forms\multisigaddressentry.ui + UIC ..\..\src\qt\forms\multisigaddressentry.ui + build\ui_multisigaddressentry.h;%(Outputs) + build\ui_multisigaddressentry.h;%(Outputs) + + + Document + ..\..\src\qt\forms\multisigdialog.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisigdialog.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigdialog.ui -o build\ui_multisigdialog.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigdialog.ui -o build\ui_multisigdialog.h + UIC ..\..\src\qt\forms\multisigdialog.ui + UIC ..\..\src\qt\forms\multisigdialog.ui + build\ui_multisigdialog.h;%(Outputs) + build\ui_multisigdialog.h;%(Outputs) + ..\..\src\qt\forms\multisigdialog.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisigdialog.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigdialog.ui -o build\ui_multisigdialog.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisigdialog.ui -o build\ui_multisigdialog.h + UIC ..\..\src\qt\forms\multisigdialog.ui + UIC ..\..\src\qt\forms\multisigdialog.ui + build\ui_multisigdialog.h;%(Outputs) + build\ui_multisigdialog.h;%(Outputs) + + + Document + ..\..\src\qt\forms\multisiginputentry.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisiginputentry.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisiginputentry.ui -o build\ui_multisiginputentry.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisiginputentry.ui -o build\ui_multisiginputentry.h + UIC ..\..\src\qt\forms\multisiginputentry.ui + UIC ..\..\src\qt\forms\multisiginputentry.ui + build\ui_multisiginputentry.h;%(Outputs) + build\ui_multisiginputentry.h;%(Outputs) + ..\..\src\qt\forms\multisiginputentry.ui;%(AdditionalInputs) + ..\..\src\qt\forms\multisiginputentry.ui;%(AdditionalInputs) + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\uic.exe ..\..\src\qt\forms\multisiginputentry.ui -o build\ui_multisiginputentry.h + (set QT_PLUGIN_PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\plugins) & (set PATH=C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\lib;%PATH:)=^)%) & C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\uic.exe ..\..\src\qt\forms\multisiginputentry.ui -o build\ui_multisiginputentry.h + UIC ..\..\src\qt\forms\multisiginputentry.ui + UIC ..\..\src\qt\forms\multisiginputentry.ui + build\ui_multisiginputentry.h;%(Outputs) + build\ui_multisiginputentry.h;%(Outputs) + Document ..\..\src\qt\forms\optionsdialog.ui;%(AdditionalInputs) diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters index 04a11fd..c225ca4 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters @@ -198,6 +198,24 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Generated Files + + + Generated Files + + + Generated Files + @@ -461,6 +479,24 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Form Files + + + Form Files + + + Form Files + @@ -836,5 +872,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.user b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.user index a375ae3..0b63273 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.user +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.user @@ -1,4 +1,8 @@  - + + + + WindowsLocalDebugger + \ No newline at end of file diff --git a/novacoin-qt.pro b/novacoin-qt.pro index 5323ea0..538b168 100644 --- a/novacoin-qt.pro +++ b/novacoin-qt.pro @@ -259,7 +259,10 @@ HEADERS += src/qt/bitcoingui.h \ src/qt/rpcconsole.h \ src/version.h \ src/netbase.h \ - src/clientversion.h + src/clientversion.h \ + src/qt/multisigaddressentry.h \ + src/qt/multisiginputentry.h \ + src/qt/multisigdialog.h SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/transactiontablemodel.cpp \ @@ -331,7 +334,10 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/noui.cpp \ src/kernel.cpp \ src/scrypt.cpp \ - src/pbkdf2.cpp + src/pbkdf2.cpp \ + src/qt/multisigaddressentry.cpp \ + src/qt/multisiginputentry.cpp \ + src/qt/multisigdialog.cpp RESOURCES += \ src/qt/bitcoin.qrc @@ -348,7 +354,10 @@ FORMS += \ src/qt/forms/sendcoinsentry.ui \ src/qt/forms/askpassphrasedialog.ui \ src/qt/forms/rpcconsole.ui \ - src/qt/forms/optionsdialog.ui + src/qt/forms/optionsdialog.ui \ + src/qt/forms/multisigaddressentry.ui \ + src/qt/forms/multisiginputentry.ui \ + src/qt/forms/multisigdialog.ui contains(USE_QRCODE, 1) { HEADERS += src/qt/qrcodedialog.h diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index c15c567..05a0258 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -9,6 +9,7 @@ #include "addressbookpage.h" #include "sendcoinsdialog.h" #include "signverifymessagedialog.h" +#include "multisigdialog.h" #include "optionsdialog.h" #include "aboutdialog.h" #include "clientmodel.h" @@ -131,6 +132,8 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): signVerifyMessageDialog = new SignVerifyMessageDialog(this); + multisigPage = new MultisigDialog(this); + centralWidget = new QStackedWidget(this); centralWidget->addWidget(overviewPage); centralWidget->addWidget(transactionsPage); @@ -254,6 +257,9 @@ void BitcoinGUI::createActions() addressBookAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_6)); tabGroup->addAction(addressBookAction); + multisigAction = new QAction(QIcon(":/icons/send"), tr("Multisig"), this); + tabGroup->addAction(multisigAction); + connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); @@ -266,6 +272,8 @@ void BitcoinGUI::createActions() connect(mintingAction, SIGNAL(triggered()), this, SLOT(gotoMintingPage())); connect(addressBookAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(addressBookAction, SIGNAL(triggered()), this, SLOT(gotoAddressBookPage())); + connect(multisigAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(multisigAction, SIGNAL(triggered()), this, SLOT(gotoMultisigPage())); quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); quitAction->setToolTip(tr("Quit application")); @@ -352,6 +360,7 @@ void BitcoinGUI::createMenuBar() file->addAction(exportAction); file->addAction(signMessageAction); file->addAction(verifyMessageAction); + file->addAction(multisigAction); file->addSeparator(); file->addAction(quitAction); @@ -451,6 +460,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel) receiveCoinsPage->setModel(walletModel->getAddressTableModel()); sendCoinsPage->setModel(walletModel); signVerifyMessageDialog->setModel(walletModel); + multisigPage->setModel(walletModel); setEncryptionStatus(walletModel->getEncryptionStatus()); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); @@ -488,6 +498,7 @@ void BitcoinGUI::createTrayIcon() trayIconMenu->addAction(toggleHideAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(sendCoinsAction); + trayIconMenu->addAction(multisigAction); trayIconMenu->addAction(receiveCoinsAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(signMessageAction); @@ -927,6 +938,12 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) signVerifyMessageDialog->setAddress_VM(addr); } +void BitcoinGUI::gotoMultisigPage() +{ + multisigPage->show(); + multisigPage->setFocus(); +} + void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) { // Accept only URIs diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index df5d93e..58cf842 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -13,6 +13,7 @@ class OverviewPage; class AddressBookPage; class SendCoinsDialog; class SignVerifyMessageDialog; +class MultisigDialog; class Notificator; class RPCConsole; @@ -67,6 +68,7 @@ private: AddressBookPage *receiveCoinsPage; SendCoinsDialog *sendCoinsPage; SignVerifyMessageDialog *signVerifyMessageDialog; + MultisigDialog *multisigPage; QLabel *labelEncryptionIcon; QLabel *labelConnectionsIcon; @@ -84,6 +86,7 @@ private: QAction *addressBookAction; QAction *signMessageAction; QAction *verifyMessageAction; + QAction *multisigAction; QAction *aboutAction; QAction *receiveCoinsAction; QAction *optionsAction; @@ -145,6 +148,8 @@ public slots: void askFee(qint64 nFeeRequired, bool *payFee); void handleURI(QString strURI); + void gotoMultisigPage(); + private slots: /** Switch to overview (home) page */ void gotoOverviewPage(); diff --git a/src/qt/forms/multisigaddressentry.ui b/src/qt/forms/multisigaddressentry.ui new file mode 100644 index 0000000..41dad07 --- /dev/null +++ b/src/qt/forms/multisigaddressentry.ui @@ -0,0 +1,170 @@ + + + MultisigAddressEntry + + + + 0 + 0 + 729 + 136 + + + + Form + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + Public &key: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pubkey + + + + + + + 0 + + + + + The public key of an address + + + Enter a public key + + + + + + + Paste public key from clipboard + + + + + + + :/icons/editpaste:/icons/editpaste + + + Alt+P + + + + + + + Remove this public key + + + + + + + :/icons/remove:/icons/remove + + + + + + + + + &Address: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + address + + + + + + + 0 + + + + + true + + + Address associated to the public key + + + Enter one of your addresses to get its public key + + + + + + + Choose address from address book + + + + + + + :/icons/address-book:/icons/address-book + + + Alt+A + + + + + + + + + Label: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + true + + + Address associated to the public key + + + true + + + + + + + + QValidatedLineEdit + QLineEdit +
qvalidatedlineedit.h
+
+
+ + + + +
diff --git a/src/qt/forms/multisigdialog.ui b/src/qt/forms/multisigdialog.ui new file mode 100644 index 0000000..703f4b5 --- /dev/null +++ b/src/qt/forms/multisigdialog.ui @@ -0,0 +1,793 @@ + + + MultisigDialog + + + + 0 + 0 + 1327 + 595 + + + + Multisig + + + + + + 0 + + + + &Create Address + + + + + + true + + + + + 0 + 0 + 1283 + 345 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + Add a member to the signing pool + + + &Add public key... + + + + :/icons/add:/icons/add + + + + + + + + 0 + 0 + + + + Remove all public key fields + + + Clear all + + + + :/icons/remove:/icons/remove + + + 300 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Required signatures: + + + + + + + + 0 + 0 + + + + + 127 + 0 + + + + + + + 2 + + + true + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Enter a number + + + + + + + / 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Create multisig address + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Multisig address: + + + + + + + true + + + + + + + Copy the multisig address to the system clipboard + + + + + + + :/icons/editcopy:/icons/editcopy + + + false + + + + + + + + + + + Redeem script: + + + + + + + true + + + + + + + Copy the redeem script to the system clipboard + + + + + + + :/icons/editcopy:/icons/editcopy + + + false + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + The redeem script will be required to spend the funds sent to the multisig address + + + Save redeem script + + + + + + + Add the multisig address to your personal addresses + + + Add address to wallet + + + + + + + + + + &Spend Funds + + + + + + + + + + Inputs + + + + + + + 0 + 0 + + + + true + + + + + 0 + 0 + 616 + 271 + + + + + + + + + + Qt::Vertical + + + + 20 + 42 + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Inputs amount: + + + + + + + 123.456 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + NVC + + + + + + + + + + + Add input... + + + + :/icons/add:/icons/add + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Outputs + + + + + + + 0 + 0 + + + + true + + + + + 0 + 0 + 615 + 243 + + + + + + + + + + Qt::Vertical + + + + 20 + 42 + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Outputs amount: + + + + + + + 123.456 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + NVC + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Fee: + + + + + + + 123.456 + + + + + + + NVC + + + + + + + + + + + Add output... + + + + :/icons/add:/icons/add + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + Create transaction + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + 0 + + + + Enter a raw transaction or create a new one + + + + + + + + + + + + + + :/icons/editcopy:/icons/editcopy + + + false + + + + + + + Paste address from clipboard + + + + + + + :/icons/editpaste:/icons/editpaste + + + Alt+P + + + false + + + + + + + + + + + Sign transaction + + + + :/icons/edit:/icons/edit + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + 0 + + + + true + + + + + + + + + + + + + + :/icons/editcopy:/icons/editcopy + + + false + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Send transaction + + + + :/icons/send:/icons/send + + + + + + + + + + + + + + + + + + diff --git a/src/qt/forms/multisiginputentry.ui b/src/qt/forms/multisiginputentry.ui new file mode 100644 index 0000000..17662fc --- /dev/null +++ b/src/qt/forms/multisiginputentry.ui @@ -0,0 +1,160 @@ + + +MultisigInputEntry + + + +0 +0 +729 +136 + + + +Form + + +QFrame::StyledPanel + + +QFrame::Sunken + + + + + +0 + + + + + + + +Enter a transaction id + + + + + + + + + + + + + +:/icons/editpaste:/icons/editpaste + + +Alt+P + + + + + + + + + + + + + +:/icons/remove:/icons/remove + + + + + + + + +Transaction id: + + +Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + +transactionId + + + + + + +Transaction output: + + +Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + +Redeem script: + + +Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + +redeemScript + + + + + + +0 + + + + +true + + + + + +Enter the redeem script of the address in the transaction output + + + + + + + + + + + + + +:/icons/editpaste:/icons/editpaste + + +Alt+A + + + + + + + + + + + + +QValidatedLineEdit +QLineEdit +
qvalidatedlineedit.h
+
+
+ + + + +
\ No newline at end of file diff --git a/src/qt/multisigaddressentry.cpp b/src/qt/multisigaddressentry.cpp new file mode 100644 index 0000000..ccc0568 --- /dev/null +++ b/src/qt/multisigaddressentry.cpp @@ -0,0 +1,118 @@ +#include +#include +#include +#include + +#include "addressbookpage.h" +#include "addresstablemodel.h" +#include "base58.h" +#include "guiutil.h" +#include "key.h" +#include "multisigaddressentry.h" +#include "ui_multisigaddressentry.h" +#include "walletmodel.h" + + +MultisigAddressEntry::MultisigAddressEntry(QWidget *parent) : QFrame(parent), ui(new Ui::MultisigAddressEntry), model(0) +{ + ui->setupUi(this); + GUIUtil::setupAddressWidget(ui->address, this); +} + +MultisigAddressEntry::~MultisigAddressEntry() +{ + delete ui; +} + +void MultisigAddressEntry::setModel(WalletModel *model) +{ + this->model = model; + clear(); +} + +void MultisigAddressEntry::clear() +{ + ui->pubkey->clear(); + ui->address->clear(); + ui->label->clear(); + ui->pubkey->setFocus(); +} + +bool MultisigAddressEntry::validate() +{ + return !ui->pubkey->text().isEmpty(); +} + +QString MultisigAddressEntry::getPubkey() +{ + return ui->pubkey->text(); +} + +void MultisigAddressEntry::setRemoveEnabled(bool enabled) +{ + ui->deleteButton->setEnabled(enabled); +} + +void MultisigAddressEntry::on_pasteButton_clicked() +{ + ui->address->setText(QApplication::clipboard()->text()); +} + +void MultisigAddressEntry::on_deleteButton_clicked() +{ + emit removeEntry(this); +} + +void MultisigAddressEntry::on_addressBookButton_clicked() +{ + if(!model) + return; + + AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this); + dlg.setModel(model->getAddressTableModel()); + if(dlg.exec()) + { + ui->address->setText(dlg.getReturnValue()); + } +} + +void MultisigAddressEntry::on_pubkey_textChanged(const QString &pubkey) +{ + // Compute address from public key + std::vector vchPubKey(ParseHex(pubkey.toStdString().c_str())); + CPubKey pkey(vchPubKey); + CKeyID keyID = pkey.GetID(); + CBitcoinAddress address(keyID); + ui->address->setText(address.ToString().c_str()); + + if(!model) + return; + + // Get label of address + QString associatedLabel = model->getAddressTableModel()->labelForAddress(address.ToString().c_str()); + if(!associatedLabel.isEmpty()) + ui->label->setText(associatedLabel); +} + +void MultisigAddressEntry::on_address_textChanged(const QString &address) +{ + if(!model) + return; + + // Get public key of address + CBitcoinAddress addr(address.toStdString().c_str()); + CKeyID keyID; + if(addr.GetKeyID(keyID)) + { + CPubKey vchPubKey; + model->getPubKey(keyID, vchPubKey); + std::string pubkey = HexStr(vchPubKey.Raw()); + if(!pubkey.empty()) + ui->pubkey->setText(pubkey.c_str()); + } + + // Get label of address + QString associatedLabel = model->getAddressTableModel()->labelForAddress(address); + if(!associatedLabel.isEmpty()) + ui->label->setText(associatedLabel); +} \ No newline at end of file diff --git a/src/qt/multisigaddressentry.h b/src/qt/multisigaddressentry.h new file mode 100644 index 0000000..85f5d16 --- /dev/null +++ b/src/qt/multisigaddressentry.h @@ -0,0 +1,44 @@ +#ifndef MULTISIGADDRESSENTRY_H +#define MULTISIGADDRESSENTRY_H + +#include + + +class WalletModel; + +namespace Ui +{ + class MultisigAddressEntry; +} + +class MultisigAddressEntry : public QFrame +{ + Q_OBJECT; + + public: + explicit MultisigAddressEntry(QWidget *parent = 0); + ~MultisigAddressEntry(); + void setModel(WalletModel *model); + bool validate(); + QString getPubkey(); + + public slots: + void setRemoveEnabled(bool enabled); + void clear(); + + signals: + void removeEntry(MultisigAddressEntry *entry); + + private: + Ui::MultisigAddressEntry *ui; + WalletModel *model; + + private slots: + void on_pubkey_textChanged(const QString &pubkey); + void on_pasteButton_clicked(); + void on_deleteButton_clicked(); + void on_address_textChanged(const QString &address); + void on_addressBookButton_clicked(); +}; + +#endif // MULTISIGADDRESSENTRY_H \ No newline at end of file diff --git a/src/qt/multisigdialog.cpp b/src/qt/multisigdialog.cpp new file mode 100644 index 0000000..9d9418c --- /dev/null +++ b/src/qt/multisigdialog.cpp @@ -0,0 +1,602 @@ +#include +#include +#include +#include +#include + +#include "addresstablemodel.h" +#include "base58.h" +#include "key.h" +#include "main.h" +#include "multisigaddressentry.h" +#include "multisiginputentry.h" +#include "multisigdialog.h" +#include "ui_multisigdialog.h" +#include "script.h" +#include "sendcoinsentry.h" +#include "util.h" +#include "wallet.h" +#include "walletmodel.h" + +#ifdef USE_LEVELDB +#include "txdb-leveldb.h" +#else +#include "txdb-bdb.h" +#endif + +MultisigDialog::MultisigDialog(QWidget *parent) : QDialog(parent), ui(new Ui::MultisigDialog), model(0) +{ + ui->setupUi(this); + +#ifdef Q_WS_MAC // Icons on push buttons are very uncommon on Mac + ui->addPubKeyButton->setIcon(QIcon()); + ui->clearButton->setIcon(QIcon()); + ui->addInputButton->setIcon(QIcon()); + ui->addOutputButton->setIcon(QIcon()); + ui->signTransactionButton->setIcon(QIcon()); + ui->sendTransactionButton->setIcon(QIcon()); +#endif + + addPubKey(); + addPubKey(); + + connect(ui->addPubKeyButton, SIGNAL(clicked()), this, SLOT(addPubKey())); + connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); + + addInput(); + addOutput(); + updateAmounts(); + + connect(ui->addInputButton, SIGNAL(clicked()), this, SLOT(addInput())); + connect(ui->addOutputButton, SIGNAL(clicked()), this, SLOT(addOutput())); + + ui->signTransactionButton->setEnabled(false); + ui->sendTransactionButton->setEnabled(false); +} + +MultisigDialog::~MultisigDialog() +{ + delete ui; +} + +void MultisigDialog::setModel(WalletModel *model) +{ + this->model = model; + + for(int i = 0; i < ui->pubkeyEntries->count(); i++) + { + MultisigAddressEntry *entry = qobject_cast(ui->pubkeyEntries->itemAt(i)->widget()); + if(entry) + entry->setModel(model); + } + + + for(int i = 0; i < ui->inputs->count(); i++) + { + MultisigInputEntry *entry = qobject_cast(ui->inputs->itemAt(i)->widget()); + if(entry) + entry->setModel(model); + } + + + for(int i = 0; i < ui->outputs->count(); i++) + { + SendCoinsEntry *entry = qobject_cast(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(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(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(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 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(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((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_copyMultisigAddressButton_clicked() +{ + QApplication::clipboard()->setText(ui->multisigAddress->text()); +} + +void MultisigDialog::on_copyRedeemScriptButton_clicked() +{ + QApplication::clipboard()->setText(ui->redeemScript->text()); +} + +void MultisigDialog::on_saveRedeemScriptButton_clicked() +{ + if(!model) + return; + + CWallet *wallet = model->getWallet(); + std::string redeemScript = ui->redeemScript->text().toStdString(); + std::vector scriptData(ParseHex(redeemScript)); + CScript script(scriptData.begin(), scriptData.end()); + CScriptID scriptID = script.GetID(); + + LOCK(wallet->cs_wallet); + if(!wallet->HaveCScript(scriptID)) + wallet->AddCScript(script); +} + +void MultisigDialog::on_saveMultisigAddressButton_clicked() +{ + if(!model) + return; + + CWallet *wallet = model->getWallet(); + std::string redeemScript = ui->redeemScript->text().toStdString(); + std::string address = ui->multisigAddress->text().toStdString(); + std::string label("multisig"); + + if(!model->validateAddress(QString(address.c_str()))) + return; + + std::vector scriptData(ParseHex(redeemScript)); + CScript script(scriptData.begin(), scriptData.end()); + CScriptID scriptID = script.GetID(); + + LOCK(wallet->cs_wallet); + if(!wallet->HaveCScript(scriptID)) + wallet->AddCScript(script); + if(!wallet->mapAddressBook.count(CBitcoinAddress(address).Get())) + wallet->SetAddressBookName(CBitcoinAddress(address).Get(), label); +} + +void MultisigDialog::clear() +{ + while(ui->pubkeyEntries->count()) + delete ui->pubkeyEntries->takeAt(0)->widget(); + + addPubKey(); + addPubKey(); + updateRemoveEnabled(); +} + +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; +} + +void MultisigDialog::removeEntry(MultisigAddressEntry *entry) +{ + delete entry; + updateRemoveEnabled(); +} + +void MultisigDialog::on_createTransactionButton_clicked() +{ + CTransaction transaction; + + // Get inputs + for(int i = 0; i < ui->inputs->count(); i++) + { + MultisigInputEntry *entry = qobject_cast(ui->inputs->itemAt(i)->widget()); + if(entry) + { + if(entry->validate()) + { + CTxIn input = entry->getInput(); + transaction.vin.push_back(input); + } + else + return; + } + } + + // Get outputs + for(int i = 0; i < ui->outputs->count(); i++) + { + SendCoinsEntry *entry = qobject_cast(ui->outputs->itemAt(i)->widget()); + + if(entry) + { + if(entry->validate()) + { + SendCoinsRecipient recipient = entry->getValue(); + CBitcoinAddress address(recipient.address.toStdString()); + CScript scriptPubKey; + scriptPubKey.SetDestination(address.Get()); + int64 amount = recipient.amount; + CTxOut output(amount, scriptPubKey); + transaction.vout.push_back(output); + } + else + return; + } + } + + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << transaction; + ui->transaction->setText(HexStr(ss.begin(), ss.end()).c_str()); +} + +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 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(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(ui->outputs->itemAt(index)->widget()); + if(entry) + { + entry->setValue(recipient); + } + } + + updateRemoveEnabled(); +} + +void MultisigDialog::on_copyTransactionButton_clicked() +{ + QApplication::clipboard()->setText(ui->transaction->text()); +} + +void MultisigDialog::on_pasteTransactionButton_clicked() +{ + ui->transaction->setText(QApplication::clipboard()->text()); +} + +void MultisigDialog::on_signTransactionButton_clicked() +{ + ui->signedTransaction->clear(); + + if(!model) + return; + + CWallet *wallet = model->getWallet(); + + // Decode the raw transaction + std::vector txData(ParseHex(ui->transaction->text().toStdString())); + CDataStream ss(txData, SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + try + { + ss >> tx; + } + catch(std::exception &e) + { + return; + } + CTransaction mergedTx(tx); + + // Fetch previous transactions (inputs) + std::map mapPrevOut; + for(int i = 0; i < mergedTx.vin.size(); i++) + { + CTransaction tempTx; + MapPrevTx mapPrevTx; + CTxDB txdb("r"); + std::map unused; + bool fInvalid; + + tempTx.vin.push_back(mergedTx.vin[i]); + tempTx.FetchInputs(txdb, unused, false, false, mapPrevTx, fInvalid); + + BOOST_FOREACH(const CTxIn& txin, tempTx.vin) + { + const uint256& prevHash = txin.prevout.hash; + if(mapPrevTx.count(prevHash) && mapPrevTx[prevHash].second.vout.size() > txin.prevout.n) + mapPrevOut[txin.prevout] = mapPrevTx[prevHash].second.vout[txin.prevout.n].scriptPubKey; + } + } + + // Add the redeem scripts to the wallet keystore + for(int i = 0; i < ui->inputs->count(); i++) + { + MultisigInputEntry *entry = qobject_cast(ui->inputs->itemAt(i)->widget()); + if(entry) + { + QString redeemScriptStr = entry->getRedeemScript(); + if(redeemScriptStr.size() > 0) + { + std::vector scriptData(ParseHex(redeemScriptStr.toStdString())); + CScript redeemScript(scriptData.begin(), scriptData.end()); + wallet->AddCScript(redeemScript); + } + } + } + + WalletModel::UnlockContext ctx(model->requestUnlock()); + if(!ctx.isValid()) + return; + + // Sign what we can + bool fComplete = true; + for(int i = 0; i < mergedTx.vin.size(); i++) + { + CTxIn& txin = mergedTx.vin[i]; + if(mapPrevOut.count(txin.prevout) == 0) + { + fComplete = false; + continue; + } + const CScript& prevPubKey = mapPrevOut[txin.prevout]; + + txin.scriptSig.clear(); + SignSignature(*wallet, prevPubKey, mergedTx, i, SIGHASH_ALL); + txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, tx.vin[i].scriptSig); + if(!VerifyScript(txin.scriptSig, prevPubKey, mergedTx, i, true, 0)) + { + fComplete = false; + } + } + + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << mergedTx; + ui->signedTransaction->setText(HexStr(ssTx.begin(), ssTx.end()).c_str()); + + if(fComplete) + { + ui->statusLabel->setText(tr("Transaction signature is complete")); + ui->sendTransactionButton->setEnabled(true); + } + else + { + ui->statusLabel->setText(tr("Transaction is NOT completely signed")); + ui->sendTransactionButton->setEnabled(false); + } +} + +void MultisigDialog::on_copySignedTransactionButton_clicked() +{ + QApplication::clipboard()->setText(ui->signedTransaction->text()); +} + +void MultisigDialog::on_sendTransactionButton_clicked() +{ + int64 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); + 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); + if(ret != QMessageBox::Yes) + return; + } + else if(fee > minFee) + { + QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Confirm send transaction"), tr("The fee of the transaction (%1 NVC) is bigger 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); + if(ret != QMessageBox::Yes) + return; + } + + // Decode the raw transaction + std::vector txData(ParseHex(ui->signedTransaction->text().toStdString())); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + try + { + ssData >> tx; + } + catch(std::exception &e) + { + return; + } + uint256 txHash = tx.GetHash(); + + // Check if the transaction is already in the blockchain + CTransaction existingTx; + uint256 blockHash = 0; + if(GetTransaction(txHash, existingTx, blockHash)) + { + if(blockHash != 0) + return; + } + + // Send the transaction to the local node + CTxDB txdb("r"); + if(!tx.AcceptToMemoryPool(txdb, false)) + return; + SyncWithWallets(tx, NULL, true); + //(CInv(MSG_TX, txHash), tx); + RelayTransaction(tx, txHash); +} + +MultisigInputEntry * MultisigDialog::addInput() +{ + MultisigInputEntry *entry = new MultisigInputEntry(this); + + entry->setModel(model); + ui->inputs->addWidget(entry); + connect(entry, SIGNAL(removeEntry(MultisigInputEntry *)), this, SLOT(removeEntry(MultisigInputEntry *))); + connect(entry, SIGNAL(updateAmount()), this, SLOT(updateAmounts())); + updateRemoveEnabled(); + entry->clear(); + ui->scrollAreaWidgetContents_2->resize(ui->scrollAreaWidgetContents_2->sizeHint()); + QScrollBar *bar = ui->scrollArea_2->verticalScrollBar(); + if(bar) + bar->setSliderPosition(bar->maximum()); + + return entry; +} + +void MultisigDialog::removeEntry(MultisigInputEntry *entry) +{ + delete entry; + updateRemoveEnabled(); +} + +SendCoinsEntry * MultisigDialog::addOutput() +{ + SendCoinsEntry *entry = new SendCoinsEntry(this); + + entry->setModel(model); + ui->outputs->addWidget(entry); + connect(entry, SIGNAL(removeEntry(SendCoinsEntry *)), this, SLOT(removeEntry(SendCoinsEntry *))); + connect(entry, SIGNAL(payAmountChanged()), this, SLOT(updateAmounts())); + updateRemoveEnabled(); + entry->clear(); + ui->scrollAreaWidgetContents_3->resize(ui->scrollAreaWidgetContents_3->sizeHint()); + QScrollBar *bar = ui->scrollArea_3->verticalScrollBar(); + if(bar) + bar->setSliderPosition(bar->maximum()); + + return entry; +} + +void MultisigDialog::removeEntry(SendCoinsEntry *entry) +{ + delete entry; + updateRemoveEnabled(); +} + +void MultisigDialog::updateAmounts() +{ + // Update inputs amount + int64 inputsAmount = 0; + for(int i = 0; i < ui->inputs->count(); i++) + { + MultisigInputEntry *entry = qobject_cast(ui->inputs->itemAt(i)->widget()); + if(entry) + inputsAmount += entry->getAmount(); + } + QString inputsAmountStr; + inputsAmountStr.sprintf("%.6f", (double) inputsAmount / COIN); + ui->inputsAmount->setText(inputsAmountStr); + + // Update outputs amount + int64 outputsAmount = 0; + for(int i = 0; i < ui->outputs->count(); i++) + { + SendCoinsEntry *entry = qobject_cast(ui->outputs->itemAt(i)->widget()); + if(entry) + outputsAmount += entry->getValue().amount; + } + QString outputsAmountStr; + outputsAmountStr.sprintf("%.6f", (double) outputsAmount / COIN); + ui->outputsAmount->setText(outputsAmountStr); + + // Update Fee amount + int64 fee = inputsAmount - outputsAmount; + QString feeStr; + feeStr.sprintf("%.6f", (double) fee / COIN); + ui->fee->setText(feeStr); +} \ No newline at end of file diff --git a/src/qt/multisigdialog.h b/src/qt/multisigdialog.h new file mode 100644 index 0000000..2b6c53a --- /dev/null +++ b/src/qt/multisigdialog.h @@ -0,0 +1,57 @@ +#ifndef MULTISIGDIALOG_H +#define MULTISIGDIALOG_H + +#include + +#include "multisigaddressentry.h" +#include "multisiginputentry.h" +#include "sendcoinsentry.h" +#include "walletmodel.h" + + +namespace Ui +{ + class MultisigDialog; +} + +class MultisigDialog : public QDialog +{ + Q_OBJECT; + + public: + explicit MultisigDialog(QWidget *parent); + MultisigDialog(); + void setModel(WalletModel *model); + + public slots: + MultisigAddressEntry * addPubKey(); + void clear(); + void updateRemoveEnabled(); + MultisigInputEntry * addInput(); + SendCoinsEntry * addOutput(); + + private: + Ui::MultisigDialog *ui; + WalletModel *model; + ~MultisigDialog(); + + private slots: + void on_createAddressButton_clicked(); + void on_copyMultisigAddressButton_clicked(); + void on_copyRedeemScriptButton_clicked(); + void on_saveRedeemScriptButton_clicked(); + void on_saveMultisigAddressButton_clicked(); + void removeEntry(MultisigAddressEntry *entry); + void on_createTransactionButton_clicked(); + void on_transaction_textChanged(); + void on_copyTransactionButton_clicked(); + void on_pasteTransactionButton_clicked(); + void on_signTransactionButton_clicked(); + void on_copySignedTransactionButton_clicked(); + void on_sendTransactionButton_clicked(); + void removeEntry(MultisigInputEntry *entry); + void removeEntry(SendCoinsEntry *entry); + void updateAmounts(); +}; + +#endif // MULTISIGDIALOG_H \ No newline at end of file diff --git a/src/qt/multisiginputentry.cpp b/src/qt/multisiginputentry.cpp new file mode 100644 index 0000000..eb652f9 --- /dev/null +++ b/src/qt/multisiginputentry.cpp @@ -0,0 +1,174 @@ +#include +#include +#include +#include + +#include "base58.h" +#include "multisiginputentry.h" +#include "ui_multisiginputentry.h" +#include "main.h" +#include "script.h" +#include "util.h" +#include "wallet.h" +#include "walletmodel.h" + + +MultisigInputEntry::MultisigInputEntry(QWidget *parent) : QFrame(parent), ui(new Ui::MultisigInputEntry), model(0) +{ + ui->setupUi(this); +} + +MultisigInputEntry::~MultisigInputEntry() +{ + delete ui; +} + +void MultisigInputEntry::setModel(WalletModel *model) +{ + this->model = model; + clear(); +} + +void MultisigInputEntry::clear() +{ + ui->transactionId->clear(); + ui->transactionOutput->clear(); + ui->redeemScript->clear(); +} + +bool MultisigInputEntry::validate() +{ + return (ui->transactionOutput->count() > 0); +} + +CTxIn MultisigInputEntry::getInput() +{ + int nOutput = ui->transactionOutput->currentIndex(); + CTxIn input(COutPoint(txHash, nOutput)); + + return input; +} + +int64 MultisigInputEntry::getAmount() +{ + int64 amount = 0; + int nOutput = ui->transactionOutput->currentIndex(); + CTransaction tx; + uint256 blockHash = 0; + + if(GetTransaction(txHash, tx, blockHash)) + { + if(nOutput < tx.vout.size()) + { + const CTxOut& txOut = tx.vout[nOutput]; + amount = txOut.nValue; + } + } + + return amount; +} + +QString MultisigInputEntry::getRedeemScript() +{ + return ui->redeemScript->text(); +} + +void MultisigInputEntry::setTransactionId(QString transactionId) +{ + ui->transactionId->setText(transactionId); +} + +void MultisigInputEntry::setTransactionOutputIndex(int index) +{ + ui->transactionOutput->setCurrentIndex(index); +} + +void MultisigInputEntry::setRemoveEnabled(bool enabled) +{ + ui->deleteButton->setEnabled(enabled); +} + +void MultisigInputEntry::on_pasteTransactionIdButton_clicked() +{ + ui->transactionId->setText(QApplication::clipboard()->text()); +} + +void MultisigInputEntry::on_deleteButton_clicked() +{ + emit removeEntry(this); +} + +void MultisigInputEntry::on_pasteRedeemScriptButton_clicked() +{ + ui->redeemScript->setText(QApplication::clipboard()->text()); +} + +void MultisigInputEntry::on_transactionId_textChanged(const QString &transactionId) +{ + ui->transactionOutput->clear(); + if(transactionId.isEmpty()) + return; + + // Make list of transaction outputs + txHash.SetHex(transactionId.toStdString().c_str()); + CTransaction tx; + uint256 blockHash = 0; + if(!GetTransaction(txHash, tx, blockHash)) + return; + for(int i = 0; i < tx.vout.size(); i++) + { + QString idStr; + idStr.setNum(i); + const CTxOut& txOut = tx.vout[i]; + int64 amount = txOut.nValue; + QString amountStr; + amountStr.sprintf("%.6f", (double) amount / COIN); + CScript script = txOut.scriptPubKey; + CTxDestination addr; + if(ExtractDestination(script, addr)) + { + CBitcoinAddress address(addr); + QString addressStr(address.ToString().c_str()); + ui->transactionOutput->addItem(idStr + QString(" - ") + addressStr + QString(" - ") + amountStr + QString(" NVC")); + } + else + ui->transactionOutput->addItem(idStr + QString(" - ") + amountStr + QString(" NVC")); + } +} + +void MultisigInputEntry::on_transactionOutput_currentIndexChanged(int index) +{ + if(ui->transactionOutput->itemText(index).isEmpty()) + return; + + CTransaction tx; + uint256 blockHash = 0; + if(!GetTransaction(txHash, tx, blockHash)) + return; + const CTxOut& txOut = tx.vout[index]; + CScript script = txOut.scriptPubKey; + + if(script.IsPayToScriptHash()) + { + ui->redeemScript->setEnabled(true); + + if(model) + { + // Try to find the redeem script + CTxDestination dest; + if(ExtractDestination(script, dest)) + { + CScriptID scriptID = boost::get(dest); + CScript redeemScript; + if(model->getWallet()->GetCScript(scriptID, redeemScript)) + ui->redeemScript->setText(HexStr(redeemScript.begin(), redeemScript.end()).c_str()); + } + } + } + else + { + ui->redeemScript->setEnabled(false); + } + + emit updateAmount(); +} \ No newline at end of file diff --git a/src/qt/multisiginputentry.h b/src/qt/multisiginputentry.h new file mode 100644 index 0000000..6f73656 --- /dev/null +++ b/src/qt/multisiginputentry.h @@ -0,0 +1,53 @@ +#ifndef MULTISIGINPUTENTRY_H +#define MULTISIGINPUTENTRY_H + +#include + +#include "uint256.h" + + +class CTxIn; +class WalletModel; + +namespace Ui +{ + class MultisigInputEntry; +} + +class MultisigInputEntry : public QFrame +{ + Q_OBJECT; + + public: + explicit MultisigInputEntry(QWidget *parent = 0); + ~MultisigInputEntry(); + void setModel(WalletModel *model); + bool validate(); + CTxIn getInput(); + int64 getAmount(); + QString getRedeemScript(); + void setTransactionId(QString transactionId); + void setTransactionOutputIndex(int index); + + public slots: + void setRemoveEnabled(bool enabled); + void clear(); + + signals: + void removeEntry(MultisigInputEntry *entry); + void updateAmount(); + + private: + Ui::MultisigInputEntry *ui; + WalletModel *model; + uint256 txHash; + + private slots: + void on_transactionId_textChanged(const QString &transactionId); + void on_pasteTransactionIdButton_clicked(); + void on_deleteButton_clicked(); + void on_transactionOutput_currentIndexChanged(int index); + void on_pasteRedeemScriptButton_clicked(); +}; + +#endif // MULTISIGINPUTENTRY_H \ No newline at end of file diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 997a786..79d84ab 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -500,4 +500,9 @@ void WalletModel::listLockedCoins(std::vector& vOutpts) void WalletModel::clearOrphans() { wallet->ClearOrphans(); +} + +CWallet* WalletModel::getWallet() +{ + return wallet; } \ No newline at end of file diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 706fe3f..3c1bcbc 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -135,6 +135,7 @@ public: void unlockCoin(COutPoint& output); void listLockedCoins(std::vector& vOutpts); void clearOrphans(); + CWallet* getWallet(); private: CWallet *wallet;