aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bitcoin-qt.pro13
-rw-r--r--doc/build-msw.txt6
-rw-r--r--doc/translation_process.md53
-rw-r--r--src/bignum.h12
-rw-r--r--src/bitcoinrpc.cpp19
-rw-r--r--src/init.cpp4
-rw-r--r--src/irc.cpp4
-rw-r--r--src/main.cpp24
-rw-r--r--src/main.h6
-rw-r--r--src/makefile.mingw4
-rw-r--r--src/makefile.unix13
-rw-r--r--src/net.cpp38
-rw-r--r--src/netbase.cpp2
-rw-r--r--src/qt/addressbookpage.cpp40
-rw-r--r--src/qt/addressbookpage.h8
-rw-r--r--src/qt/bitcoin.cpp21
-rw-r--r--src/qt/bitcoingui.cpp101
-rw-r--r--src/qt/bitcoingui.h16
-rw-r--r--src/qt/bitcoinstrings.cpp17
-rw-r--r--src/qt/clientmodel.cpp2
-rw-r--r--src/qt/forms/addressbookpage.ui22
-rw-r--r--src/qt/forms/messagepage.ui181
-rw-r--r--src/qt/forms/qrcodedialog.ui242
-rw-r--r--src/qt/forms/rpcconsole.ui72
-rw-r--r--src/qt/forms/signverifymessagedialog.ui386
-rw-r--r--src/qt/forms/transactiondescdialog.ui2
-rw-r--r--src/qt/forms/verifymessagedialog.ui140
-rw-r--r--src/qt/guiconstants.h10
-rw-r--r--src/qt/locale/bitcoin_en.ts1019
-rw-r--r--src/qt/messagepage.cpp143
-rw-r--r--src/qt/messagepage.h42
-rw-r--r--src/qt/optionsdialog.cpp10
-rw-r--r--src/qt/optionsmodel.cpp66
-rw-r--r--src/qt/optionsmodel.h30
-rw-r--r--src/qt/qrcodedialog.cpp87
-rw-r--r--src/qt/qrcodedialog.h18
-rw-r--r--src/qt/qtipcserver.cpp96
-rw-r--r--src/qt/qtipcserver.h7
-rw-r--r--src/qt/rpcconsole.cpp4
-rw-r--r--src/qt/signverifymessagedialog.cpp274
-rw-r--r--src/qt/signverifymessagedialog.h49
-rw-r--r--src/qt/transactiondesc.cpp84
-rw-r--r--src/qt/transactionview.cpp2
-rw-r--r--src/qt/verifymessagedialog.cpp119
-rw-r--r--src/qt/verifymessagedialog.h33
-rw-r--r--src/qt/walletmodel.cpp47
-rw-r--r--src/qt/walletmodel.h11
-rw-r--r--src/rpcrawtransaction.cpp60
-rw-r--r--src/util.cpp19
-rw-r--r--src/util.h52
-rw-r--r--src/walletdb.cpp3
51 files changed, 1872 insertions, 1861 deletions
diff --git a/bitcoin-qt.pro b/bitcoin-qt.pro
index 097cdf700a..f432d0e4d3 100644
--- a/bitcoin-qt.pro
+++ b/bitcoin-qt.pro
@@ -81,7 +81,7 @@ contains(BITCOIN_NEED_QT_PLUGINS, 1) {
}
# regenerate src/build.h
-!windows || contains(USE_BUILD_INFO, 1) {
+!windows|contains(USE_BUILD_INFO, 1) {
genbuild.depends = FORCE
genbuild.commands = cd $$PWD; /bin/sh share/genbuild.sh $$OUT_PWD/build/build.h
genbuild.target = $$OUT_PWD/build/build.h
@@ -100,7 +100,7 @@ HEADERS += src/qt/bitcoingui.h \
src/qt/optionsdialog.h \
src/qt/sendcoinsdialog.h \
src/qt/addressbookpage.h \
- src/qt/messagepage.h \
+ src/qt/signverifymessagedialog.h \
src/qt/aboutdialog.h \
src/qt/editaddressdialog.h \
src/qt/bitcoinaddressvalidator.h \
@@ -160,8 +160,7 @@ HEADERS += src/qt/bitcoingui.h \
src/qt/qtipcserver.h \
src/allocators.h \
src/ui_interface.h \
- src/qt/rpcconsole.h \
- src/qt/verifymessagedialog.h
+ src/qt/rpcconsole.h
SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
src/qt/transactiontablemodel.cpp \
@@ -169,7 +168,7 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
src/qt/optionsdialog.cpp \
src/qt/sendcoinsdialog.cpp \
src/qt/addressbookpage.cpp \
- src/qt/messagepage.cpp \
+ src/qt/signverifymessagedialog.cpp \
src/qt/aboutdialog.cpp \
src/qt/editaddressdialog.cpp \
src/qt/bitcoinaddressvalidator.cpp \
@@ -220,7 +219,6 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
src/qt/notificator.cpp \
src/qt/qtipcserver.cpp \
src/qt/rpcconsole.cpp \
- src/qt/verifymessagedialog.cpp \
src/noui.cpp
RESOURCES += \
@@ -229,7 +227,7 @@ RESOURCES += \
FORMS += \
src/qt/forms/sendcoinsdialog.ui \
src/qt/forms/addressbookpage.ui \
- src/qt/forms/messagepage.ui \
+ src/qt/forms/signverifymessagedialog.ui \
src/qt/forms/aboutdialog.ui \
src/qt/forms/editaddressdialog.ui \
src/qt/forms/transactiondescdialog.ui \
@@ -237,7 +235,6 @@ FORMS += \
src/qt/forms/sendcoinsentry.ui \
src/qt/forms/askpassphrasedialog.ui \
src/qt/forms/rpcconsole.ui \
- src/qt/forms/verifymessagedialog.ui \
src/qt/forms/optionsdialog.ui
contains(USE_QRCODE, 1) {
diff --git a/doc/build-msw.txt b/doc/build-msw.txt
index ad23e68675..d4ae51d3f1 100644
--- a/doc/build-msw.txt
+++ b/doc/build-msw.txt
@@ -24,7 +24,7 @@ Dependencies
Libraries you need to download separately and build:
default path download
-OpenSSL \openssl-1.0.1d-mgw http://www.openssl.org/source/
+OpenSSL \openssl-1.0.1b-mgw http://www.openssl.org/source/
Berkeley DB \db-4.8.30.NC-mgw http://www.oracle.com/technology/software/products/berkeley-db/index.html
Boost \boost-1.47.0-mgw http://www.boost.org/users/download/
miniupnpc \miniupnpc-1.6-mgw http://miniupnp.tuxfamily.org/files/
@@ -36,7 +36,7 @@ Boost MIT-like license
miniupnpc New (3-clause) BSD license
Versions used in this release:
-OpenSSL 1.0.1d
+OpenSSL 1.0.1b
Berkeley DB 4.8.30.NC
Boost 1.47.0
miniupnpc 1.6
@@ -48,7 +48,7 @@ MSYS shell:
un-tar sources with MSYS 'tar xfz' to avoid issue with symlinks (OpenSSL ticket 2377)
change 'MAKE' env. variable from 'C:\MinGW32\bin\mingw32-make.exe' to '/c/MinGW32/bin/mingw32-make.exe'
-cd /c/openssl-1.0.1d-mgw
+cd /c/openssl-1.0.1b-mgw
./config
make
diff --git a/doc/translation_process.md b/doc/translation_process.md
index 3ddfc0cbf4..c483020989 100644
--- a/doc/translation_process.md
+++ b/doc/translation_process.md
@@ -28,32 +28,55 @@ This directory contains all translations. Filenames must adhere to this format:
bitcoin_xx_YY.ts or bitcoin_xx.ts
-#### Source file
+#### bitcoin_en.ts (Source file)
`src/qt/locale/bitcoin_en.ts` is treated in a special way. It is used as the
source for all other translations. Whenever a string in the code is changed
-this file must be updated to reflect those changes. Usually, this can be
-accomplished by running `lupdate` (included in the Qt SDK).
+this file must be updated to reflect those changes. This can be accomplished
+by running `lupdate` (included in the Qt SDK). Also, a custom script is used
+to extract strings from the non-Qt parts:
-An updated source file should be merged to github and transifex will pick it
-up from there. Afterwards the new strings show up as "Remaining" in transifex
-and can be translated.
+ python share/qt/extract_strings_qt.py
+ lupdate bitcoin-qt.pro -no-obsolete -locations none -ts src/qt/locale/bitcoin_en.ts
+
+##### Handling of plurals in the source file
+
+When new plurals are added to the source file, it's important to do the following steps:
+
+1. Open bitcoin_en.ts in Qt Linguist (also included in the Qt SDK)
+2. Search for `%n`, which will take you to the parts in the translation that use plurals
+3. Look for empty `English Translation (Singular)` and `English Translation (Plural)` fields
+4. Add the appropriate strings for the singular and plural form of the base string
+5. Mark the item as done (via the green arrow symbol in the toolbar)
+6. Repeat from step 2. until all singular and plural forms are in the source file
+7. Save the source file
+
+##### Creating the pull-request
+
+An updated source file should be merged to github and Transifex will pick it
+up from there (can take some hours). Afterwards the new strings show up as "Remaining"
+in Transifex and can be translated.
+
+To create the pull-request you have to do:
+
+ git add src/qt/bitcoinstrings.cpp src/qt/locale/bitcoin_en.ts
+ git commit
-Syncing with transifex
+Syncing with Transifex
----------------------
-We are using http://transifex.net as a frontend for translating the client.
+We are using https://transifex.com as a frontend for translating the client.
-https://www.transifex.net/projects/p/bitcoin/resource/tx/
+https://www.transifex.com/projects/p/bitcoin/resource/tx/
-The "transifex client" (see: http://help.transifex.net/features/client/)
-will help with fetching new translations from transifex. Use the following
-config to be able to connect with the client.
+The "Transifex client" (see: http://help.transifex.com/features/client/)
+will help with fetching new translations from Transifex. Use the following
+config to be able to connect with the client:
### .tx/config
[main]
- host = https://www.transifex.net
+ host = https://www.transifex.com
[bitcoin.tx]
file_filter = src/qt/locale/bitcoin_<lang>.ts
@@ -63,14 +86,14 @@ config to be able to connect with the client.
### .tx/config (for Windows)
[main]
- host = https://www.transifex.net
+ host = https://www.transifex.com
[bitcoin.tx]
file_filter = src\qt\locale\bitcoin_<lang>.ts
source_file = src\qt\locale\bitcoin_en.ts
source_lang = en
-It is also possible to directly download new translations one by one from transifex.
+It is also possible to directly download new translations one by one from the Transifex website.
### Fetching new translations
diff --git a/src/bignum.h b/src/bignum.h
index 9af934051a..47f6229431 100644
--- a/src/bignum.h
+++ b/src/bignum.h
@@ -131,15 +131,9 @@ public:
if (sn < (int64)0)
{
- // We negate in 2 steps to avoid signed subtraction overflow,
- // i.e. -(-2^63), which is an undefined operation and causes SIGILL
- // when compiled with -ftrapv.
- //
- // Note that uint64_t n = sn, when sn is an int64_t, is a
- // well-defined operation and n will be equal to sn + 2^64 when sn
- // is negative.
- n = sn;
- n = -n;
+ // Since the minimum signed integer cannot be represented as positive so long as its type is signed, and it's not well-defined what happens if you make it unsigned before negating it, we instead increment the negative integer by 1, convert it, then increment the (now positive) unsigned integer by 1 to compensate
+ n = -(sn + 1);
+ ++n;
fNegative = true;
} else {
n = sn;
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index 62b0b497ed..85ef9031c7 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -1569,11 +1569,17 @@ Value keypoolrefill(const Array& params, bool fHelp)
void ThreadTopUpKeyPool(void* parg)
{
+ // Make this thread recognisable as the key-topping-up thread
+ RenameThread("bitcoin-key-top");
+
pwalletMain->TopUpKeyPool();
}
void ThreadCleanWalletPassphrase(void* parg)
{
+ // Make this thread recognisable as the wallet relocking thread
+ RenameThread("bitcoin-lock-wa");
+
int64 nMyWakeTime = GetTimeMillis() + *((int64*)parg) * 1000;
ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime);
@@ -2479,6 +2485,10 @@ private:
void ThreadRPCServer(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg));
+
+ // Make this thread recognisable as the RPC listener
+ RenameThread("bitcoin-rpclist");
+
try
{
vnThreadsRunning[THREAD_RPCLISTENER]++;
@@ -2762,6 +2772,10 @@ static CCriticalSection cs_THREAD_RPCHANDLER;
void ThreadRPCServer3(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer3(parg));
+
+ // Make this thread recognisable as the RPC handler
+ RenameThread("bitcoin-rpchand");
+
{
LOCK(cs_THREAD_RPCHANDLER);
vnThreadsRunning[THREAD_RPCHANDLER]++;
@@ -2943,8 +2957,9 @@ void ConvertTo(Value& value)
{
// reinterpret string as unquoted json value
Value value2;
- if (!read_string(value.get_str(), value2))
- throw runtime_error("type mismatch");
+ string strJSON = value.get_str();
+ if (!read_string(strJSON, value2))
+ throw runtime_error(string("Error parsing JSON:")+strJSON);
value = value2.get_value<T>();
}
else
diff --git a/src/init.cpp b/src/init.cpp
index 5c87af9112..83870f9f8c 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -53,6 +53,10 @@ void Shutdown(void* parg)
{
static CCriticalSection cs_Shutdown;
static bool fTaken;
+
+ // Make this thread recognisable as the shutdown thread
+ RenameThread("bitcoin-shutoff");
+
bool fFirstThread = false;
{
TRY_LOCK(cs_Shutdown, lockShutdown);
diff --git a/src/irc.cpp b/src/irc.cpp
index 185be02f29..a790d3f4f9 100644
--- a/src/irc.cpp
+++ b/src/irc.cpp
@@ -189,6 +189,10 @@ bool GetIPFromIRC(SOCKET hSocket, string strMyName, CNetAddr& ipRet)
void ThreadIRCSeed(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadIRCSeed(parg));
+
+ // Make this thread recognisable as the IRC seeding thread
+ RenameThread("bitcoin-ircseed");
+
try
{
ThreadIRCSeed2(parg);
diff --git a/src/main.cpp b/src/main.cpp
index b4e827098e..c4472c4556 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -268,6 +268,9 @@ bool CTransaction::ReadFromDisk(COutPoint prevout)
bool CTransaction::IsStandard() const
{
+ if (nVersion > CTransaction::CURRENT_VERSION)
+ return false;
+
BOOST_FOREACH(const CTxIn& txin, vin)
{
// Biggest 'standard' txin is a 3-signature 3-of-3 CHECKMULTISIG
@@ -1620,6 +1623,24 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew)
hashBestChain.ToString().substr(0,20).c_str(), nBestHeight, bnBestChainWork.ToString().c_str(),
DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime()).c_str());
+ // Check the version of the last 100 blocks to see if we need to upgrade:
+ if (!fIsInitialDownload)
+ {
+ int nUpgraded = 0;
+ const CBlockIndex* pindex = pindexBest;
+ for (int i = 0; i < 100 && pindex != NULL; i++)
+ {
+ if (pindex->nVersion > CBlock::CURRENT_VERSION)
+ ++nUpgraded;
+ pindex = pindex->pprev;
+ }
+ if (nUpgraded > 0)
+ printf("SetBestChain: %d of last 100 blocks above version %d\n", nUpgraded, CBlock::CURRENT_VERSION);
+ if (nUpgraded > 100/2)
+ // strMiscWarning is read by GetWarnings(), called by Qt and the JSON-RPC code to warn the user:
+ strMiscWarning = _("Warning: this version is obsolete, upgrade required");
+ }
+
std::string strCmd = GetArg("-blocknotify", "");
if (!fIsInitialDownload && !strCmd.empty())
@@ -3573,6 +3594,9 @@ void static BitcoinMiner(CWallet *pwallet)
printf("BitcoinMiner started\n");
SetThreadPriority(THREAD_PRIORITY_LOWEST);
+ // Make this thread recognisable as the mining thread
+ RenameThread("bitcoin-miner");
+
// Each thread has its own key and counter
CReserveKey reservekey(pwallet);
unsigned int nExtraNonce = 0;
diff --git a/src/main.h b/src/main.h
index c841fdaf18..b3cc9ab40e 100644
--- a/src/main.h
+++ b/src/main.h
@@ -386,6 +386,7 @@ typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
class CTransaction
{
public:
+ static const int CURRENT_VERSION=1;
int nVersion;
std::vector<CTxIn> vin;
std::vector<CTxOut> vout;
@@ -411,7 +412,7 @@ public:
void SetNull()
{
- nVersion = 1;
+ nVersion = CTransaction::CURRENT_VERSION;
vin.clear();
vout.clear();
nLockTime = 0;
@@ -817,6 +818,7 @@ class CBlock
{
public:
// header
+ static const int CURRENT_VERSION=1;
int nVersion;
uint256 hashPrevBlock;
uint256 hashMerkleRoot;
@@ -858,7 +860,7 @@ public:
void SetNull()
{
- nVersion = 1;
+ nVersion = CBlock::CURRENT_VERSION;
hashPrevBlock = 0;
hashMerkleRoot = 0;
nTime = 0;
diff --git a/src/makefile.mingw b/src/makefile.mingw
index c270d4599a..3649afd0e9 100644
--- a/src/makefile.mingw
+++ b/src/makefile.mingw
@@ -7,12 +7,12 @@ USE_UPNP:=0
INCLUDEPATHS= \
-I"C:\boost-1.49.0-mgw" \
-I"C:\db-4.8.30.NC-mgw\build_unix" \
- -I"C:\openssl-1.0.0d-mgw\include"
+ -I"C:\openssl-1.0.1b-mgw\include"
LIBPATHS= \
-L"C:\boost-1.49.0-mgw\stage\lib" \
-L"C:\db-4.8.30.NC-mgw\build_unix" \
- -L"C:\openssl-1.0.0d-mgw"
+ -L"C:\openssl-1.0.1b-mgw"
LIBS= \
-l boost_system-mgw45-mt-s-1_49 \
diff --git a/src/makefile.unix b/src/makefile.unix
index 2784335a20..a81300329e 100644
--- a/src/makefile.unix
+++ b/src/makefile.unix
@@ -66,13 +66,14 @@ LIBS+= \
# Make some important things such as the global offset table read only as soon as
# the dynamic linker is finished building it. This will prevent overwriting of addresses
# which would later be jumped to.
- HARDENING+=-Wl,-z,relro -Wl,-z,now
+ LDHARDENING+=-Wl,-z,relro -Wl,-z,now
# Build position independent code to take advantage of Address Space Layout Randomization
# offered by some kernels.
# see doc/build-unix.txt for more information.
ifdef PIE
- HARDENING+=-fPIE -pie
+ HARDENING+=-fPIE
+ LDHARDENING+=-pie
endif
# -D_FORTIFY_SOURCE=2 does some checking for potentially exploitable code patterns in
@@ -88,6 +89,10 @@ DEBUGFLAGS=-g
xCXXFLAGS=-O2 -pthread -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter \
$(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS)
+# LDFLAGS can be specified on the make command line, so we use xLDFLAGS that only
+# adds some defaults in front. Unfortunately, LDFLAGS=... $(LDFLAGS) does not work.
+xLDFLAGS=$(LDHARDENING) $(LDFLAGS)
+
OBJS= \
obj/version.o \
obj/checkpoints.o \
@@ -133,7 +138,7 @@ obj/%.o: %.cpp
rm -f $(@:%.o=%.d)
bitcoind: $(OBJS:obj/%=obj/%)
- $(CXX) $(xCXXFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)
+ $(CXX) $(xCXXFLAGS) -o $@ $^ $(xLDFLAGS) $(LIBS)
TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp))
@@ -145,7 +150,7 @@ obj-test/%.o: test/%.cpp
rm -f $(@:%.o=%.d)
test_bitcoin: $(TESTOBJS) $(filter-out obj/init.o,$(OBJS:obj/%=obj/%))
- $(CXX) $(xCXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-B$(LMODE) -lboost_unit_test_framework $(LDFLAGS) $(LIBS)
+ $(CXX) $(xCXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-B$(LMODE) -lboost_unit_test_framework $(xLDFLAGS) $(LIBS)
clean:
-rm -f bitcoind test_bitcoin
diff --git a/src/net.cpp b/src/net.cpp
index e10829aca3..f3c255c308 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -407,6 +407,9 @@ bool GetMyExternalIP(CNetAddr& ipRet)
void ThreadGetMyExternalIP(void* parg)
{
+ // Make this thread recognisable as the external IP detection thread
+ RenameThread("bitcoin-ext-ip");
+
CNetAddr addrLocalHost;
if (GetMyExternalIP(addrLocalHost))
{
@@ -636,6 +639,10 @@ void CNode::copyStats(CNodeStats &stats)
void ThreadSocketHandler(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg));
+
+ // Make this thread recognisable as the networking thread
+ RenameThread("bitcoin-net");
+
try
{
vnThreadsRunning[THREAD_SOCKETHANDLER]++;
@@ -988,6 +995,10 @@ void ThreadSocketHandler2(void* parg)
void ThreadMapPort(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadMapPort(parg));
+
+ // Make this thread recognisable as the UPnP thread
+ RenameThread("bitcoin-UPnP");
+
try
{
vnThreadsRunning[THREAD_UPNP]++;
@@ -1137,15 +1148,19 @@ void MapPort()
// The first name is used as information source for addrman.
// The second name should resolve to a list of seed addresses.
static const char *strDNSSeed[][2] = {
- {"xf2.org", "bitseed.xf2.org"},
- {"bluematt.me", "dnsseed.bluematt.me"},
{"bitcoin.sipa.be", "seed.bitcoin.sipa.be"},
+ {"bluematt.me", "dnsseed.bluematt.me"},
{"dashjr.org", "dnsseed.bitcoin.dashjr.org"},
+ {"xf2.org", "bitseed.xf2.org"},
};
void ThreadDNSAddressSeed(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadDNSAddressSeed(parg));
+
+ // Make this thread recognisable as the DNS seeding thread
+ RenameThread("bitcoin-dnsseed");
+
try
{
vnThreadsRunning[THREAD_DNSSEED]++;
@@ -1315,6 +1330,10 @@ void ThreadDumpAddress2(void* parg)
void ThreadDumpAddress(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadDumpAddress(parg));
+
+ // Make this thread recognisable as the address dumping thread
+ RenameThread("bitcoin-adrdump");
+
try
{
ThreadDumpAddress2(parg);
@@ -1328,6 +1347,10 @@ void ThreadDumpAddress(void* parg)
void ThreadOpenConnections(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
+
+ // Make this thread recognisable as the connection opening thread
+ RenameThread("bitcoin-opencon");
+
try
{
vnThreadsRunning[THREAD_OPENCONNECTIONS]++;
@@ -1481,6 +1504,10 @@ void ThreadOpenConnections2(void* parg)
void ThreadOpenAddedConnections(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadOpenAddedConnections(parg));
+
+ // Make this thread recognisable as the connection opening thread
+ RenameThread("bitcoin-opencon");
+
try
{
vnThreadsRunning[THREAD_ADDEDCONNECTIONS]++;
@@ -1610,6 +1637,10 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
void ThreadMessageHandler(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg));
+
+ // Make this thread recognisable as the message handling thread
+ RenameThread("bitcoin-msghand");
+
try
{
vnThreadsRunning[THREAD_MESSAGEHANDLER]++;
@@ -1852,6 +1883,9 @@ void static Discover()
void StartNode(void* parg)
{
+ // Make this thread recognisable as the startup thread
+ RenameThread("bitcoin-start");
+
if (semOutbound == NULL) {
// initialize semaphore
int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, (int)GetArg("-maxconnections", 125));
diff --git a/src/netbase.cpp b/src/netbase.cpp
index aa767cd3eb..0a54fdf46c 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -224,7 +224,7 @@ bool static Socks5(string strDest, int port, SOCKET& hSocket)
}
char pszSocks5Init[] = "\5\1\0";
char *pszSocks5 = pszSocks5Init;
- ssize_t nSize = sizeof(pszSocks5Init);
+ ssize_t nSize = sizeof(pszSocks5Init) - 1;
ssize_t ret = send(hSocket, pszSocks5, nSize, MSG_NOSIGNAL);
if (ret != nSize)
diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp
index 5849f5b23d..8a74a47f58 100644
--- a/src/qt/addressbookpage.cpp
+++ b/src/qt/addressbookpage.cpp
@@ -2,6 +2,7 @@
#include "ui_addressbookpage.h"
#include "addresstablemodel.h"
+#include "optionsmodel.h"
#include "bitcoingui.h"
#include "editaddressdialog.h"
#include "csvmodelwriter.h"
@@ -20,6 +21,7 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
QDialog(parent),
ui(new Ui::AddressBookPage),
model(0),
+ optionsModel(0),
mode(mode),
tab(tab)
{
@@ -65,6 +67,7 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
QAction *editAction = new QAction(tr("&Edit"), this);
QAction *showQRCodeAction = new QAction(ui->showQRCode->text(), this);
QAction *signMessageAction = new QAction(ui->signMessage->text(), this);
+ QAction *verifyMessageAction = new QAction(ui->verifyMessage->text(), this);
deleteAction = new QAction(ui->deleteButton->text(), this);
// Build context menu
@@ -78,6 +81,8 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
contextMenu->addAction(showQRCodeAction);
if(tab == ReceivingTab)
contextMenu->addAction(signMessageAction);
+ else if(tab == SendingTab)
+ contextMenu->addAction(verifyMessageAction);
// Connect signals for context menu actions
connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(on_copyToClipboard_clicked()));
@@ -86,6 +91,7 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
connect(deleteAction, SIGNAL(triggered()), this, SLOT(on_deleteButton_clicked()));
connect(showQRCodeAction, SIGNAL(triggered()), this, SLOT(on_showQRCode_clicked()));
connect(signMessageAction, SIGNAL(triggered()), this, SLOT(on_signMessage_clicked()));
+ connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(on_verifyMessage_clicked()));
connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));
@@ -107,6 +113,8 @@ void AddressBookPage::setModel(AddressTableModel *model)
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
proxyModel->setDynamicSortFilter(true);
+ proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
+ proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
switch(tab)
{
case ReceivingTab:
@@ -139,6 +147,11 @@ void AddressBookPage::setModel(AddressTableModel *model)
selectionChanged();
}
+void AddressBookPage::setOptionsModel(OptionsModel *optionsModel)
+{
+ this->optionsModel = optionsModel;
+}
+
void AddressBookPage::on_copyToClipboard_clicked()
{
GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Address);
@@ -179,10 +192,22 @@ void AddressBookPage::on_signMessage_clicked()
addr = address.toString();
}
- QObject *qoGUI = parent()->parent();
- BitcoinGUI *gui = qobject_cast<BitcoinGUI *>(qoGUI);
- if (gui)
- gui->gotoMessagePage(addr);
+ emit signMessage(addr);
+}
+
+void AddressBookPage::on_verifyMessage_clicked()
+{
+ QTableView *table = ui->tableView;
+ QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
+ QString addr;
+
+ foreach (QModelIndex index, indexes)
+ {
+ QVariant address = index.data();
+ addr = address.toString();
+ }
+
+ emit verifyMessage(addr);
}
void AddressBookPage::on_newAddressButton_clicked()
@@ -230,6 +255,8 @@ void AddressBookPage::selectionChanged()
deleteAction->setEnabled(true);
ui->signMessage->setEnabled(false);
ui->signMessage->setVisible(false);
+ ui->verifyMessage->setEnabled(true);
+ ui->verifyMessage->setVisible(true);
break;
case ReceivingTab:
// Deleting receiving addresses, however, is not allowed
@@ -238,6 +265,8 @@ void AddressBookPage::selectionChanged()
deleteAction->setEnabled(false);
ui->signMessage->setEnabled(true);
ui->signMessage->setVisible(true);
+ ui->verifyMessage->setEnabled(false);
+ ui->verifyMessage->setVisible(false);
break;
}
ui->copyToClipboard->setEnabled(true);
@@ -249,6 +278,7 @@ void AddressBookPage::selectionChanged()
ui->showQRCode->setEnabled(false);
ui->copyToClipboard->setEnabled(false);
ui->signMessage->setEnabled(false);
+ ui->verifyMessage->setEnabled(false);
}
}
@@ -314,6 +344,8 @@ void AddressBookPage::on_showQRCode_clicked()
QString address = index.data().toString(), label = index.sibling(index.row(), 0).data(Qt::EditRole).toString();
QRCodeDialog *dialog = new QRCodeDialog(address, label, tab == ReceivingTab, this);
+ if(optionsModel)
+ dialog->setModel(optionsModel);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}
diff --git a/src/qt/addressbookpage.h b/src/qt/addressbookpage.h
index b2e91c7cb2..df87486949 100644
--- a/src/qt/addressbookpage.h
+++ b/src/qt/addressbookpage.h
@@ -7,6 +7,7 @@ namespace Ui {
class AddressBookPage;
}
class AddressTableModel;
+class OptionsModel;
QT_BEGIN_NAMESPACE
class QTableView;
@@ -37,6 +38,7 @@ public:
~AddressBookPage();
void setModel(AddressTableModel *model);
+ void setOptionsModel(OptionsModel *optionsModel);
const QString &getReturnValue() const { return returnValue; }
public slots:
@@ -46,6 +48,7 @@ public slots:
private:
Ui::AddressBookPage *ui;
AddressTableModel *model;
+ OptionsModel *optionsModel;
Mode mode;
Tabs tab;
QString returnValue;
@@ -60,6 +63,7 @@ private slots:
/** Copy address of currently selected address entry to clipboard */
void on_copyToClipboard_clicked();
void on_signMessage_clicked();
+ void on_verifyMessage_clicked();
void selectionChanged();
void on_showQRCode_clicked();
/** Spawn contextual menu (right mouse menu) for address book entry */
@@ -72,6 +76,10 @@ private slots:
/** New entry/entries were added to address table */
void selectNewAddress(const QModelIndex &parent, int begin, int end);
+
+signals:
+ void signMessage(QString addr);
+ void verifyMessage(QString addr);
};
#endif // ADDRESSBOOKDIALOG_H
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 803baf92ed..f9f5115cd0 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -116,6 +116,8 @@ static void handleRunawayException(std::exception *e)
#ifndef BITCOIN_QT_TEST
int main(int argc, char *argv[])
{
+// TODO: implement URI support on the Mac.
+#if !defined(MAC_OSX)
// Do this early as we don't want to bother initializing if we are just calling IPC
for (int i = 1; i < argc; i++)
{
@@ -124,16 +126,25 @@ int main(int argc, char *argv[])
const char *strURI = argv[i];
try {
boost::interprocess::message_queue mq(boost::interprocess::open_only, BITCOINURI_QUEUE_NAME);
- if(mq.try_send(strURI, strlen(strURI), 0))
+ if (mq.try_send(strURI, strlen(strURI), 0))
+ // if URI could be sent to the message queue exit here
exit(0);
else
+ // if URI could not be sent to the message queue do a normal Bitcoin-Qt startup
break;
}
catch (boost::interprocess::interprocess_exception &ex) {
- break;
+ // don't log the "file not found" exception, because that's normal for
+ // the first start of the first instance
+ if (ex.get_error_code() != boost::interprocess::not_found_error)
+ {
+ printf("main() - boost interprocess exception #%d: %s\n", ex.get_error_code(), ex.what());
+ break;
+ }
}
}
}
+#endif
// Internal string conversion is all UTF-8
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
@@ -258,6 +269,8 @@ int main(int argc, char *argv[])
{
window.show();
}
+// TODO: implement URI support on the Mac.
+#if !defined(MAC_OSX)
// Place this here as guiref has to be defined if we dont want to lose URIs
ipcInit();
@@ -273,10 +286,12 @@ int main(int argc, char *argv[])
mq.try_send(strURI, strlen(strURI), 0);
}
catch (boost::interprocess::interprocess_exception &ex) {
+ printf("main() - boost interprocess exception #%d: %s\n", ex.get_error_code(), ex.what());
+ break;
}
}
}
-
+#endif
app.exec();
window.hide();
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index c642f4aa0b..7b0e6f3bc0 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -8,8 +8,7 @@
#include "transactiontablemodel.h"
#include "addressbookpage.h"
#include "sendcoinsdialog.h"
-#include "messagepage.h"
-#include "verifymessagedialog.h"
+#include "signverifymessagedialog.h"
#include "optionsdialog.h"
#include "aboutdialog.h"
#include "clientmodel.h"
@@ -52,7 +51,6 @@
#include <QFileDialog>
#include <QDesktopServices>
#include <QTimer>
-
#include <QDragEnterEvent>
#include <QUrl>
@@ -70,7 +68,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
rpcConsole(0)
{
resize(850, 550);
- setWindowTitle(tr("Bitcoin Wallet"));
+ setWindowTitle(tr("Bitcoin") + " - " + tr("Wallet"));
#ifndef Q_WS_MAC
qApp->setWindowIcon(QIcon(":icons/bitcoin"));
setWindowIcon(QIcon(":icons/bitcoin"));
@@ -108,7 +106,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
sendCoinsPage = new SendCoinsDialog(this);
- messagePage = new MessagePage(this);
+ signVerifyMessageDialog = new SignVerifyMessageDialog(this);
centralWidget = new QStackedWidget(this);
centralWidget->addWidget(overviewPage);
@@ -117,7 +115,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
centralWidget->addWidget(receiveCoinsPage);
centralWidget->addWidget(sendCoinsPage);
#ifdef FIRST_CLASS_MESSAGING
- centralWidget->addWidget(messagePage);
+ centralWidget->addWidget(signVerifyMessageDialog);
#endif
setCentralWidget(centralWidget);
@@ -166,6 +164,11 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
rpcConsole = new RPCConsole(this);
connect(openRPCConsoleAction, SIGNAL(triggered()), rpcConsole, SLOT(show()));
+ // Clicking on "Verify Message" in the address book sends you to the verify message tab
+ connect(addressBookPage, SIGNAL(verifyMessage(QString)), this, SLOT(gotoVerifyMessageTab(QString)));
+ // Clicking on "Sign Message" in the receive coins page sends you to the sign message tab
+ connect(receiveCoinsPage, SIGNAL(signMessage(QString)), this, SLOT(gotoSignMessageTab(QString)));
+
gotoOverviewPage();
}
@@ -212,12 +215,20 @@ void BitcoinGUI::createActions()
sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2));
tabGroup->addAction(sendCoinsAction);
- messageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this);
- messageAction->setToolTip(tr("Prove you control an address"));
+ signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this);
+ signMessageAction->setToolTip(tr("Sign a message to prove you own a Bitcoin address"));
+ tabGroup->addAction(signMessageAction);
+
+ verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this);
+ verifyMessageAction->setToolTip(tr("Verify a message to ensure it was signed with a specified Bitcoin address"));
+ tabGroup->addAction(verifyMessageAction);
+
#ifdef FIRST_CLASS_MESSAGING
- messageAction->setCheckable(true);
+ firstClassMessagingAction = new QAction(QIcon(":/icons/edit"), tr("S&ignatures"), this);
+ firstClassMessagingAction->setToolTip(signMessageAction->toolTip() + QString(". / ") + verifyMessageAction->toolTip() + QString("."));
+ firstClassMessagingAction->setCheckable(true);
+ tabGroup->addAction(firstClassMessagingAction);
#endif
- tabGroup->addAction(messageAction);
connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage()));
@@ -229,14 +240,21 @@ void BitcoinGUI::createActions()
connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage()));
connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage()));
- connect(messageAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
- connect(messageAction, SIGNAL(triggered()), this, SLOT(gotoMessagePage()));
+ connect(signMessageAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
+ connect(signMessageAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab()));
+ connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
+ connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(gotoVerifyMessageTab()));
+#ifdef FIRST_CLASS_MESSAGING
+ connect(firstClassMessagingAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized()));
+ // Always start with the sign message tab for FIRST_CLASS_MESSAGING
+ connect(firstClassMessagingAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab()));
+#endif
quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this);
quitAction->setToolTip(tr("Quit application"));
quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q));
quitAction->setMenuRole(QAction::QuitRole);
- aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About %1").arg(qApp->applicationName()), this);
+ aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About Bitcoin"), this);
aboutAction->setToolTip(tr("Show information about Bitcoin"));
aboutAction->setMenuRole(QAction::AboutRole);
aboutQtAction = new QAction(tr("About &Qt"), this);
@@ -258,8 +276,6 @@ void BitcoinGUI::createActions()
changePassphraseAction->setToolTip(tr("Change the passphrase used for wallet encryption"));
openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug window"), this);
openRPCConsoleAction->setToolTip(tr("Open debugging and diagnostic console"));
- verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this);
- verifyMessageAction->setToolTip(tr("Verify a message signature"));
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked()));
@@ -269,7 +285,6 @@ void BitcoinGUI::createActions()
connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool)));
connect(backupWalletAction, SIGNAL(triggered()), this, SLOT(backupWallet()));
connect(changePassphraseAction, SIGNAL(triggered()), this, SLOT(changePassphrase()));
- connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(verifyMessage()));
}
void BitcoinGUI::createMenuBar()
@@ -287,9 +302,9 @@ void BitcoinGUI::createMenuBar()
file->addAction(backupWalletAction);
file->addAction(exportAction);
#ifndef FIRST_CLASS_MESSAGING
- file->addAction(messageAction);
-#endif
+ file->addAction(signMessageAction);
file->addAction(verifyMessageAction);
+#endif
file->addSeparator();
file->addAction(quitAction);
@@ -316,7 +331,7 @@ void BitcoinGUI::createToolBars()
toolbar->addAction(historyAction);
toolbar->addAction(addressBookAction);
#ifdef FIRST_CLASS_MESSAGING
- toolbar->addAction(messageAction);
+ toolbar->addAction(firstClassMessagingAction);
#endif
QToolBar *toolbar2 = addToolBar(tr("Actions toolbar"));
@@ -329,6 +344,7 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
this->clientModel = clientModel;
if(clientModel)
{
+ // Replace some strings and icons, when using the testnet
if(clientModel->isTestNet())
{
setWindowTitle(windowTitle() + QString(" ") + tr("[testnet]"));
@@ -344,6 +360,8 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
toggleHideAction->setIcon(QIcon(":/icons/toolbar_testnet"));
}
+
+ aboutAction->setIcon(QIcon(":/icons/toolbar_testnet"));
}
// Keep up to date with client
@@ -357,6 +375,8 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
connect(clientModel, SIGNAL(error(QString,QString,bool)), this, SLOT(error(QString,QString,bool)));
rpcConsole->setClientModel(clientModel);
+ addressBookPage->setOptionsModel(clientModel->getOptionsModel());
+ receiveCoinsPage->setOptionsModel(clientModel->getOptionsModel());
}
}
@@ -375,7 +395,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel)
addressBookPage->setModel(walletModel->getAddressTableModel());
receiveCoinsPage->setModel(walletModel->getAddressTableModel());
sendCoinsPage->setModel(walletModel);
- messagePage->setModel(walletModel);
+ signVerifyMessageDialog->setModel(walletModel);
setEncryptionStatus(walletModel->getEncryptionStatus());
connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
@@ -415,7 +435,7 @@ void BitcoinGUI::createTrayIcon()
#ifndef FIRST_CLASS_MESSAGING
trayIconMenu->addSeparator();
#endif
- trayIconMenu->addAction(messageAction);
+ trayIconMenu->addAction(signMessageAction);
trayIconMenu->addAction(verifyMessageAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(optionsAction);
@@ -717,20 +737,42 @@ void BitcoinGUI::gotoSendCoinsPage()
disconnect(exportAction, SIGNAL(triggered()), 0, 0);
}
-void BitcoinGUI::gotoMessagePage(QString addr)
+void BitcoinGUI::gotoSignMessageTab(QString addr)
{
+#ifdef FIRST_CLASS_MESSAGING
+ firstClassMessagingAction->setChecked(true);
+ centralWidget->setCurrentWidget(signVerifyMessageDialog);
+
+ exportAction->setEnabled(false);
+ disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+
+ signVerifyMessageDialog->showTab_SM(false);
+#else
+ // call show() in showTab_SM()
+ signVerifyMessageDialog->showTab_SM(true);
+#endif
+
if(!addr.isEmpty())
- messagePage->setAddress(addr);
+ signVerifyMessageDialog->setAddress_SM(addr);
+}
+void BitcoinGUI::gotoVerifyMessageTab(QString addr)
+{
#ifdef FIRST_CLASS_MESSAGING
- messageAction->setChecked(true);
- centralWidget->setCurrentWidget(messagePage);
+ firstClassMessagingAction->setChecked(true);
+ centralWidget->setCurrentWidget(signVerifyMessageDialog);
exportAction->setEnabled(false);
disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+
+ signVerifyMessageDialog->showTab_VM(false);
#else
- messagePage->show();
+ // call show() in showTab_VM()
+ signVerifyMessageDialog->showTab_VM(true);
#endif
+
+ if(!addr.isEmpty())
+ signVerifyMessageDialog->setAddress_VM(addr);
}
void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event)
@@ -833,13 +875,6 @@ void BitcoinGUI::changePassphrase()
dlg.exec();
}
-void BitcoinGUI::verifyMessage()
-{
- VerifyMessageDialog *dlg = new VerifyMessageDialog(this);
- dlg->setAttribute(Qt::WA_DeleteOnClose);
- dlg->show();
-}
-
void BitcoinGUI::unlockWallet()
{
if(!walletModel)
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index 3c82cbc968..9e0cd0c190 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -11,7 +11,7 @@ class TransactionView;
class OverviewPage;
class AddressBookPage;
class SendCoinsDialog;
-class MessagePage;
+class SignVerifyMessageDialog;
class Notificator;
class RPCConsole;
@@ -64,7 +64,7 @@ private:
AddressBookPage *addressBookPage;
AddressBookPage *receiveCoinsPage;
SendCoinsDialog *sendCoinsPage;
- MessagePage *messagePage;
+ SignVerifyMessageDialog *signVerifyMessageDialog;
QLabel *labelEncryptionIcon;
QLabel *labelConnectionsIcon;
@@ -78,8 +78,9 @@ private:
QAction *quitAction;
QAction *sendCoinsAction;
QAction *addressBookAction;
- QAction *messageAction;
+ QAction *signMessageAction;
QAction *verifyMessageAction;
+ QAction *firstClassMessagingAction;
QAction *aboutAction;
QAction *receiveCoinsAction;
QAction *optionsAction;
@@ -131,8 +132,6 @@ public slots:
void askFee(qint64 nFeeRequired, bool *payFee);
void handleURI(QString strURI);
- void gotoMessagePage(QString addr = "");
-
private slots:
/** Switch to overview (home) page */
void gotoOverviewPage();
@@ -145,6 +144,11 @@ private slots:
/** Switch to send coins page */
void gotoSendCoinsPage();
+ /** Show Sign/Verify Message dialog and switch to sign message tab */
+ void gotoSignMessageTab(QString addr = "");
+ /** Show Sign/Verify Message dialog and switch to verify message tab */
+ void gotoVerifyMessageTab(QString addr = "");
+
/** Show configuration dialog */
void optionsClicked();
/** Show about dialog */
@@ -164,8 +168,6 @@ private slots:
void backupWallet();
/** Change encrypted wallet passphrase */
void changePassphrase();
- /** Verify a message signature */
- void verifyMessage();
/** Ask for pass phrase to unlock wallet temporarily */
void unlockWallet();
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index 56214df7a7..219397dbf9 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -5,7 +5,8 @@
#else
#define UNUSED
#endif
-static const char UNUSED *bitcoin_strings[] = {QT_TRANSLATE_NOOP("bitcoin-core", ""
+static const char UNUSED *bitcoin_strings[] = {
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"%s, you must set a rpcpassword in the configuration file:\n"
" %s\n"
"It is recommended you use the following random password:\n"
@@ -81,7 +82,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: Wallet locked, unable to create transa
QT_TRANSLATE_NOOP("bitcoin-core", "Error: could not start node"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."),
QT_TRANSLATE_NOOP("bitcoin-core", "Fee per KB to add to transactions you send"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Find peers using DNS lookup (default: 1)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Find peers using DNS lookup (default: 1 unless -connect)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Find peers using internet relay chat (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins"),
QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command"),
@@ -90,6 +91,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "How thorough the block verification is (0-6,
QT_TRANSLATE_NOOP("bitcoin-core", "Imports blocks from external blk000?.dat file"),
QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address: '%s'"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -tor address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount"),
QT_TRANSLATE_NOOP("bitcoin-core", "List commands"),
@@ -99,11 +101,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Maintain at most <n> connections to peers (default: 125)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection send buffer, <n>*1000 bytes (default: 10000)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network <net> (IPv4 or IPv6)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network <net> (IPv4, IPv6 or Tor)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Options:"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Output extra debugging information"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Output extra debugging information. Implies all other -debug* options"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Output extra network debugging information"),
QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions"),
@@ -136,8 +139,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Usage:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Use OpenSSL (https) for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Use UPnP to map the listening port (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Use UPnP to map the listening port (default: 1 when listening)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Use proxy to reach tor hidden services (default: same as -proxy)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Use the test network"),
QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart Bitcoin to complete"),
QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Disk space is low"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Warning: this version is obsolete, upgrade required"),
}; \ No newline at end of file
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index cabbd5d240..8fcc4e650e 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -18,7 +18,7 @@ ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
{
numBlocksAtStartup = -1;
- pollTimer = new QTimer();
+ pollTimer = new QTimer(this);
pollTimer->setInterval(MODEL_UPDATE_DELAY);
pollTimer->start();
connect(pollTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));
diff --git a/src/qt/forms/addressbookpage.ui b/src/qt/forms/addressbookpage.ui
index bca0a8dcdb..7708e15363 100644
--- a/src/qt/forms/addressbookpage.ui
+++ b/src/qt/forms/addressbookpage.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>627</width>
+ <width>691</width>
<height>347</height>
</rect>
</property>
@@ -17,10 +17,10 @@
<item>
<widget class="QLabel" name="labelExplanation">
<property name="text">
- <string>These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you.</string>
+ <string>These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you.</string>
</property>
<property name="textFormat">
- <enum>Qt::AutoText</enum>
+ <enum>Qt::PlainText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -99,7 +99,7 @@
<item>
<widget class="QPushButton" name="signMessage">
<property name="toolTip">
- <string>Sign a message to prove you own this address</string>
+ <string>Sign a message to prove you own a Bitcoin address</string>
</property>
<property name="text">
<string>&amp;Sign Message</string>
@@ -111,6 +111,20 @@
</widget>
</item>
<item>
+ <widget class="QPushButton" name="verifyMessage">
+ <property name="toolTip">
+ <string>Verify a message to ensure it was signed with a specified Bitcoin address</string>
+ </property>
+ <property name="text">
+ <string>&amp;Verify Message</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/transaction_0</normaloff>:/icons/transaction_0</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QPushButton" name="deleteButton">
<property name="toolTip">
<string>Delete the currently selected address from the list. Only sending addresses can be deleted.</string>
diff --git a/src/qt/forms/messagepage.ui b/src/qt/forms/messagepage.ui
deleted file mode 100644
index 0b685aae1d..0000000000
--- a/src/qt/forms/messagepage.ui
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MessagePage</class>
- <widget class="QWidget" name="MessagePage">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>627</width>
- <height>380</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Sign Message</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="labelExplanation">
- <property name="text">
- <string>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</string>
- </property>
- <property name="textFormat">
- <enum>Qt::AutoText</enum>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <property name="spacing">
- <number>0</number>
- </property>
- <item>
- <widget class="QValidatedLineEdit" name="signFrom">
- <property name="toolTip">
- <string>The address to sign the message with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</string>
- </property>
- <property name="maxLength">
- <number>34</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="addressBookButton">
- <property name="toolTip">
- <string>Choose adress from address book</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/address-book</normaloff>:/icons/address-book</iconset>
- </property>
- <property name="shortcut">
- <string>Alt+A</string>
- </property>
- <property name="autoDefault">
- <bool>false</bool>
- </property>
- <property name="flat">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pasteButton">
- <property name="toolTip">
- <string>Paste address from clipboard</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/editpaste</normaloff>:/icons/editpaste</iconset>
- </property>
- <property name="shortcut">
- <string>Alt+P</string>
- </property>
- <property name="autoDefault">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPlainTextEdit" name="message">
- <property name="toolTip">
- <string>Enter the message you want to sign here</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="signature">
- <property name="font">
- <font>
- <italic>true</italic>
- </font>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QPushButton" name="signMessage">
- <property name="toolTip">
- <string>Sign a message to prove you own this address</string>
- </property>
- <property name="text">
- <string>&amp;Sign Message</string>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/edit</normaloff>:/icons/edit</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="copyToClipboard">
- <property name="toolTip">
- <string>Copy the current signature to the system clipboard</string>
- </property>
- <property name="text">
- <string>&amp;Copy Signature</string>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/editcopy</normaloff>:/icons/editcopy</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="clearButton">
- <property name="toolTip">
- <string>Reset all sign message fields</string>
- </property>
- <property name="text">
- <string>Clear &amp;All</string>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>QValidatedLineEdit</class>
- <extends>QLineEdit</extends>
- <header>qvalidatedlineedit.h</header>
- </customwidget>
- </customwidgets>
- <resources>
- <include location="../bitcoin.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/qt/forms/qrcodedialog.ui b/src/qt/forms/qrcodedialog.ui
index 6199b68749..52e9db3762 100644
--- a/src/qt/forms/qrcodedialog.ui
+++ b/src/qt/forms/qrcodedialog.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>334</width>
- <height>425</height>
+ <width>340</width>
+ <height>530</height>
</rect>
</property>
<property name="windowTitle">
@@ -28,8 +28,8 @@
<height>300</height>
</size>
</property>
- <property name="text">
- <string>QR Code</string>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@@ -40,133 +40,122 @@
</widget>
</item>
<item>
+ <widget class="QPlainTextEdit" name="outUri">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="tabChangesFocus">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QCheckBox" name="chkReqPayment">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Request Payment</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="lblAmount">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Amount:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>lnReqAmount</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lnReqAmount">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>60</width>
- <height>0</height>
- </size>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="lblBTC">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>BTC</string>
- </property>
- <property name="buddy">
- <cstring>lnReqAmount</cstring>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
+ <widget class="QCheckBox" name="chkReqPayment">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Request Payment</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lblLabel">
+ <property name="text">
+ <string>Label:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy">
+ <cstring>lnLabel</cstring>
+ </property>
+ </widget>
</item>
- <item>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="lblLabel">
- <property name="text">
- <string>Label:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>lnLabel</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="lnLabel">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="lblMessage">
- <property name="text">
- <string>Message:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>lnMessage</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="lnMessage">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lnLabel"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="lblMessage">
+ <property name="text">
+ <string>Message:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy">
+ <cstring>lnMessage</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lnMessage"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lblAmount">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Amount:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy">
+ <cstring>lnReqAmount</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="BitcoinAmountField" name="lnReqAmount">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
</item>
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
@@ -194,6 +183,13 @@
</item>
</layout>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>BitcoinAmountField</class>
+ <extends>QSpinBox</extends>
+ <header>bitcoinamountfield.h</header>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections>
<connection>
diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui
index be0f4ebe96..5593791814 100644
--- a/src/qt/forms/rpcconsole.ui
+++ b/src/qt/forms/rpcconsole.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>Bitcoin debug window</string>
+ <string>Bitcoin - Debug window</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
@@ -36,7 +36,7 @@
</font>
</property>
<property name="text">
- <string>Client</string>
+ <string>Bitcoin Core</string>
</property>
</widget>
</item>
@@ -87,13 +87,39 @@
</widget>
</item>
<item row="3" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Using OpenSSL version</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="openSSLVersion">
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>N/A</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Build date</string>
</property>
</widget>
</item>
- <item row="3" column="1">
+ <item row="4" column="1">
<widget class="QLabel" name="buildDate">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -109,14 +135,14 @@
</property>
</widget>
</item>
- <item row="4" column="0">
+ <item row="5" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Startup time</string>
</property>
</widget>
</item>
- <item row="4" column="1">
+ <item row="5" column="1">
<widget class="QLabel" name="startupTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -132,7 +158,7 @@
</property>
</widget>
</item>
- <item row="5" column="0">
+ <item row="6" column="0">
<widget class="QLabel" name="label_11">
<property name="font">
<font>
@@ -145,14 +171,14 @@
</property>
</widget>
</item>
- <item row="6" column="0">
+ <item row="7" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Number of connections</string>
</property>
</widget>
</item>
- <item row="6" column="1">
+ <item row="7" column="1">
<widget class="QLabel" name="numberOfConnections">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -168,14 +194,14 @@
</property>
</widget>
</item>
- <item row="7" column="0">
+ <item row="8" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>On testnet</string>
</property>
</widget>
</item>
- <item row="7" column="1">
+ <item row="8" column="1">
<widget class="QCheckBox" name="isTestNet">
<property name="enabled">
<bool>false</bool>
@@ -185,7 +211,7 @@
</property>
</widget>
</item>
- <item row="8" column="0">
+ <item row="9" column="0">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
@@ -198,14 +224,14 @@
</property>
</widget>
</item>
- <item row="9" column="0">
+ <item row="10" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Current number of blocks</string>
</property>
</widget>
</item>
- <item row="9" column="1">
+ <item row="10" column="1">
<widget class="QLabel" name="numberOfBlocks">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -221,14 +247,14 @@
</property>
</widget>
</item>
- <item row="10" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Estimated total blocks</string>
</property>
</widget>
</item>
- <item row="10" column="1">
+ <item row="11" column="1">
<widget class="QLabel" name="totalBlocks">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -244,14 +270,14 @@
</property>
</widget>
</item>
- <item row="11" column="0">
+ <item row="12" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Last block time</string>
</property>
</widget>
</item>
- <item row="11" column="1">
+ <item row="12" column="1">
<widget class="QLabel" name="lastBlockTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -267,7 +293,7 @@
</property>
</widget>
</item>
- <item row="12" column="0">
+ <item row="13" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -280,7 +306,7 @@
</property>
</spacer>
</item>
- <item row="13" column="0">
+ <item row="14" column="0">
<widget class="QLabel" name="labelDebugLogfile">
<property name="font">
<font>
@@ -293,7 +319,7 @@
</property>
</widget>
</item>
- <item row="14" column="0">
+ <item row="15" column="0">
<widget class="QPushButton" name="openDebugLogfileButton">
<property name="toolTip">
<string>Open the Bitcoin debug logfile from the current data directory. This can take a few seconds for large logfiles.</string>
@@ -306,7 +332,7 @@
</property>
</widget>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<widget class="QLabel" name="labelCLOptions">
<property name="font">
<font>
@@ -319,7 +345,7 @@
</property>
</widget>
</item>
- <item row="16" column="0">
+ <item row="17" column="0">
<widget class="QPushButton" name="showCLOptionsButton">
<property name="toolTip">
<string>Show the Bitcoin-Qt help message to get a list with possible Bitcoin command-line options.</string>
@@ -332,7 +358,7 @@
</property>
</widget>
</item>
- <item row="17" column="0">
+ <item row="18" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
diff --git a/src/qt/forms/signverifymessagedialog.ui b/src/qt/forms/signverifymessagedialog.ui
new file mode 100644
index 0000000000..8128bdf457
--- /dev/null
+++ b/src/qt/forms/signverifymessagedialog.ui
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SignVerifyMessageDialog</class>
+ <widget class="QDialog" name="SignVerifyMessageDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>380</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Signatures - Sign / Verify a Message</string>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tabSignMessage">
+ <attribute name="title">
+ <string>&amp;Sign Message</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_SM">
+ <item>
+ <widget class="QLabel" name="infoLabel_SM">
+ <property name="text">
+ <string>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_1_SM">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QValidatedLineEdit" name="addressIn_SM">
+ <property name="toolTip">
+ <string>The address to sign the message with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</string>
+ </property>
+ <property name="maxLength">
+ <number>34</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="addressBookButton_SM">
+ <property name="toolTip">
+ <string>Choose an address from the address book</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/address-book</normaloff>:/icons/address-book</iconset>
+ </property>
+ <property name="shortcut">
+ <string>Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pasteButton_SM">
+ <property name="toolTip">
+ <string>Paste address from clipboard</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/editpaste</normaloff>:/icons/editpaste</iconset>
+ </property>
+ <property name="shortcut">
+ <string>Alt+P</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="messageIn_SM">
+ <property name="toolTip">
+ <string>Enter the message you want to sign here</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2_SM">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="signatureOut_SM">
+ <property name="font">
+ <font>
+ <italic>true</italic>
+ </font>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="copySignatureButton_SM">
+ <property name="toolTip">
+ <string>Copy the current signature to the system clipboard</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/editcopy</normaloff>:/icons/editcopy</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3_SM">
+ <item>
+ <widget class="QPushButton" name="signMessageButton_SM">
+ <property name="toolTip">
+ <string>Sign the message to prove you own this Bitcoin address</string>
+ </property>
+ <property name="text">
+ <string>&amp;Sign Message</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/edit</normaloff>:/icons/edit</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearButton_SM">
+ <property name="toolTip">
+ <string>Reset all sign message fields</string>
+ </property>
+ <property name="text">
+ <string>Clear &amp;All</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_1_SM">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>48</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="statusLabel_SM">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2_SM">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>48</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tabVerifyMessage">
+ <attribute name="title">
+ <string>&amp;Verify Message</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_VM">
+ <item>
+ <widget class="QLabel" name="infoLabel_VM">
+ <property name="text">
+ <string>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_1_VM">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QValidatedLineEdit" name="addressIn_VM">
+ <property name="toolTip">
+ <string>The address the message was signed with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</string>
+ </property>
+ <property name="maxLength">
+ <number>34</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="addressBookButton_VM">
+ <property name="toolTip">
+ <string>Choose an address from the address book</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/address-book</normaloff>:/icons/address-book</iconset>
+ </property>
+ <property name="shortcut">
+ <string>Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="messageIn_VM"/>
+ </item>
+ <item>
+ <widget class="QValidatedLineEdit" name="signatureIn_VM"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2_VM">
+ <item>
+ <widget class="QPushButton" name="verifyMessageButton_VM">
+ <property name="toolTip">
+ <string>Verify the message to ensure it was signed with the specified Bitcoin address</string>
+ </property>
+ <property name="text">
+ <string>&amp;Verify Message</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/transaction_0</normaloff>:/icons/transaction_0</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearButton_VM">
+ <property name="toolTip">
+ <string>Reset all verify message fields</string>
+ </property>
+ <property name="text">
+ <string>Clear &amp;All</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_1_VM">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>48</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="statusLabel_VM">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2_VM">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>48</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QValidatedLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>qvalidatedlineedit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources>
+ <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/qt/forms/transactiondescdialog.ui b/src/qt/forms/transactiondescdialog.ui
index 039cb082cc..b38dffcc12 100644
--- a/src/qt/forms/transactiondescdialog.ui
+++ b/src/qt/forms/transactiondescdialog.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>600</width>
+ <width>620</width>
<height>250</height>
</rect>
</property>
diff --git a/src/qt/forms/verifymessagedialog.ui b/src/qt/forms/verifymessagedialog.ui
deleted file mode 100644
index afe98b05ab..0000000000
--- a/src/qt/forms/verifymessagedialog.ui
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>VerifyMessageDialog</class>
- <widget class="QDialog" name="VerifyMessageDialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>650</width>
- <height>380</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Verify Signed Message</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Enter the signing address, signature and message below (be careful to correctly copy newlines, spaces, tabs and other invisible characters) to verify the message.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QValidatedLineEdit" name="lnAddress">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QValidatedLineEdit" name="lnSig">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPlainTextEdit" name="edMessage"/>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QPushButton" name="verifyMessage">
- <property name="toolTip">
- <string>Verify a message to ensure it was signed with the specified Bitcoin address</string>
- </property>
- <property name="text">
- <string>&amp;Verify Message</string>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/transaction_0</normaloff>:/icons/transaction_0</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="clearButton">
- <property name="toolTip">
- <string>Reset all verify message fields</string>
- </property>
- <property name="text">
- <string>Clear &amp;All</string>
- </property>
- <property name="icon">
- <iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="lblStatus">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>48</height>
- </size>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>QValidatedLineEdit</class>
- <extends>QLineEdit</extends>
- <header>qvalidatedlineedit.h</header>
- </customwidget>
- </customwidgets>
- <resources>
- <include location="../bitcoin.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
index 54e9d644fe..405ba396b7 100644
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -4,10 +4,10 @@
/* Milliseconds between model updates */
static const int MODEL_UPDATE_DELAY = 500;
-/* Maximum passphrase length */
+/* AskPassphraseDialog -- Maximum passphrase length */
static const int MAX_PASSPHRASE_SIZE = 1024;
-/* Size of icons in status bar */
+/* BitcoinGUI -- Size of icons in status bar */
static const int STATUSBAR_ICONSIZE = 16;
/* Invalid field background style */
@@ -25,4 +25,10 @@ static const int STATUSBAR_ICONSIZE = 16;
*/
static const int TOOLTIP_WRAP_THRESHOLD = 80;
+/* Maximum allowed URI length */
+static const int MAX_URI_LENGTH = 255;
+
+/* QRCodeDialog -- size of exported QR Code image */
+#define EXPORT_IMAGE_SIZE 256
+
#endif // GUICONSTANTS_H
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index afa30caf87..8561db16f1 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -5,17 +5,14 @@
<context>
<name>AboutDialog</name>
<message>
- <location filename="../forms/aboutdialog.ui" line="14"/>
<source>About Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/aboutdialog.ui" line="53"/>
<source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/aboutdialog.ui" line="97"/>
<source>Copyright © 2009-2012 Bitcoin Developers
This is experimental software.
@@ -29,92 +26,82 @@ This product includes software developed by the OpenSSL Project for use in the O
<context>
<name>AddressBookPage</name>
<message>
- <location filename="../forms/addressbookpage.ui" line="14"/>
<source>Address Book</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="20"/>
- <source>These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/addressbookpage.ui" line="36"/>
<source>Double-click to edit address or label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="63"/>
<source>Create a new address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="77"/>
<source>Copy the currently selected address to the system clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="66"/>
<source>&amp;New Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="80"/>
+ <source>These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>&amp;Copy Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="91"/>
<source>Show &amp;QR Code</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="102"/>
- <source>Sign a message to prove you own this address</source>
+ <source>Sign a message to prove you own a Bitcoin address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="105"/>
<source>&amp;Sign Message</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="116"/>
+ <source>Verify a message to ensure it was signed with a specified Bitcoin address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Delete the currently selected address from the list. Only sending addresses can be deleted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/addressbookpage.ui" line="119"/>
<source>&amp;Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="63"/>
<source>Copy &amp;Label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="65"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="287"/>
<source>Export Address Book Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="288"/>
<source>Comma separated file (*.csv)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="301"/>
<source>Error exporting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="301"/>
<source>Could not write to file %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -122,17 +109,14 @@ This product includes software developed by the OpenSSL Project for use in the O
<context>
<name>AddressTableModel</name>
<message>
- <location filename="../addresstablemodel.cpp" line="142"/>
<source>Label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addresstablemodel.cpp" line="142"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addresstablemodel.cpp" line="178"/>
<source>(no label)</source>
<translation type="unfinished"></translation>
</message>
@@ -140,131 +124,99 @@ This product includes software developed by the OpenSSL Project for use in the O
<context>
<name>AskPassphraseDialog</name>
<message>
- <location filename="../forms/askpassphrasedialog.ui" line="26"/>
<source>Passphrase Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/askpassphrasedialog.ui" line="47"/>
<source>Enter passphrase</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/askpassphrasedialog.ui" line="61"/>
<source>New passphrase</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/askpassphrasedialog.ui" line="75"/>
<source>Repeat new passphrase</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="33"/>
<source>Enter the new passphrase to the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;10 or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="34"/>
<source>Encrypt wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="37"/>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="42"/>
<source>Unlock wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="45"/>
<source>This operation needs your wallet passphrase to decrypt the wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="50"/>
<source>Decrypt wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="53"/>
<source>Change passphrase</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="54"/>
<source>Enter the old and new passphrase to the wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="100"/>
<source>Confirm wallet encryption</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="101"/>
<source>WARNING: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!
Are you sure you wish to encrypt your wallet?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="110"/>
- <location filename="../askpassphrasedialog.cpp" line="159"/>
<source>Wallet encrypted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="111"/>
<source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="207"/>
- <location filename="../askpassphrasedialog.cpp" line="231"/>
<source>Warning: The Caps Lock key is on.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="116"/>
- <location filename="../askpassphrasedialog.cpp" line="123"/>
- <location filename="../askpassphrasedialog.cpp" line="165"/>
- <location filename="../askpassphrasedialog.cpp" line="171"/>
<source>Wallet encryption failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="117"/>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="124"/>
- <location filename="../askpassphrasedialog.cpp" line="172"/>
<source>The supplied passphrases do not match.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="135"/>
<source>Wallet unlock failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="136"/>
- <location filename="../askpassphrasedialog.cpp" line="147"/>
- <location filename="../askpassphrasedialog.cpp" line="166"/>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="146"/>
<source>Wallet decryption failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="160"/>
<source>Wallet passphrase was succesfully changed.</source>
<translation type="unfinished"></translation>
</message>
@@ -272,127 +224,98 @@ Are you sure you wish to encrypt your wallet?</source>
<context>
<name>BitcoinGUI</name>
<message>
- <location filename="../bitcoingui.cpp" line="73"/>
<source>Bitcoin Wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="215"/>
<source>Sign &amp;message...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="248"/>
<source>Show/Hide &amp;Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="515"/>
<source>Synchronizing with network...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="185"/>
<source>&amp;Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="186"/>
<source>Show general overview of wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="191"/>
<source>&amp;Transactions</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="192"/>
<source>Browse transaction history</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="197"/>
<source>&amp;Address Book</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="198"/>
<source>Edit the list of stored addresses and labels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="203"/>
<source>&amp;Receive coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="204"/>
<source>Show the list of addresses for receiving payments</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="209"/>
<source>&amp;Send coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="216"/>
- <source>Prove you control an address</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../bitcoingui.cpp" line="235"/>
<source>E&amp;xit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="236"/>
<source>Quit application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="239"/>
<source>&amp;About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="240"/>
<source>Show information about Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="242"/>
<source>About &amp;Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="243"/>
<source>Show information about Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="245"/>
<source>&amp;Options...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="252"/>
<source>&amp;Encrypt Wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="255"/>
<source>&amp;Backup Wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="257"/>
<source>&amp;Change Passphrase...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="517"/>
<source>~%n block(s) remaining</source>
<translation>
<numerusform>~%n block remaining</numerusform>
@@ -400,109 +323,94 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="528"/>
<source>Downloaded %1 of %2 blocks of transaction history (%3% done).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="250"/>
<source>&amp;Export...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="210"/>
<source>Send coins to a Bitcoin address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="246"/>
+ <source>Sign a message to prove you own a Bitcoin address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Verify a message to ensure it was signed with a specified Bitcoin address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;ignatures</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Modify configuration options for Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="249"/>
<source>Show or hide the Bitcoin window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="251"/>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="253"/>
<source>Encrypt or decrypt wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="256"/>
<source>Backup wallet to another location</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="258"/>
<source>Change the passphrase used for wallet encryption</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="259"/>
<source>&amp;Debug window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="260"/>
<source>Open debugging and diagnostic console</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="261"/>
<source>&amp;Verify message...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="262"/>
- <source>Verify a message signature</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../bitcoingui.cpp" line="286"/>
<source>&amp;File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="296"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="302"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="311"/>
<source>Tabs toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="322"/>
<source>Actions toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="334"/>
- <location filename="../bitcoingui.cpp" line="343"/>
<source>[testnet]</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="343"/>
- <location filename="../bitcoingui.cpp" line="399"/>
<source>Bitcoin client</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="492"/>
<source>%n active connection(s) to Bitcoin network</source>
<translation>
<numerusform>%n active connection to Bitcoin network</numerusform>
@@ -510,12 +418,10 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="540"/>
<source>Downloaded %1 blocks of transaction history.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="555"/>
<source>%n second(s) ago</source>
<translation>
<numerusform>%n second ago</numerusform>
@@ -523,7 +429,6 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="559"/>
<source>%n minute(s) ago</source>
<translation>
<numerusform>%n minute ago</numerusform>
@@ -531,7 +436,6 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="563"/>
<source>%n hour(s) ago</source>
<translation>
<numerusform>%n hour ago</numerusform>
@@ -539,7 +443,6 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message numerus="yes">
- <location filename="../bitcoingui.cpp" line="567"/>
<source>%n day(s) ago</source>
<translation>
<numerusform>%n day ago</numerusform>
@@ -547,42 +450,34 @@ Are you sure you wish to encrypt your wallet?</source>
</translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="573"/>
<source>Up to date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="580"/>
<source>Catching up...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="590"/>
<source>Last received block was generated %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="649"/>
<source>This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="654"/>
<source>Confirm transaction fee</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="681"/>
<source>Sent transaction</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="682"/>
<source>Incoming transaction</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="683"/>
<source>Date: %1
Amount: %2
Type: %3
@@ -591,37 +486,38 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="804"/>
+ <source>URI handling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>URI can not be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="812"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="835"/>
<source>Backup Wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="835"/>
<source>Wallet Data (*.dat)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="838"/>
<source>Backup Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoingui.cpp" line="838"/>
<source>There was an error trying to save the wallet data to the new location.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoin.cpp" line="112"/>
<source>A fatal error occured. Bitcoin can no longer continue safely and will quit.</source>
<translation type="unfinished"></translation>
</message>
@@ -629,7 +525,6 @@ Address: %4
<context>
<name>ClientModel</name>
<message>
- <location filename="../clientmodel.cpp" line="84"/>
<source>Network Alert</source>
<translation type="unfinished"></translation>
</message>
@@ -637,67 +532,54 @@ Address: %4
<context>
<name>EditAddressDialog</name>
<message>
- <location filename="../forms/editaddressdialog.ui" line="14"/>
<source>Edit Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/editaddressdialog.ui" line="25"/>
<source>&amp;Label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/editaddressdialog.ui" line="35"/>
<source>The label associated with this address book entry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/editaddressdialog.ui" line="42"/>
<source>&amp;Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/editaddressdialog.ui" line="52"/>
<source>The address associated with this address book entry. This can only be modified for sending addresses.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="20"/>
<source>New receiving address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="24"/>
<source>New sending address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="27"/>
<source>Edit receiving address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="31"/>
<source>Edit sending address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="91"/>
<source>The entered address &quot;%1&quot; is already in the address book.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="96"/>
<source>The entered address &quot;%1&quot; is not a valid Bitcoin address.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="101"/>
<source>Could not unlock wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../editaddressdialog.cpp" line="106"/>
<source>New key generation failed.</source>
<translation type="unfinished"></translation>
</message>
@@ -705,349 +587,189 @@ Address: %4
<context>
<name>GUIUtil::HelpMessageBox</name>
<message>
- <location filename="../guiutil.cpp" line="420"/>
- <location filename="../guiutil.cpp" line="432"/>
<source>Bitcoin-Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="420"/>
<source>version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="422"/>
<source>Usage:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="423"/>
<source>command-line options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="427"/>
<source>UI options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="428"/>
<source>Set language, for example &quot;de_DE&quot; (default: system locale)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="429"/>
<source>Start minimized</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="430"/>
<source>Show splash screen on startup (default: 1)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>MessagePage</name>
- <message>
- <location filename="../forms/messagepage.ui" line="14"/>
- <source>Sign Message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="20"/>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="38"/>
- <source>The address to sign the message with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="48"/>
- <source>Choose adress from address book</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="58"/>
- <source>Alt+A</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="71"/>
- <source>Paste address from clipboard</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="81"/>
- <source>Alt+P</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="93"/>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="128"/>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="131"/>
- <source>&amp;Copy Signature</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="142"/>
- <source>Reset all sign message fields</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="145"/>
- <source>Clear &amp;All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="31"/>
- <source>Click &quot;Sign Message&quot; to get signature</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="114"/>
- <source>Sign a message to prove you own this address</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/messagepage.ui" line="117"/>
- <source>&amp;Sign Message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="30"/>
- <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="83"/>
- <location filename="../messagepage.cpp" line="90"/>
- <location filename="../messagepage.cpp" line="105"/>
- <location filename="../messagepage.cpp" line="117"/>
- <source>Error signing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="83"/>
- <source>%1 is not a valid address.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="90"/>
- <source>%1 does not refer to a key.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="105"/>
- <source>Private key for %1 is not available.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../messagepage.cpp" line="117"/>
- <source>Sign failed</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>OptionsDialog</name>
<message>
- <location filename="../forms/optionsdialog.ui" line="14"/>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="30"/>
<source>&amp;Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="36"/>
<source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="51"/>
<source>Pay transaction &amp;fee</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="82"/>
<source>Automatically start Bitcoin after logging in to the system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="85"/>
<source>&amp;Start Bitcoin on system login</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="92"/>
<source>Detach block and address databases at shutdown. This means they can be moved to another data directory, but it slows down shutdown. The wallet is always detached.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="95"/>
<source>&amp;Detach databases at shutdown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="116"/>
<source>&amp;Network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="122"/>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="125"/>
<source>Map port using &amp;UPnP</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="132"/>
- <source>Connect to the Bitcon network through a SOCKS proxy (e.g. when connecting through Tor).</source>
+ <source>Connect to the Bitcoin network through a SOCKS proxy (e.g. when connecting through Tor).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="135"/>
<source>&amp;Connect through SOCKS proxy:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="144"/>
<source>Proxy &amp;IP:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="163"/>
<source>IP address of the proxy (e.g. 127.0.0.1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="170"/>
<source>&amp;Port:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="189"/>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="196"/>
<source>SOCKS &amp;Version:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="209"/>
<source>SOCKS version of the proxy (e.g. 5)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="245"/>
<source>&amp;Window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="251"/>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="254"/>
<source>&amp;Minimize to the tray instead of the taskbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="261"/>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="264"/>
<source>M&amp;inimize on close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="285"/>
<source>&amp;Display</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="293"/>
<source>User Interface &amp;language:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="306"/>
<source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="317"/>
<source>&amp;Unit to show amounts in:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="330"/>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="339"/>
<source>Whether to show Bitcoin addresses in the transaction list or not.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="342"/>
<source>&amp;Display addresses in transaction list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="413"/>
<source>&amp;OK</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="420"/>
<source>&amp;Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/optionsdialog.ui" line="430"/>
<source>&amp;Apply</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="62"/>
<source>default</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="173"/>
- <location filename="../optionsdialog.cpp" line="182"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="173"/>
- <location filename="../optionsdialog.cpp" line="182"/>
<source>This setting will take effect after restarting Bitcoin.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="207"/>
<source>The supplied proxy address is invalid.</source>
<translation type="unfinished"></translation>
</message>
@@ -1055,69 +777,54 @@ Address: %4
<context>
<name>OverviewPage</name>
<message>
- <location filename="../forms/overviewpage.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="47"/>
- <location filename="../forms/overviewpage.ui" line="230"/>
<source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="89"/>
<source>Balance:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="147"/>
<source>Number of transactions:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="118"/>
<source>Unconfirmed:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="40"/>
<source>Wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="164"/>
<source>Immature:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="177"/>
<source>Mined balance that has not yet matured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="223"/>
<source>&lt;b&gt;Recent transactions&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="105"/>
<source>Your current balance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="134"/>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the current balance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/overviewpage.ui" line="154"/>
<source>Total number of transactions in wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../overviewpage.cpp" line="112"/>
- <location filename="../overviewpage.cpp" line="113"/>
<source>out of sync</source>
<translation type="unfinished"></translation>
</message>
@@ -1125,62 +832,46 @@ Address: %4
<context>
<name>QRCodeDialog</name>
<message>
- <location filename="../forms/qrcodedialog.ui" line="14"/>
<source>QR Code Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/qrcodedialog.ui" line="32"/>
- <source>QR Code</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/qrcodedialog.ui" line="55"/>
<source>Request Payment</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/qrcodedialog.ui" line="70"/>
<source>Amount:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/qrcodedialog.ui" line="105"/>
- <source>BTC</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/qrcodedialog.ui" line="121"/>
<source>Label:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/qrcodedialog.ui" line="144"/>
<source>Message:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/qrcodedialog.ui" line="186"/>
<source>&amp;Save As...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../qrcodedialog.cpp" line="45"/>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../qrcodedialog.cpp" line="63"/>
+ <source>The entered amount is invalid, please check.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../qrcodedialog.cpp" line="120"/>
<source>Save QR Code</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../qrcodedialog.cpp" line="120"/>
<source>PNG Images (*.png)</source>
<translation type="unfinished"></translation>
</message>
@@ -1188,140 +879,110 @@ Address: %4
<context>
<name>RPCConsole</name>
<message>
- <location filename="../forms/rpcconsole.ui" line="14"/>
<source>Bitcoin debug window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="46"/>
<source>Client name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="56"/>
- <location filename="../forms/rpcconsole.ui" line="79"/>
- <location filename="../forms/rpcconsole.ui" line="102"/>
- <location filename="../forms/rpcconsole.ui" line="125"/>
- <location filename="../forms/rpcconsole.ui" line="161"/>
- <location filename="../forms/rpcconsole.ui" line="214"/>
- <location filename="../forms/rpcconsole.ui" line="237"/>
- <location filename="../forms/rpcconsole.ui" line="260"/>
- <location filename="../rpcconsole.cpp" line="242"/>
<source>N/A</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="69"/>
<source>Client version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="24"/>
<source>&amp;Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="39"/>
<source>Client</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="115"/>
+ <source>Using OpenSSL version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="144"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="151"/>
<source>Number of connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="174"/>
<source>On testnet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="197"/>
<source>Block chain</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="204"/>
<source>Current number of blocks</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="227"/>
<source>Estimated total blocks</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="250"/>
<source>Last block time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="292"/>
<source>Debug logfile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="299"/>
<source>Open the Bitcoin debug logfile from the current data directory. This can take a few seconds for large logfiles.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="302"/>
<source>&amp;Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="318"/>
<source>Command-line options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="325"/>
<source>Show the Bitcoin-Qt help message to get a list with possible Bitcoin command-line options.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="328"/>
<source>&amp;Show</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="352"/>
<source>&amp;Console</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="92"/>
<source>Build date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/rpcconsole.ui" line="401"/>
<source>Clear console</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="209"/>
<source>Welcome to the Bitcoin RPC console.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="210"/>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="211"/>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
<translation type="unfinished"></translation>
</message>
@@ -1329,109 +990,82 @@ Address: %4
<context>
<name>SendCoinsDialog</name>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="14"/>
- <location filename="../sendcoinsdialog.cpp" line="122"/>
- <location filename="../sendcoinsdialog.cpp" line="127"/>
- <location filename="../sendcoinsdialog.cpp" line="132"/>
- <location filename="../sendcoinsdialog.cpp" line="137"/>
- <location filename="../sendcoinsdialog.cpp" line="143"/>
- <location filename="../sendcoinsdialog.cpp" line="148"/>
- <location filename="../sendcoinsdialog.cpp" line="153"/>
<source>Send Coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="64"/>
<source>Send to multiple recipients at once</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="67"/>
<source>&amp;Add Recipient</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="84"/>
<source>Remove all transaction fields</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="87"/>
<source>Clear &amp;All</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="106"/>
<source>Balance:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="113"/>
<source>123.456 BTC</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="144"/>
<source>Confirm the send action</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsdialog.ui" line="147"/>
<source>&amp;Send</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="94"/>
<source>&lt;b&gt;%1&lt;/b&gt; to %2 (%3)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="99"/>
<source>Confirm send coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="100"/>
<source>Are you sure you want to send %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="100"/>
<source> and </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="123"/>
<source>The recepient address is not valid, please recheck.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="128"/>
<source>The amount to pay must be larger than 0.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="133"/>
<source>The amount exceeds your balance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="138"/>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="144"/>
<source>Duplicate address found, can only send to each address once per send operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="149"/>
<source>Error: Transaction creation failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="154"/>
<source>Error: 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 type="unfinished"></translation>
</message>
@@ -1439,217 +1073,336 @@ Address: %4
<context>
<name>SendCoinsEntry</name>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="29"/>
<source>A&amp;mount:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="42"/>
<source>Pay &amp;To:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="66"/>
- <location filename="../sendcoinsentry.cpp" line="25"/>
<source>Enter a label for this address to add it to your address book</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="75"/>
<source>&amp;Label:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="93"/>
<source>The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="103"/>
<source>Choose address from address book</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="113"/>
<source>Alt+A</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="120"/>
<source>Paste address from clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="130"/>
<source>Alt+P</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="137"/>
<source>Remove this recipient</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../sendcoinsentry.cpp" line="26"/>
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>TransactionDesc</name>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Messaging - Sign / Verify a Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address to sign the message with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose an address from the address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished"></translation>
+ </message>
<message>
- <location filename="../transactiondesc.cpp" line="21"/>
- <source>Open for %1 blocks</source>
+ <source>Reset all sign message fields</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="23"/>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address the message was signed with (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click &quot;Sign Message&quot; to generate signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter Bitcoin signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wallet unlock was canceled.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDesc</name>
+ <message>
<source>Open until %1</source>
<translation type="unfinished"></translation>
</message>
+ <message numerus="yes">
+ <source>Open for %n block(s)</source>
+ <translation type="unfinished">
+ <numerusform>Open for %n block</numerusform>
+ <numerusform>Open for %n blocks</numerusform>
+ </translation>
+ </message>
<message>
- <location filename="../transactiondesc.cpp" line="29"/>
- <source>%1/offline?</source>
+ <source>%1/offline</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="31"/>
<source>%1/unconfirmed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="33"/>
<source>%1 confirmations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="51"/>
- <source>&lt;b&gt;Status:&lt;/b&gt; </source>
+ <source>Status</source>
<translation type="unfinished"></translation>
</message>
+ <message numerus="yes">
+ <source>, broadcast through %n node(s)</source>
+ <translation>
+ <numerusform>, broadcast through %n node</numerusform>
+ <numerusform>, broadcast through %n nodes</numerusform>
+ </translation>
+ </message>
<message>
- <location filename="../transactiondesc.cpp" line="56"/>
- <source>, has not been successfully broadcast yet</source>
+ <source>Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="58"/>
- <source>, broadcast through %1 node</source>
+ <source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="60"/>
- <source>, broadcast through %1 nodes</source>
+ <source>Generated</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="64"/>
- <source>&lt;b&gt;Date:&lt;/b&gt; </source>
+ <source>From</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="71"/>
- <source>&lt;b&gt;Source:&lt;/b&gt; Generated&lt;br&gt;</source>
+ <source>To</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="77"/>
- <location filename="../transactiondesc.cpp" line="94"/>
- <source>&lt;b&gt;From:&lt;/b&gt; </source>
+ <source>own address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="94"/>
- <source>unknown</source>
+ <source>label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="95"/>
- <location filename="../transactiondesc.cpp" line="118"/>
- <location filename="../transactiondesc.cpp" line="178"/>
- <source>&lt;b&gt;To:&lt;/b&gt; </source>
+ <source>Credit</source>
<translation type="unfinished"></translation>
</message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation>
+ <numerusform>matures in %n more block</numerusform>
+ <numerusform>matures in %n more blocks</numerusform>
+ </translation>
+ </message>
<message>
- <location filename="../transactiondesc.cpp" line="98"/>
- <source> (yours, label: </source>
+ <source>not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="100"/>
- <source> (yours)</source>
+ <source>Debit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="136"/>
- <location filename="../transactiondesc.cpp" line="150"/>
- <location filename="../transactiondesc.cpp" line="195"/>
- <location filename="../transactiondesc.cpp" line="212"/>
- <source>&lt;b&gt;Credit:&lt;/b&gt; </source>
+ <source>Transaction fee</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="138"/>
- <source>(%1 matures in %2 more blocks)</source>
+ <source>Net amount</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="142"/>
- <source>(not accepted)</source>
+ <source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="186"/>
- <location filename="../transactiondesc.cpp" line="194"/>
- <location filename="../transactiondesc.cpp" line="209"/>
- <source>&lt;b&gt;Debit:&lt;/b&gt; </source>
+ <source>Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="200"/>
- <source>&lt;b&gt;Transaction fee:&lt;/b&gt; </source>
+ <source>Transaction ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="216"/>
- <source>&lt;b&gt;Net amount:&lt;/b&gt; </source>
+ <source>Generated coins must mature 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to &quot;not accepted&quot; and it won&apos;t be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="222"/>
- <source>Message:</source>
+ <source>Debug information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="224"/>
- <source>Comment:</source>
+ <source>Transaction</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="226"/>
- <source>Transaction ID:</source>
+ <source>Inputs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiondesc.cpp" line="229"/>
- <source>Generated coins must mature 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it&apos;s state will change to &quot;not accepted&quot; and it won&apos;t be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <source>Amount</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, has not been successfully broadcast yet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransactionDescDialog</name>
<message>
- <location filename="../forms/transactiondescdialog.ui" line="14"/>
<source>Transaction details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/transactiondescdialog.ui" line="20"/>
<source>This pane shows a detailed description of the transaction</source>
<translation type="unfinished"></translation>
</message>
@@ -1657,27 +1410,22 @@ Address: %4
<context>
<name>TransactionTableModel</name>
<message>
- <location filename="../transactiontablemodel.cpp" line="226"/>
<source>Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="226"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="226"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="226"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../transactiontablemodel.cpp" line="281"/>
<source>Open for %n block(s)</source>
<translation>
<numerusform>Open for %n block</numerusform>
@@ -1685,95 +1433,77 @@ Address: %4
</translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="284"/>
<source>Open until %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="287"/>
<source>Offline (%1 confirmations)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="290"/>
<source>Unconfirmed (%1 of %2 confirmations)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="293"/>
<source>Confirmed (%1 confirmations)</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../transactiontablemodel.cpp" line="301"/>
<source>Mined balance will be available when it matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>Mined balance will be available when it matures in %n more block</numerusform>
+ <numerusform>Mined balance will be available when it matures in %n more blocks</numerusform>
</translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="306"/>
<source>This block was not received by any other nodes and will probably not be accepted!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="309"/>
<source>Generated but not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="352"/>
<source>Received with</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="354"/>
<source>Received from</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="357"/>
<source>Sent to</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="359"/>
<source>Payment to yourself</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="361"/>
<source>Mined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="399"/>
<source>(n/a)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="598"/>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="600"/>
<source>Date and time that the transaction was received.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="602"/>
<source>Type of transaction.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="604"/>
<source>Destination address of transaction.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactiontablemodel.cpp" line="606"/>
<source>Amount removed from or added to balance.</source>
<translation type="unfinished"></translation>
</message>
@@ -1781,256 +1511,137 @@ Address: %4
<context>
<name>TransactionView</name>
<message>
- <location filename="../transactionview.cpp" line="55"/>
- <location filename="../transactionview.cpp" line="71"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="56"/>
<source>Today</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="57"/>
<source>This week</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="58"/>
<source>This month</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="59"/>
<source>Last month</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="60"/>
<source>This year</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="61"/>
<source>Range...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="72"/>
<source>Received with</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="74"/>
<source>Sent to</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="76"/>
<source>To yourself</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="77"/>
<source>Mined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="78"/>
<source>Other</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="85"/>
<source>Enter address or label to search</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="92"/>
<source>Min amount</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="126"/>
<source>Copy address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="127"/>
<source>Copy label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="128"/>
<source>Copy amount</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="129"/>
<source>Edit label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="130"/>
<source>Show transaction details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="270"/>
<source>Export Transaction Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="271"/>
<source>Comma separated file (*.csv)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="279"/>
<source>Confirmed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="280"/>
<source>Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="281"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="282"/>
<source>Label</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="283"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="284"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="285"/>
<source>ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="289"/>
<source>Error exporting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="289"/>
<source>Could not write to file %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="384"/>
<source>Range:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../transactionview.cpp" line="392"/>
<source>to</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>VerifyMessageDialog</name>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="14"/>
- <source>Verify Signed Message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="55"/>
- <source>&amp;Verify Message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="20"/>
- <source>Enter the signing address, signature and message below (be careful to correctly copy newlines, spaces, tabs and other invisible characters) to verify the message.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="52"/>
- <source>Verify a message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="66"/>
- <source>Reset all verify message fields</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../forms/verifymessagedialog.ui" line="69"/>
- <source>Clear &amp;All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="27"/>
- <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="28"/>
- <source>Enter Bitcoin signature</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="51"/>
- <source>&quot;%1&quot; is not a valid address.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="51"/>
- <location filename="../verifymessagedialog.cpp" line="59"/>
- <source>Please check the address and try again.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="59"/>
- <source>&quot;%1&quot; does not refer to a key.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="70"/>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="70"/>
- <location filename="../verifymessagedialog.cpp" line="83"/>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="83"/>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="90"/>
- <source>Message verification failed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../verifymessagedialog.cpp" line="95"/>
- <source>Message verified.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>WalletModel</name>
<message>
- <location filename="../walletmodel.cpp" line="167"/>
<source>Sending...</source>
<translation type="unfinished"></translation>
</message>
@@ -2038,493 +1649,411 @@ Address: %4
<context>
<name>bitcoin-core</name>
<message>
- <location filename="../bitcoinstrings.cpp" line="61"/>
<source>Bitcoin version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="135"/>
<source>Usage:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="113"/>
<source>Send command to -server or bitcoind</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="95"/>
<source>List commands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="87"/>
<source>Get help for a command</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="105"/>
<source>Options:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="123"/>
<source>Specify configuration file (default: bitcoin.conf)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="126"/>
<source>Specify pid file (default: bitcoind.pid)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="86"/>
<source>Generate coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="72"/>
<source>Don&apos;t generate coins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="125"/>
<source>Specify data directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="120"/>
<source>Set database cache size in megabytes (default: 25)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="121"/>
<source>Set database disk log size in megabytes (default: 100)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="124"/>
<source>Specify connection timeout (in milliseconds)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="97"/>
<source>Listen for connections on &lt;port&gt; (default: 8333 or testnet: 18333)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="101"/>
<source>Maintain at most &lt;n&gt; connections to peers (default: 125)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="70"/>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="127"/>
<source>Specify your own public address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="104"/>
- <source>Only connect to nodes in network &lt;net&gt; (IPv4 or IPv6)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../bitcoinstrings.cpp" line="60"/>
<source>Bind to given address. Use [host]:port notation for IPv6</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="129"/>
<source>Threshold for disconnecting misbehaving peers (default: 100)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="35"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="102"/>
- <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: 10000)</source>
+ <source>Detach block and address databases. Increases shutdown time (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="103"/>
- <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: 10000)</source>
+ <source>Accept command line and JSON-RPC commands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="23"/>
- <source>Detach block and address databases. Increases shutdown time (default: 0)</source>
+ <source>Run in the background as a daemon and accept commands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="54"/>
- <source>Accept command line and JSON-RPC commands</source>
+ <source>Use the test network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="111"/>
- <source>Run in the background as a daemon and accept commands</source>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="139"/>
- <source>Use the test network</source>
+ <source>Connect only to the specified node(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="106"/>
- <source>Output extra debugging information</source>
+ <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="55"/>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="68"/>
- <source>Connect only to the specified node(s)</source>
+ <source>Find peers using DNS lookup (default: 1 unless -connect)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="71"/>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
+ <source>Invalid -tor address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="82"/>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: 5000)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: 1000)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only connect to nodes in network &lt;net&gt; (IPv4, IPv6 or Tor)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output extra debugging information. Implies all other -debug* options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output extra network debugging information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="108"/>
<source>Prepend debug output with timestamp</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="112"/>
<source>Select the version of socks proxy to use (4-5, default: 5)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="115"/>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="116"/>
<source>Send trace/debug info to debugger</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="137"/>
<source>Use UPnP to map the listening port (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="138"/>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="140"/>
+ <source>Use proxy to reach tor hidden services (default: same as -proxy)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Username for JSON-RPC connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="107"/>
+ <source>Warning: this version is obsolete, upgrade required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Password for JSON-RPC connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="96"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: 8332)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="58"/>
<source>Allow JSON-RPC connections from specified IP address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="114"/>
<source>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="32"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="134"/>
<source>Upgrade wallet to latest format</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="122"/>
<source>Set key pool size to &lt;n&gt; (default: 100)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="109"/>
<source>Rescan the block chain for missing wallet transactions</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="88"/>
<source>How many blocks to check at startup (default: 2500, 0 = all)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="89"/>
<source>How thorough the block verification is (0-6, default: 1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="90"/>
<source>Imports blocks from external blk000?.dat file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="51"/>
<source>
SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="136"/>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="118"/>
<source>Server certificate file (default: server.cert)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="119"/>
<source>Server private key (default: server.pem)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="17"/>
<source>Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="142"/>
<source>Warning: Disk space is low</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="128"/>
<source>This help message</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="20"/>
<source>Cannot obtain a lock on data directory %s. Bitcoin is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="62"/>
<source>Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="131"/>
<source>Unable to bind to %s on this computer (bind returned error %d, %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="69"/>
<source>Connect through socks proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="57"/>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="98"/>
<source>Loading addresses...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="74"/>
<source>Error loading blkindex.dat</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="76"/>
<source>Error loading wallet.dat: Wallet corrupted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="77"/>
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="141"/>
<source>Wallet needed to be rewritten: restart Bitcoin to complete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="75"/>
<source>Error loading wallet.dat</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="92"/>
<source>Invalid -proxy address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="133"/>
<source>Unknown network specified in -onlynet: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="132"/>
<source>Unknown -socks proxy version requested: %i</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="65"/>
<source>Cannot resolve -bind address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="66"/>
<source>Cannot resolve -externalip address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="93"/>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="81"/>
<source>Error: could not start node</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="80"/>
<source>Error: Wallet locked, unable to create transaction </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="29"/>
<source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="79"/>
<source>Error: Transaction creation failed </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="117"/>
<source>Sending...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="25"/>
<source>Error: 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 type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="94"/>
<source>Invalid amount</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="91"/>
<source>Insufficient funds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="99"/>
<source>Loading block index...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="56"/>
<source>Add a node to connect to and attempt to keep the connection open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="38"/>
<source>Unable to bind to %s on this computer. Bitcoin is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="85"/>
<source>Find peers using internet relay chat (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="84"/>
- <source>Find peers using DNS lookup (default: 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../bitcoinstrings.cpp" line="83"/>
<source>Fee per KB to add to transactions you send</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="40"/>
<source>Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="100"/>
<source>Loading wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="63"/>
<source>Cannot downgrade wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="64"/>
<source>Cannot initialize keypool</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="67"/>
<source>Cannot write default address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="110"/>
<source>Rescanning...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="73"/>
<source>Done loading</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="130"/>
<source>To use the %s option</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="8"/>
<source>%s, you must set a rpcpassword in the configuration file:
%s
It is recommended you use the following random password:
@@ -2536,24 +2065,20 @@ If the file does not exist, create it with owner-readable-only file permissions.
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="78"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="59"/>
<source>An error occured while setting up the RPC port %i for listening: %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="46"/>
<source>You must set rpcpassword=&lt;password&gt; in the configuration file:
%s
If the file does not exist, create it with owner-readable-only file permissions.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoinstrings.cpp" line="43"/>
<source>Warning: Please check that your computer&apos;s date and time are correct. If your clock is wrong Bitcoin will not work properly.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/qt/messagepage.cpp b/src/qt/messagepage.cpp
deleted file mode 100644
index ab3ea5a0c5..0000000000
--- a/src/qt/messagepage.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-#include <string>
-#include <vector>
-
-#include <QClipboard>
-#include <QInputDialog>
-#include <QList>
-#include <QListWidgetItem>
-#include <QMessageBox>
-
-#include "main.h"
-#include "wallet.h"
-#include "init.h"
-#include "base58.h"
-
-#include "messagepage.h"
-#include "ui_messagepage.h"
-
-#include "addressbookpage.h"
-#include "guiutil.h"
-#include "walletmodel.h"
-
-MessagePage::MessagePage(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::MessagePage)
-{
- ui->setupUi(this);
-
-#if (QT_VERSION >= 0x040700)
- /* Do not move this to the XML file, Qt before 4.7 will choke on it */
- ui->signFrom->setPlaceholderText(tr("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"));
- ui->signature->setPlaceholderText(tr("Click \"Sign Message\" to get signature"));
-#endif
-
- GUIUtil::setupAddressWidget(ui->signFrom, this);
- ui->signature->installEventFilter(this);
-
- ui->signFrom->setFocus();
-}
-
-MessagePage::~MessagePage()
-{
- delete ui;
-}
-
-void MessagePage::setModel(WalletModel *model)
-{
- this->model = model;
-}
-
-void MessagePage::setAddress(QString addr)
-{
- ui->signFrom->setText(addr);
- ui->message->setFocus();
-}
-
-void MessagePage::on_pasteButton_clicked()
-{
- setAddress(QApplication::clipboard()->text());
-}
-
-void MessagePage::on_addressBookButton_clicked()
-{
- AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this);
- dlg.setModel(model->getAddressTableModel());
- if(dlg.exec())
- {
- setAddress(dlg.getReturnValue());
- }
-}
-
-void MessagePage::on_copyToClipboard_clicked()
-{
- QApplication::clipboard()->setText(ui->signature->text());
-}
-
-void MessagePage::on_signMessage_clicked()
-{
- QString address = ui->signFrom->text();
-
- CBitcoinAddress addr(address.toStdString());
- if (!addr.IsValid())
- {
- QMessageBox::critical(this, tr("Error signing"), tr("%1 is not a valid address.").arg(address),
- QMessageBox::Abort, QMessageBox::Abort);
- return;
- }
- CKeyID keyID;
- if (!addr.GetKeyID(keyID))
- {
- QMessageBox::critical(this, tr("Error signing"), tr("%1 does not refer to a key.").arg(address),
- QMessageBox::Abort, QMessageBox::Abort);
- return;
- }
-
- WalletModel::UnlockContext ctx(model->requestUnlock());
- if(!ctx.isValid())
- {
- // Unlock wallet was cancelled
- return;
- }
-
- CKey key;
- if (!pwalletMain->GetKey(keyID, key))
- {
- QMessageBox::critical(this, tr("Error signing"), tr("Private key for %1 is not available.").arg(address),
- QMessageBox::Abort, QMessageBox::Abort);
- return;
- }
-
- CDataStream ss(SER_GETHASH, 0);
- ss << strMessageMagic;
- ss << ui->message->document()->toPlainText().toStdString();
-
- std::vector<unsigned char> vchSig;
- if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
- {
- QMessageBox::critical(this, tr("Error signing"), tr("Sign failed"),
- QMessageBox::Abort, QMessageBox::Abort);
- }
-
- ui->signature->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size())));
- ui->signature->setFont(GUIUtil::bitcoinAddressFont());
-}
-
-void MessagePage::on_clearButton_clicked()
-{
- ui->signFrom->clear();
- ui->message->clear();
- ui->signature->clear();
-
- ui->signFrom->setFocus();
-}
-
-bool MessagePage::eventFilter(QObject *object, QEvent *event)
-{
- if(object == ui->signature && (event->type() == QEvent::MouseButtonPress ||
- event->type() == QEvent::FocusIn))
- {
- ui->signature->selectAll();
- return true;
- }
- return QDialog::eventFilter(object, event);
-}
diff --git a/src/qt/messagepage.h b/src/qt/messagepage.h
deleted file mode 100644
index d668ae98d0..0000000000
--- a/src/qt/messagepage.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef MESSAGEPAGE_H
-#define MESSAGEPAGE_H
-
-#include <QDialog>
-
-namespace Ui {
- class MessagePage;
-}
-class WalletModel;
-
-QT_BEGIN_NAMESPACE
-QT_END_NAMESPACE
-
-class MessagePage : public QDialog
-{
- Q_OBJECT
-
-public:
- explicit MessagePage(QWidget *parent = 0);
- ~MessagePage();
-
- void setModel(WalletModel *model);
-
- void setAddress(QString);
-
-protected:
- bool eventFilter(QObject *object, QEvent *event);
-
-private:
- Ui::MessagePage *ui;
- WalletModel *model;
-
-private slots:
- void on_pasteButton_clicked();
- void on_addressBookButton_clicked();
-
- void on_signMessage_clicked();
- void on_copyToClipboard_clicked();
- void on_clearButton_clicked();
-};
-
-#endif // MESSAGEPAGE_H
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index e28b96b090..5f39c7814d 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -68,13 +68,23 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
/** check if the locale name consists of 2 parts (language_country) */
if(langStr.contains("_"))
{
+#if QT_VERSION >= 0x040800
+ /** display language strings as "native language - native country (locale name)", e.g. "Deutsch - Deutschland (de)" */
+ ui->lang->addItem(locale.nativeLanguageName() + QString(" - ") + locale.nativeCountryName() + QString(" (") + langStr + QString(")"), QVariant(langStr));
+#else
/** display language strings as "language - country (locale name)", e.g. "German - Germany (de)" */
ui->lang->addItem(QLocale::languageToString(locale.language()) + QString(" - ") + QLocale::countryToString(locale.country()) + QString(" (") + langStr + QString(")"), QVariant(langStr));
+#endif
}
else
{
+#if QT_VERSION >= 0x040800
+ /** display language strings as "native language (locale name)", e.g. "Deutsch (de)" */
+ ui->lang->addItem(locale.nativeLanguageName() + QString(" (") + langStr + QString(")"), QVariant(langStr));
+#else
/** display language strings as "language (locale name)", e.g. "German (de)" */
ui->lang->addItem(QLocale::languageToString(locale.language()) + QString(" (") + langStr + QString(")"), QVariant(langStr));
+#endif
}
}
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index d6c6bbf409..caa33414b2 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -40,7 +40,7 @@ void OptionsModel::Init()
{
QSettings settings;
- // These are QT-only settings:
+ // These are Qt-only settings:
nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
@@ -144,8 +144,6 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
return QVariant(fMinimizeOnClose);
case ProxyUse:
return settings.value("fUseProxy", false);
- case ProxySocksVersion:
- return settings.value("nSocksVersion", 5);
case ProxyIP: {
CService addrProxy;
if (GetProxy(NET_IPV4, addrProxy))
@@ -160,6 +158,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
else
return 9050;
}
+ case ProxySocksVersion:
+ return settings.value("nSocksVersion", 5);
case Fee:
return QVariant(nTransactionFee);
case DisplayUnit:
@@ -192,11 +192,9 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
settings.setValue("fMinimizeToTray", fMinimizeToTray);
break;
case MapPortUPnP:
- {
- fUseUPnP = value.toBool();
- settings.setValue("fUseUPnP", fUseUPnP);
- MapPort();
- }
+ fUseUPnP = value.toBool();
+ settings.setValue("fUseUPnP", fUseUPnP);
+ MapPort();
break;
case MinimizeOnClose:
fMinimizeOnClose = value.toBool();
@@ -206,60 +204,41 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
settings.setValue("fUseProxy", value.toBool());
ApplyProxySettings();
break;
- case ProxySocksVersion:
- settings.setValue("nSocksVersion", value.toInt());
- ApplyProxySettings();
- break;
case ProxyIP:
{
CService addrProxy("127.0.0.1", 9050);
GetProxy(NET_IPV4, addrProxy);
CNetAddr addr(value.toString().toStdString());
- if (addr.IsValid())
- {
- addrProxy.SetIP(addr);
- settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
- successful = ApplyProxySettings();
- }
- else
- {
- successful = false;
- }
+ addrProxy.SetIP(addr);
+ settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
+ successful = ApplyProxySettings();
}
break;
case ProxyPort:
{
CService addrProxy("127.0.0.1", 9050);
GetProxy(NET_IPV4, addrProxy);
- int nPort = atoi(value.toString().toAscii().data());
- if (nPort > 0 && nPort < std::numeric_limits<unsigned short>::max())
- {
- addrProxy.SetPort(nPort);
- settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
- successful = ApplyProxySettings();
- }
- else
- {
- successful = false;
- }
+ addrProxy.SetPort(value.toInt());
+ settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
+ successful = ApplyProxySettings();
}
break;
- case Fee: {
+ case ProxySocksVersion:
+ settings.setValue("nSocksVersion", value.toInt());
+ ApplyProxySettings();
+ break;
+ case Fee:
nTransactionFee = value.toLongLong();
settings.setValue("nTransactionFee", nTransactionFee);
- }
break;
- case DisplayUnit: {
- int unit = value.toInt();
- nDisplayUnit = unit;
+ case DisplayUnit:
+ nDisplayUnit = value.toInt();
settings.setValue("nDisplayUnit", nDisplayUnit);
- emit displayUnitChanged(unit);
- }
+ emit displayUnitChanged(nDisplayUnit);
break;
- case DisplayAddresses: {
+ case DisplayAddresses:
bDisplayAddresses = value.toBool();
settings.setValue("bDisplayAddresses", bDisplayAddresses);
- }
break;
case DetachDatabases: {
bool fDetachDB = value.toBool();
@@ -267,9 +246,8 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
settings.setValue("detachDB", fDetachDB);
}
break;
- case Language: {
+ case Language:
settings.setValue("language", value);
- }
break;
default:
break;
diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h
index b196f0bf60..34724ad032 100644
--- a/src/qt/optionsmodel.h
+++ b/src/qt/optionsmodel.h
@@ -12,23 +12,24 @@
class OptionsModel : public QAbstractListModel
{
Q_OBJECT
+
public:
explicit OptionsModel(QObject *parent = 0);
enum OptionID {
- StartAtStartup, // bool
- MinimizeToTray, // bool
- MapPortUPnP, // bool
- MinimizeOnClose, // bool
- ProxyUse, // bool
+ StartAtStartup, // bool
+ MinimizeToTray, // bool
+ MapPortUPnP, // bool
+ MinimizeOnClose, // bool
+ ProxyUse, // bool
+ ProxyIP, // QString
+ ProxyPort, // int
ProxySocksVersion, // int
- ProxyIP, // QString
- ProxyPort, // int
- Fee, // qint64
- DisplayUnit, // BitcoinUnits::Unit
- DisplayAddresses, // bool
- DetachDatabases, // bool
- Language, // QString
+ Fee, // qint64
+ DisplayUnit, // BitcoinUnits::Unit
+ DisplayAddresses, // bool
+ DetachDatabases, // bool
+ Language, // QString
OptionIDRowCount,
};
@@ -48,17 +49,16 @@ public:
int getDisplayUnit();
bool getDisplayAddresses();
QString getLanguage() { return language; }
+
private:
int nDisplayUnit;
bool bDisplayAddresses;
bool fMinimizeToTray;
bool fMinimizeOnClose;
QString language;
+
signals:
void displayUnitChanged(int unit);
-
-public slots:
-
};
#endif // OPTIONSMODEL_H
diff --git a/src/qt/qrcodedialog.cpp b/src/qt/qrcodedialog.cpp
index 32e5462cee..ca94975128 100644
--- a/src/qt/qrcodedialog.cpp
+++ b/src/qt/qrcodedialog.cpp
@@ -1,28 +1,34 @@
#include "qrcodedialog.h"
#include "ui_qrcodedialog.h"
+
+#include "bitcoinunits.h"
+#include "guiconstants.h"
#include "guiutil.h"
+#include "optionsmodel.h"
#include <QPixmap>
#include <QUrl>
-#include <QDebug>
#include <qrencode.h>
-#define EXPORT_IMAGE_SIZE 256
-
QRCodeDialog::QRCodeDialog(const QString &addr, const QString &label, bool enableReq, QWidget *parent) :
- QDialog(parent), ui(new Ui::QRCodeDialog), address(addr)
+ QDialog(parent),
+ ui(new Ui::QRCodeDialog),
+ model(0),
+ address(addr)
{
ui->setupUi(this);
+
setWindowTitle(QString("%1").arg(address));
ui->chkReqPayment->setVisible(enableReq);
- ui->lnReqAmount->setVisible(enableReq);
ui->lblAmount->setVisible(enableReq);
- ui->lblBTC->setVisible(enableReq);
+ ui->lnReqAmount->setVisible(enableReq);
ui->lnLabel->setText(label);
+ ui->btnSaveAs->setEnabled(false);
+
genCode();
}
@@ -31,6 +37,17 @@ QRCodeDialog::~QRCodeDialog()
delete ui;
}
+void QRCodeDialog::setModel(OptionsModel *model)
+{
+ this->model = model;
+
+ if (model)
+ connect(model, SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
+
+ // update the display unit, to not use the default ("BTC")
+ updateDisplayUnit();
+}
+
void QRCodeDialog::genCode()
{
QString uri = getURI();
@@ -57,26 +74,34 @@ void QRCodeDialog::genCode()
}
}
QRcode_free(code);
+
ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300));
+
+ ui->outUri->setPlainText(uri);
}
- else
- ui->lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message."));
}
QString QRCodeDialog::getURI()
{
QString ret = QString("bitcoin:%1").arg(address);
-
int paramCount = 0;
- if (ui->chkReqPayment->isChecked() && !ui->lnReqAmount->text().isEmpty())
+
+ ui->outUri->clear();
+
+ if (ui->chkReqPayment->isChecked())
{
- bool ok = false;
- ui->lnReqAmount->text().toDouble(&ok);
- if (ok)
+ if (ui->lnReqAmount->validate())
{
- ret += QString("?amount=%1").arg(ui->lnReqAmount->text());
+ // even if we allow a non BTC unit input in lnReqAmount, we generate the URI with BTC as unit (as defined in BIP21)
+ ret += QString("?amount=%1").arg(BitcoinUnits::format(BitcoinUnits::BTC, ui->lnReqAmount->value()));
paramCount++;
}
+ else
+ {
+ ui->btnSaveAs->setEnabled(false);
+ ui->lblQRCode->setText(tr("The entered amount is invalid, please check."));
+ return QString("");
+ }
}
if (!ui->lnLabel->text().isEmpty())
@@ -93,24 +118,29 @@ QString QRCodeDialog::getURI()
paramCount++;
}
- // limit URI length to 255 chars, to prevent a DoS against the QR-Code dialog
- if (ret.length() < 256)
- return ret;
- else
+ // limit URI length to prevent a DoS against the QR-Code dialog
+ if (ret.length() > MAX_URI_LENGTH)
+ {
+ ui->btnSaveAs->setEnabled(false);
+ ui->lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message."));
return QString("");
+ }
+
+ ui->btnSaveAs->setEnabled(true);
+ return ret;
}
-void QRCodeDialog::on_lnReqAmount_textChanged(const QString &arg1)
+void QRCodeDialog::on_lnReqAmount_textChanged()
{
genCode();
}
-void QRCodeDialog::on_lnLabel_textChanged(const QString &arg1)
+void QRCodeDialog::on_lnLabel_textChanged()
{
genCode();
}
-void QRCodeDialog::on_lnMessage_textChanged(const QString &arg1)
+void QRCodeDialog::on_lnMessage_textChanged()
{
genCode();
}
@@ -122,7 +152,20 @@ void QRCodeDialog::on_btnSaveAs_clicked()
myImage.scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE).save(fn);
}
-void QRCodeDialog::on_chkReqPayment_toggled(bool)
+void QRCodeDialog::on_chkReqPayment_toggled(bool fChecked)
{
+ if (!fChecked)
+ // if chkReqPayment is not active, don't display lnReqAmount as invalid
+ ui->lnReqAmount->setValid(true);
+
genCode();
}
+
+void QRCodeDialog::updateDisplayUnit()
+{
+ if (model)
+ {
+ // Update lnReqAmount with the current unit
+ ui->lnReqAmount->setDisplayUnit(model->getDisplayUnit());
+ }
+}
diff --git a/src/qt/qrcodedialog.h b/src/qt/qrcodedialog.h
index ad0611605b..c55c34bce6 100644
--- a/src/qt/qrcodedialog.h
+++ b/src/qt/qrcodedialog.h
@@ -7,6 +7,7 @@
namespace Ui {
class QRCodeDialog;
}
+class OptionsModel;
class QRCodeDialog : public QDialog
{
@@ -16,22 +17,25 @@ public:
explicit QRCodeDialog(const QString &addr, const QString &label, bool enableReq, QWidget *parent = 0);
~QRCodeDialog();
+ void setModel(OptionsModel *model);
+
private slots:
- void on_lnReqAmount_textChanged(const QString &arg1);
- void on_lnLabel_textChanged(const QString &arg1);
- void on_lnMessage_textChanged(const QString &arg1);
+ void on_lnReqAmount_textChanged();
+ void on_lnLabel_textChanged();
+ void on_lnMessage_textChanged();
void on_btnSaveAs_clicked();
+ void on_chkReqPayment_toggled(bool fChecked);
- void on_chkReqPayment_toggled(bool checked);
+ void updateDisplayUnit();
private:
Ui::QRCodeDialog *ui;
- QImage myImage;
-
- QString getURI();
+ OptionsModel *model;
QString address;
+ QImage myImage;
void genCode();
+ QString getURI();
};
#endif // QRCODEDIALOG_H
diff --git a/src/qt/qtipcserver.cpp b/src/qt/qtipcserver.cpp
index a887456855..e413c71bc0 100644
--- a/src/qt/qtipcserver.cpp
+++ b/src/qt/qtipcserver.cpp
@@ -2,73 +2,96 @@
// Distributed under the MIT/X11 software license, see the accompanying
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
-#include <boost/algorithm/string.hpp>
-#include <boost/interprocess/ipc/message_queue.hpp>
-#include <boost/tokenizer.hpp>
+#include "qtipcserver.h"
+#include "guiconstants.h"
+#include "ui_interface.h"
+#include "util.h"
+
#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/version.hpp>
#if defined(WIN32) && (!defined(BOOST_INTERPROCESS_HAS_WINDOWS_KERNEL_BOOTTIME) || !defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) || BOOST_VERSION < 104900)
#warning Compiling without BOOST_INTERPROCESS_HAS_WINDOWS_KERNEL_BOOTTIME and BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME uncommented in boost/interprocess/detail/tmp_dir_helpers.hpp or using a boost version before 1.49 may have unintended results see svn.boost.org/trac/boost/ticket/5392
#endif
-#include "ui_interface.h"
-#include "qtipcserver.h"
-
+using namespace boost;
using namespace boost::interprocess;
using namespace boost::posix_time;
-using namespace boost;
-using namespace std;
-void ipcShutdown()
+static void ipcThread2(void* pArg);
+
+#ifdef MAC_OSX
+// URI handling not implemented on OSX yet
+
+void ipcInit() { }
+
+#else
+
+static void ipcThread(void* pArg)
{
- message_queue::remove(BITCOINURI_QUEUE_NAME);
+ IMPLEMENT_RANDOMIZE_STACK(ipcThread(pArg));
+
+ // Make this thread recognisable as the GUI-IPC thread
+ RenameThread("bitcoin-gui-ipc");
+
+ try
+ {
+ ipcThread2(pArg);
+ }
+ catch (std::exception& e) {
+ PrintExceptionContinue(&e, "ipcThread()");
+ } catch (...) {
+ PrintExceptionContinue(NULL, "ipcThread()");
+ }
+ printf("ipcThread exited\n");
}
-void ipcThread(void* parg)
+static void ipcThread2(void* pArg)
{
- message_queue* mq = (message_queue*)parg;
- char strBuf[257];
- size_t nSize;
- unsigned int nPriority;
+ printf("ipcThread started\n");
+
+ message_queue* mq = (message_queue*)pArg;
+ char buffer[MAX_URI_LENGTH + 1] = "";
+ size_t nSize = 0;
+ unsigned int nPriority = 0;
+
loop
{
ptime d = boost::posix_time::microsec_clock::universal_time() + millisec(100);
- if(mq->timed_receive(&strBuf, sizeof(strBuf), nSize, nPriority, d))
+ if (mq->timed_receive(&buffer, sizeof(buffer), nSize, nPriority, d))
{
- uiInterface.ThreadSafeHandleURI(std::string(strBuf, nSize));
+ uiInterface.ThreadSafeHandleURI(std::string(buffer, nSize));
Sleep(1000);
}
+
if (fShutdown)
- {
- ipcShutdown();
break;
- }
}
- ipcShutdown();
+
+ // Remove message queue
+ message_queue::remove(BITCOINURI_QUEUE_NAME);
+ // Cleanup allocated memory
+ delete mq;
}
void ipcInit()
{
-#ifdef MAC_OSX
- // TODO: implement bitcoin: URI handling the Mac Way
- return;
-#endif
+ message_queue* mq = NULL;
+ char buffer[MAX_URI_LENGTH + 1] = "";
+ size_t nSize = 0;
+ unsigned int nPriority = 0;
- message_queue* mq;
- char strBuf[257];
- size_t nSize;
- unsigned int nPriority;
try {
- mq = new message_queue(open_or_create, BITCOINURI_QUEUE_NAME, 2, 256);
+ mq = new message_queue(open_or_create, BITCOINURI_QUEUE_NAME, 2, MAX_URI_LENGTH);
// Make sure we don't lose any bitcoin: URIs
for (int i = 0; i < 2; i++)
{
ptime d = boost::posix_time::microsec_clock::universal_time() + millisec(1);
- if(mq->timed_receive(&strBuf, sizeof(strBuf), nSize, nPriority, d))
+ if (mq->timed_receive(&buffer, sizeof(buffer), nSize, nPriority, d))
{
- uiInterface.ThreadSafeHandleURI(std::string(strBuf, nSize));
+ uiInterface.ThreadSafeHandleURI(std::string(buffer, nSize));
}
else
break;
@@ -76,13 +99,20 @@ void ipcInit()
// Make sure only one bitcoin instance is listening
message_queue::remove(BITCOINURI_QUEUE_NAME);
- mq = new message_queue(open_or_create, BITCOINURI_QUEUE_NAME, 2, 256);
+ delete mq;
+
+ mq = new message_queue(open_or_create, BITCOINURI_QUEUE_NAME, 2, MAX_URI_LENGTH);
}
catch (interprocess_exception &ex) {
+ printf("ipcInit() - boost interprocess exception #%d: %s\n", ex.get_error_code(), ex.what());
return;
}
+
if (!CreateThread(ipcThread, mq))
{
delete mq;
+ return;
}
}
+
+#endif
diff --git a/src/qt/qtipcserver.h b/src/qt/qtipcserver.h
index fcff10d8da..484b6222eb 100644
--- a/src/qt/qtipcserver.h
+++ b/src/qt/qtipcserver.h
@@ -1,4 +1,9 @@
+#ifndef QTIPCSERVER_H
+#define QTIPCSERVER_H
+
+// Define Bitcoin-Qt message queue name
#define BITCOINURI_QUEUE_NAME "BitcoinURI"
void ipcInit();
-void ipcShutdown();
+
+#endif // QTIPCSERVER_H
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index 7b40db0765..08f936e719 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -14,6 +14,7 @@
#include <QScrollBar>
#include <boost/tokenizer.hpp>
+#include <openssl/crypto.h>
// TODO: make it possible to filter out categories (esp debug messages when implemented)
// TODO: receive errors and debug messages through ClientModel
@@ -119,6 +120,9 @@ RPCConsole::RPCConsole(QWidget *parent) :
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
+ // set OpenSSL version label
+ ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
+
startExecutor();
clear();
diff --git a/src/qt/signverifymessagedialog.cpp b/src/qt/signverifymessagedialog.cpp
new file mode 100644
index 0000000000..f8edbf80ea
--- /dev/null
+++ b/src/qt/signverifymessagedialog.cpp
@@ -0,0 +1,274 @@
+#include "signverifymessagedialog.h"
+#include "ui_signverifymessagedialog.h"
+
+#include "addressbookpage.h"
+#include "base58.h"
+#include "guiutil.h"
+#include "init.h"
+#include "main.h"
+#include "optionsmodel.h"
+#include "walletmodel.h"
+#include "wallet.h"
+
+#include <string>
+#include <vector>
+
+#include <QClipboard>
+
+SignVerifyMessageDialog::SignVerifyMessageDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::SignVerifyMessageDialog),
+ model(0)
+{
+ ui->setupUi(this);
+
+#if (QT_VERSION >= 0x040700)
+ /* Do not move this to the XML file, Qt before 4.7 will choke on it */
+ ui->addressIn_SM->setPlaceholderText(tr("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"));
+ ui->signatureOut_SM->setPlaceholderText(tr("Click \"Sign Message\" to generate signature"));
+
+ ui->addressIn_VM->setPlaceholderText(tr("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"));
+ ui->signatureIn_VM->setPlaceholderText(tr("Enter Bitcoin signature"));
+#endif
+
+ GUIUtil::setupAddressWidget(ui->addressIn_SM, this);
+ GUIUtil::setupAddressWidget(ui->addressIn_VM, this);
+
+ ui->addressIn_SM->installEventFilter(this);
+ ui->messageIn_SM->installEventFilter(this);
+ ui->signatureOut_SM->installEventFilter(this);
+ ui->addressIn_VM->installEventFilter(this);
+ ui->messageIn_VM->installEventFilter(this);
+ ui->signatureIn_VM->installEventFilter(this);
+
+ ui->signatureOut_SM->setFont(GUIUtil::bitcoinAddressFont());
+ ui->signatureIn_VM->setFont(GUIUtil::bitcoinAddressFont());
+}
+
+SignVerifyMessageDialog::~SignVerifyMessageDialog()
+{
+ delete ui;
+}
+
+void SignVerifyMessageDialog::setModel(WalletModel *model)
+{
+ this->model = model;
+}
+
+void SignVerifyMessageDialog::setAddress_SM(QString address)
+{
+ ui->addressIn_SM->setText(address);
+ ui->messageIn_SM->setFocus();
+}
+
+void SignVerifyMessageDialog::setAddress_VM(QString address)
+{
+ ui->addressIn_VM->setText(address);
+ ui->messageIn_VM->setFocus();
+}
+
+void SignVerifyMessageDialog::showTab_SM(bool fShow)
+{
+ ui->tabWidget->setCurrentIndex(0);
+
+ if (fShow)
+ this->show();
+}
+
+void SignVerifyMessageDialog::showTab_VM(bool fShow)
+{
+ ui->tabWidget->setCurrentIndex(1);
+ if (fShow)
+ this->show();
+}
+
+void SignVerifyMessageDialog::on_addressBookButton_SM_clicked()
+{
+ if (model && model->getAddressTableModel())
+ {
+ AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this);
+ dlg.setModel(model->getAddressTableModel());
+ if (dlg.exec())
+ {
+ setAddress_SM(dlg.getReturnValue());
+ }
+ }
+}
+
+void SignVerifyMessageDialog::on_pasteButton_SM_clicked()
+{
+ setAddress_SM(QApplication::clipboard()->text());
+}
+
+void SignVerifyMessageDialog::on_signMessageButton_SM_clicked()
+{
+ /* Clear old signature to ensure users don't get confused on error with an old signature displayed */
+ ui->signatureOut_SM->clear();
+
+ CBitcoinAddress addr(ui->addressIn_SM->text().toStdString());
+ if (!addr.IsValid())
+ {
+ ui->addressIn_SM->setValid(false);
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_SM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
+ return;
+ }
+ CKeyID keyID;
+ if (!addr.GetKeyID(keyID))
+ {
+ ui->addressIn_SM->setValid(false);
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_SM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
+ return;
+ }
+
+ WalletModel::UnlockContext ctx(model->requestUnlock());
+ if (!ctx.isValid())
+ {
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_SM->setText(tr("Wallet unlock was canceled."));
+ return;
+ }
+
+ CKey key;
+ if (!pwalletMain->GetKey(keyID, key))
+ {
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_SM->setText(tr("Private key for the entered address is not available."));
+ return;
+ }
+
+ CDataStream ss(SER_GETHASH, 0);
+ ss << strMessageMagic;
+ ss << ui->messageIn_SM->document()->toPlainText().toStdString();
+
+ std::vector<unsigned char> vchSig;
+ if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
+ {
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signing failed.") + QString("</nobr>"));
+ return;
+ }
+
+ ui->statusLabel_SM->setStyleSheet("QLabel { color: green; }");
+ ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signed.") + QString("</nobr>"));
+
+ ui->signatureOut_SM->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size())));
+}
+
+void SignVerifyMessageDialog::on_copySignatureButton_SM_clicked()
+{
+ QApplication::clipboard()->setText(ui->signatureOut_SM->text());
+}
+
+void SignVerifyMessageDialog::on_clearButton_SM_clicked()
+{
+ ui->addressIn_SM->clear();
+ ui->messageIn_SM->clear();
+ ui->signatureOut_SM->clear();
+ ui->statusLabel_SM->clear();
+
+ ui->addressIn_SM->setFocus();
+}
+
+void SignVerifyMessageDialog::on_addressBookButton_VM_clicked()
+{
+ if (model && model->getAddressTableModel())
+ {
+ AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
+ dlg.setModel(model->getAddressTableModel());
+ if (dlg.exec())
+ {
+ setAddress_VM(dlg.getReturnValue());
+ }
+ }
+}
+
+void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
+{
+ CBitcoinAddress addr(ui->addressIn_VM->text().toStdString());
+ if (!addr.IsValid())
+ {
+ ui->addressIn_VM->setValid(false);
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
+ return;
+ }
+ CKeyID keyID;
+ if (!addr.GetKeyID(keyID))
+ {
+ ui->addressIn_VM->setValid(false);
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
+ return;
+ }
+
+ bool fInvalid = false;
+ std::vector<unsigned char> vchSig = DecodeBase64(ui->signatureIn_VM->text().toStdString().c_str(), &fInvalid);
+
+ if (fInvalid)
+ {
+ ui->signatureIn_VM->setValid(false);
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_VM->setText(tr("The signature could not be decoded.") + QString(" ") + tr("Please check the signature and try again."));
+ return;
+ }
+
+ CDataStream ss(SER_GETHASH, 0);
+ ss << strMessageMagic;
+ ss << ui->messageIn_VM->document()->toPlainText().toStdString();
+
+ CKey key;
+ if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig))
+ {
+ ui->signatureIn_VM->setValid(false);
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_VM->setText(tr("The signature did not match the message digest.") + QString(" ") + tr("Please check the signature and try again."));
+ return;
+ }
+
+ if (!(CBitcoinAddress(key.GetPubKey().GetID()) == addr))
+ {
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
+ ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
+ return;
+ }
+
+ ui->statusLabel_VM->setStyleSheet("QLabel { color: green; }");
+ ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verified.") + QString("</nobr>"));
+}
+
+void SignVerifyMessageDialog::on_clearButton_VM_clicked()
+{
+ ui->addressIn_VM->clear();
+ ui->signatureIn_VM->clear();
+ ui->messageIn_VM->clear();
+ ui->statusLabel_VM->clear();
+
+ ui->addressIn_VM->setFocus();
+}
+
+bool SignVerifyMessageDialog::eventFilter(QObject *object, QEvent *event)
+{
+ if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::FocusIn)
+ {
+ if (ui->tabWidget->currentIndex() == 0)
+ {
+ /* Clear status message on focus change */
+ ui->statusLabel_SM->clear();
+
+ /* Select generated signature */
+ if (object == ui->signatureOut_SM)
+ {
+ ui->signatureOut_SM->selectAll();
+ return true;
+ }
+ }
+ else if (ui->tabWidget->currentIndex() == 1)
+ {
+ /* Clear status message on focus change */
+ ui->statusLabel_VM->clear();
+ }
+ }
+ return QDialog::eventFilter(object, event);
+}
diff --git a/src/qt/signverifymessagedialog.h b/src/qt/signverifymessagedialog.h
new file mode 100644
index 0000000000..5569c8bf33
--- /dev/null
+++ b/src/qt/signverifymessagedialog.h
@@ -0,0 +1,49 @@
+#ifndef SIGNVERIFYMESSAGEDIALOG_H
+#define SIGNVERIFYMESSAGEDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+ class SignVerifyMessageDialog;
+}
+class WalletModel;
+
+QT_BEGIN_NAMESPACE
+QT_END_NAMESPACE
+
+class SignVerifyMessageDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit SignVerifyMessageDialog(QWidget *parent = 0);
+ ~SignVerifyMessageDialog();
+
+ void setModel(WalletModel *model);
+ void setAddress_SM(QString address);
+ void setAddress_VM(QString address);
+
+ void showTab_SM(bool fShow);
+ void showTab_VM(bool fShow);
+
+protected:
+ bool eventFilter(QObject *object, QEvent *event);
+
+private:
+ Ui::SignVerifyMessageDialog *ui;
+ WalletModel *model;
+
+private slots:
+ /* sign message */
+ void on_addressBookButton_SM_clicked();
+ void on_pasteButton_SM_clicked();
+ void on_signMessageButton_SM_clicked();
+ void on_copySignatureButton_SM_clicked();
+ void on_clearButton_SM_clicked();
+ /* verify message */
+ void on_addressBookButton_VM_clicked();
+ void on_verifyMessageButton_VM_clicked();
+ void on_clearButton_VM_clicked();
+};
+
+#endif // SIGNVERIFYMESSAGEDIALOG_H
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index 834abee470..3e7eca59ca 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -9,16 +9,12 @@
#include "ui_interface.h"
#include "base58.h"
-#include <QString>
-
-using namespace std;
-
QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
{
if (!wtx.IsFinal())
{
if (wtx.nLockTime < LOCKTIME_THRESHOLD)
- return tr("Open for %1 blocks").arg(nBestHeight - wtx.nLockTime);
+ return tr("Open for %n block(s)", "", nBestHeight - wtx.nLockTime);
else
return tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx.nLockTime));
}
@@ -26,7 +22,7 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
{
int nDepth = wtx.GetDepthInMainChain();
if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
- return tr("%1/offline?").arg(nDepth);
+ return tr("%1/offline").arg(nDepth);
else if (nDepth < 6)
return tr("%1/unconfirmed").arg(nDepth);
else
@@ -48,33 +44,31 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
int64 nDebit = wtx.GetDebit();
int64 nNet = nCredit - nDebit;
- strHTML += tr("<b>Status:</b> ") + FormatTxStatus(wtx);
+ strHTML += "<b>" + tr("Status") + ":</b> " + FormatTxStatus(wtx);
int nRequests = wtx.GetRequestCount();
if (nRequests != -1)
{
if (nRequests == 0)
strHTML += tr(", has not been successfully broadcast yet");
- else if (nRequests == 1)
- strHTML += tr(", broadcast through %1 node").arg(nRequests);
- else
- strHTML += tr(", broadcast through %1 nodes").arg(nRequests);
+ else if (nRequests > 0)
+ strHTML += tr(", broadcast through %n node(s)", "", nRequests);
}
strHTML += "<br>";
- strHTML += tr("<b>Date:</b> ") + (nTime ? GUIUtil::dateTimeStr(nTime) : QString("")) + "<br>";
+ strHTML += "<b>" + tr("Date") + ":</b> " + (nTime ? GUIUtil::dateTimeStr(nTime) : "") + "<br>";
//
// From
//
if (wtx.IsCoinBase())
{
- strHTML += tr("<b>Source:</b> Generated<br>");
+ strHTML += "<b>" + tr("Source") + ":</b> " + tr("Generated") + "<br>";
}
else if (!wtx.mapValue["from"].empty())
{
// Online transaction
if (!wtx.mapValue["from"].empty())
- strHTML += tr("<b>From:</b> ") + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "<br>";
+ strHTML += "<b>" + tr("From") + ":</b> " + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "<br>";
}
else
{
@@ -91,13 +85,13 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
{
if (wallet->mapAddressBook.count(address))
{
- strHTML += tr("<b>From:</b> ") + tr("unknown") + "<br>";
- strHTML += tr("<b>To:</b> ");
+ strHTML += "<b>" + tr("From") + ":</b> " + tr("unknown") + "<br>";
+ strHTML += "<b>" + tr("To") + ":</b> ";
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
if (!wallet->mapAddressBook[address].empty())
- strHTML += tr(" (yours, label: ") + GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + ")";
+ strHTML += " (" + tr("own address") + ", " + tr("label") + ": " + GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + ")";
else
- strHTML += tr(" (yours)");
+ strHTML += " (" + tr("own address") + ")";
strHTML += "<br>";
}
}
@@ -110,12 +104,11 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
//
// To
//
- string strAddress;
if (!wtx.mapValue["to"].empty())
{
// Online transaction
- strAddress = wtx.mapValue["to"];
- strHTML += tr("<b>To:</b> ");
+ std::string strAddress = wtx.mapValue["to"];
+ strHTML += "<b>" + tr("To") + ":</b> ";
CTxDestination dest = CBitcoinAddress(strAddress).Get();
if (wallet->mapAddressBook.count(dest) && !wallet->mapAddressBook[dest].empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[dest]) + " ";
@@ -133,13 +126,11 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
int64 nUnmatured = 0;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
nUnmatured += wallet->GetCredit(txout);
- strHTML += tr("<b>Credit:</b> ");
+ strHTML += "<b>" + tr("Credit") + ":</b> ";
if (wtx.IsInMainChain())
- strHTML += tr("(%1 matures in %2 more blocks)")
- .arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nUnmatured))
- .arg(wtx.GetBlocksToMaturity());
+ strHTML += BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nUnmatured)+ " (" + tr("matures in %n more block(s)", "", wtx.GetBlocksToMaturity()) + ")";
else
- strHTML += tr("(not accepted)");
+ strHTML += "(" + tr("not accepted") + ")";
strHTML += "<br>";
}
else if (nNet > 0)
@@ -147,7 +138,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
//
// Credit
//
- strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet) + "<br>";
+ strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet) + "<br>";
}
else
{
@@ -175,7 +166,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
CTxDestination address;
if (ExtractDestination(txout.scriptPubKey, address))
{
- strHTML += tr("<b>To:</b> ");
+ strHTML += "<b>" + tr("To") + ":</b> ";
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " ";
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
@@ -183,7 +174,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
}
}
- strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -txout.nValue) + "<br>";
+ strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -txout.nValue) + "<br>";
}
if (fAllToMe)
@@ -191,13 +182,13 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
// Payment to self
int64 nChange = wtx.GetChange();
int64 nValue = nCredit - nChange;
- strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nValue) + "<br>";
- strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nValue) + "<br>";
+ strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nValue) + "<br>";
+ strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nValue) + "<br>";
}
int64 nTxFee = nDebit - wtx.GetValueOut();
if (nTxFee > 0)
- strHTML += tr("<b>Transaction fee:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-nTxFee) + "<br>";
+ strHTML += "<b>" + tr("Transaction fee") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nTxFee) + "<br>";
}
else
{
@@ -206,47 +197,47 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
//
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if (wallet->IsMine(txin))
- strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-wallet->GetDebit(txin)) + "<br>";
+ strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -wallet->GetDebit(txin)) + "<br>";
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if (wallet->IsMine(txout))
- strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,wallet->GetCredit(txout)) + "<br>";
+ strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, wallet->GetCredit(txout)) + "<br>";
}
}
- strHTML += tr("<b>Net amount:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,nNet, true) + "<br>";
+ strHTML += "<b>" + tr("Net amount") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet, true) + "<br>";
//
// Message
//
if (!wtx.mapValue["message"].empty())
- strHTML += QString("<br><b>") + tr("Message:") + "</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "<br>";
+ strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "<br>";
if (!wtx.mapValue["comment"].empty())
- strHTML += QString("<br><b>") + tr("Comment:") + "</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
+ strHTML += "<br><b>" + tr("Comment") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
- strHTML += QString("<b>") + tr("Transaction ID:") + "</b> " + wtx.GetHash().ToString().c_str() + "<br>";
+ strHTML += "<b>" + tr("Transaction ID") + ":</b> " + wtx.GetHash().ToString().c_str() + "<br>";
if (wtx.IsCoinBase())
- strHTML += QString("<br>") + tr("Generated coins must mature 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "<br>";
+ strHTML += "<br>" + tr("Generated coins must mature 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "<br>";
//
// Debug view
//
if (fDebug)
{
- strHTML += "<hr><br>Debug information<br><br>";
+ strHTML += "<hr><br>" + tr("Debug information") + "<br><br>";
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if(wallet->IsMine(txin))
- strHTML += "<b>Debit:</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-wallet->GetDebit(txin)) + "<br>";
+ strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -wallet->GetDebit(txin)) + "<br>";
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if(wallet->IsMine(txout))
- strHTML += "<b>Credit:</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,wallet->GetCredit(txout)) + "<br>";
+ strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, wallet->GetCredit(txout)) + "<br>";
- strHTML += "<br><b>Transaction:</b><br>";
+ strHTML += "<br><b>" + tr("Transaction") + ":</b><br>";
strHTML += GUIUtil::HtmlEscape(wtx.ToString(), true);
CTxDB txdb("r"); // To fetch source txouts
- strHTML += "<br><b>Inputs:</b>";
+ strHTML += "<br><b>" + tr("Inputs") + ":</b>";
strHTML += "<ul>";
{
@@ -269,12 +260,13 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " ";
strHTML += QString::fromStdString(CBitcoinAddress(address).ToString());
}
- strHTML = strHTML + " Amount=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,vout.nValue);
- strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? "true" : "false") + "</li>";
+ strHTML = strHTML + " " + tr("Amount") + "=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, vout.nValue);
+ strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? tr("true") : tr("false")) + "</li>";
}
}
}
}
+
strHTML += "</ul>";
}
diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp
index a0e7dd4e77..1370a30ce4 100644
--- a/src/qt/transactionview.cpp
+++ b/src/qt/transactionview.cpp
@@ -160,6 +160,8 @@ void TransactionView::setModel(WalletModel *model)
transactionProxyModel = new TransactionFilterProxy(this);
transactionProxyModel->setSourceModel(model->getTransactionTableModel());
transactionProxyModel->setDynamicSortFilter(true);
+ transactionProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
+ transactionProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
transactionProxyModel->setSortRole(Qt::EditRole);
diff --git a/src/qt/verifymessagedialog.cpp b/src/qt/verifymessagedialog.cpp
deleted file mode 100644
index 92f58328a4..0000000000
--- a/src/qt/verifymessagedialog.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "verifymessagedialog.h"
-#include "ui_verifymessagedialog.h"
-
-#include <string>
-#include <vector>
-
-#include <QDialog>
-#include <QLabel>
-#include <QLineEdit>
-#include <QPlainTextEdit>
-#include <QPushButton>
-
-#include "main.h"
-#include "wallet.h"
-#include "walletmodel.h"
-#include "guiutil.h"
-#include "base58.h"
-
-VerifyMessageDialog::VerifyMessageDialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::VerifyMessageDialog)
-{
- ui->setupUi(this);
-
-#if (QT_VERSION >= 0x040700)
- /* Do not move this to the XML file, Qt before 4.7 will choke on it */
- ui->lnAddress->setPlaceholderText(tr("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"));
- ui->lnSig->setPlaceholderText(tr("Enter Bitcoin signature"));
-#endif
-
- GUIUtil::setupAddressWidget(ui->lnAddress, this);
- ui->lnAddress->installEventFilter(this);
-
- ui->lnSig->setFont(GUIUtil::bitcoinAddressFont());
-
- ui->lnAddress->setFocus();
-}
-
-VerifyMessageDialog::~VerifyMessageDialog()
-{
- delete ui;
-}
-
-void VerifyMessageDialog::on_verifyMessage_clicked()
-{
- CBitcoinAddress addr(ui->lnAddress->text().toStdString());
- if (!addr.IsValid())
- {
- ui->lnAddress->setValid(false);
- ui->lblStatus->setStyleSheet("QLabel { color: red; }");
- ui->lblStatus->setText(tr("\"%1\" is not a valid address.").arg(ui->lnAddress->text()) + QString(" ") + tr("Please check the address and try again."));
- return;
- }
- CKeyID keyID;
- if (!addr.GetKeyID(keyID))
- {
- ui->lnAddress->setValid(false);
- ui->lblStatus->setStyleSheet("QLabel { color: red; }");
- ui->lblStatus->setText(tr("\"%1\" does not refer to a key.").arg(ui->lnAddress->text()) + QString(" ") + tr("Please check the address and try again."));
- return;
- }
-
- bool fInvalid = false;
- std::vector<unsigned char> vchSig = DecodeBase64(ui->lnSig->text().toStdString().c_str(), &fInvalid);
-
- if (fInvalid)
- {
- ui->lnSig->setValid(false);
- ui->lblStatus->setStyleSheet("QLabel { color: red; }");
- ui->lblStatus->setText(tr("The signature could not be decoded.") + QString(" ") + tr("Please check the signature and try again."));
- return;
- }
-
- CDataStream ss(SER_GETHASH, 0);
- ss << strMessageMagic;
- ss << ui->edMessage->document()->toPlainText().toStdString();
-
- CKey key;
- if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig))
- {
- ui->lnSig->setValid(false);
- ui->lblStatus->setStyleSheet("QLabel { color: red; }");
- ui->lblStatus->setText(tr("The signature did not match the message digest.")+ QString(" ") + tr("Please check the signature and try again."));
- return;
- }
-
- if (!(CBitcoinAddress(key.GetPubKey().GetID()) == addr))
- {
- ui->lblStatus->setStyleSheet("QLabel { color: red; }");
- ui->lblStatus->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
- return;
- }
-
- ui->lblStatus->setStyleSheet("QLabel { color: green; }");
- ui->lblStatus->setText(QString("<nobr>") + tr("Message verified.") + QString("</nobr>"));
-}
-
-void VerifyMessageDialog::on_clearButton_clicked()
-{
- ui->lnAddress->clear();
- ui->lnSig->clear();
- ui->edMessage->clear();
- ui->lblStatus->clear();
-
- ui->edMessage->setFocus();
-}
-
-bool VerifyMessageDialog::eventFilter(QObject *object, QEvent *event)
-{
- if (object == ui->lnAddress && (event->type() == QEvent::MouseButtonPress ||
- event->type() == QEvent::FocusIn))
- {
- // set lnAddress to valid, as QEvent::FocusIn would not reach QValidatedLineEdit::focusInEvent
- ui->lnAddress->setValid(true);
- ui->lnAddress->selectAll();
- return true;
- }
- return QDialog::eventFilter(object, event);
-}
diff --git a/src/qt/verifymessagedialog.h b/src/qt/verifymessagedialog.h
deleted file mode 100644
index 0bed442d4c..0000000000
--- a/src/qt/verifymessagedialog.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef VERIFYMESSAGEDIALOG_H
-#define VERIFYMESSAGEDIALOG_H
-
-#include <QDialog>
-
-namespace Ui {
- class VerifyMessageDialog;
-}
-class AddressTableModel;
-
-QT_BEGIN_NAMESPACE
-QT_END_NAMESPACE
-
-class VerifyMessageDialog : public QDialog
-{
- Q_OBJECT
-
-public:
- explicit VerifyMessageDialog(QWidget *parent);
- ~VerifyMessageDialog();
-
-protected:
- bool eventFilter(QObject *object, QEvent *event);
-
-private:
- Ui::VerifyMessageDialog *ui;
-
-private slots:
- void on_verifyMessage_clicked();
- void on_clearButton_clicked();
-};
-
-#endif // VERIFYMESSAGEDIALOG_H
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 9245f774a4..3568616cd3 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -10,17 +10,24 @@
#include "base58.h"
#include <QSet>
+#include <QTimer>
WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) :
QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0),
transactionTableModel(0),
cachedBalance(0), cachedUnconfirmedBalance(0), cachedImmatureBalance(0),
cachedNumTransactions(0),
- cachedEncryptionStatus(Unencrypted)
+ cachedEncryptionStatus(Unencrypted),
+ cachedNumBlocks(0)
{
addressTableModel = new AddressTableModel(wallet, this);
transactionTableModel = new TransactionTableModel(wallet, this);
+ // This timer will be fired repeatedly to update the balance
+ pollTimer = new QTimer(this);
+ connect(pollTimer, SIGNAL(timeout()), this, SLOT(pollBalanceChanged()));
+ pollTimer->start(MODEL_UPDATE_DELAY);
+
subscribeToCoreSignals();
}
@@ -62,27 +69,45 @@ void WalletModel::updateStatus()
emit encryptionStatusChanged(newEncryptionStatus);
}
-void WalletModel::updateTransaction(const QString &hash, int status)
+void WalletModel::pollBalanceChanged()
{
- if(transactionTableModel)
- transactionTableModel->updateTransaction(hash, status);
+ if(nBestHeight != cachedNumBlocks)
+ {
+ // Balance and number of transactions might have changed
+ cachedNumBlocks = nBestHeight;
+ checkBalanceChanged();
+ }
+}
- // Balance and number of transactions might have changed
+void WalletModel::checkBalanceChanged()
+{
qint64 newBalance = getBalance();
qint64 newUnconfirmedBalance = getUnconfirmedBalance();
qint64 newImmatureBalance = getImmatureBalance();
- int newNumTransactions = getNumTransactions();
if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance)
+ {
+ cachedBalance = newBalance;
+ cachedUnconfirmedBalance = newUnconfirmedBalance;
+ cachedImmatureBalance = newImmatureBalance;
emit balanceChanged(newBalance, newUnconfirmedBalance, newImmatureBalance);
+ }
+}
+
+void WalletModel::updateTransaction(const QString &hash, int status)
+{
+ if(transactionTableModel)
+ transactionTableModel->updateTransaction(hash, status);
+ // Balance and number of transactions might have changed
+ checkBalanceChanged();
+
+ int newNumTransactions = getNumTransactions();
if(cachedNumTransactions != newNumTransactions)
+ {
+ cachedNumTransactions = newNumTransactions;
emit numTransactionsChanged(newNumTransactions);
-
- cachedBalance = newBalance;
- cachedUnconfirmedBalance = newUnconfirmedBalance;
- cachedImmatureBalance = newImmatureBalance;
- cachedNumTransactions = newNumTransactions;
+ }
}
void WalletModel::updateAddressBook(const QString &address, const QString &label, bool isMine, int status)
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index c973c5cf53..62558a49df 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -10,6 +10,10 @@ class AddressTableModel;
class TransactionTableModel;
class CWallet;
+QT_BEGIN_NAMESPACE
+class QTimer;
+QT_END_NAMESPACE
+
class SendCoinsRecipient
{
public:
@@ -120,9 +124,14 @@ private:
qint64 cachedImmatureBalance;
qint64 cachedNumTransactions;
EncryptionStatus cachedEncryptionStatus;
+ int cachedNumBlocks;
+
+ QTimer *pollTimer;
void subscribeToCoreSignals();
void unsubscribeFromCoreSignals();
+ void checkBalanceChanged();
+
signals:
// Signal that balance in wallet changed
void balanceChanged(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance);
@@ -148,6 +157,8 @@ public slots:
void updateTransaction(const QString &hash, int status);
/* New, updated or removed address book entry */
void updateAddressBook(const QString &address, const QString &label, bool isMine, int status);
+ /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
+ void pollBalanceChanged();
};
diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp
index 63c2dfe0ac..66e4d85f37 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpcrawtransaction.cpp
@@ -10,6 +10,7 @@
#include "db.h"
#include "init.h"
#include "main.h"
+#include "net.h"
#include "wallet.h"
using namespace std;
@@ -275,14 +276,16 @@ Value decoderawtransaction(const Array& params, bool fHelp)
Value signrawtransaction(const Array& params, bool fHelp)
{
- if (fHelp || params.size() < 1 || params.size() > 3)
+ if (fHelp || params.size() < 1 || params.size() > 4)
throw runtime_error(
- "signrawtransaction <hex string> [{\"txid\":txid,\"vout\":n,\"scriptPubKey\":hex},...] [<privatekey1>,...]\n"
+ "signrawtransaction <hex string> [{\"txid\":txid,\"vout\":n,\"scriptPubKey\":hex},...] [<privatekey1>,...] [sighashtype=\"ALL\"]\n"
"Sign inputs for raw transaction (serialized, hex-encoded).\n"
"Second optional argument is an array of previous transaction outputs that\n"
"this transaction depends on but may not yet be in the blockchain.\n"
"Third optional argument is an array of base58-encoded private\n"
"keys that, if given, will be the only keys used to sign the transaction.\n"
+ "Fourth option is a string that is one of six values; ALL, NONE, SINGLE or\n"
+ "ALL|ANYONECANPAY, NONE|ANYONECANPAY, SINGLE|ANYONECANPAY.\n"
"Returns json object with keys:\n"
" hex : raw transaction with signature(s) (hex-encoded string)\n"
" complete : 1 if transaction has a complete set of signature (0 if not)"
@@ -401,6 +404,25 @@ Value signrawtransaction(const Array& params, bool fHelp)
}
const CKeyStore& keystore = (fGivenKeys ? tempKeystore : *pwalletMain);
+ int nHashType = SIGHASH_ALL;
+ if (params.size() > 3)
+ {
+ static map<string, int> mapSigHashValues =
+ boost::assign::map_list_of
+ (string("ALL"), int(SIGHASH_ALL))
+ (string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY))
+ (string("NONE"), int(SIGHASH_NONE))
+ (string("NONE|ANYONECANPAY"), int(SIGHASH_NONE|SIGHASH_ANYONECANPAY))
+ (string("SINGLE"), int(SIGHASH_SINGLE))
+ (string("SINGLE|ANYONECANPAY"), int(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY))
+ ;
+ string strHashType = params[3].get_str();
+ if (mapSigHashValues.count(strHashType))
+ nHashType = mapSigHashValues[strHashType];
+ else
+ throw JSONRPCError(-8, "Invalid sighash param");
+ }
+
// Sign what we can:
for (unsigned int i = 0; i < mergedTx.vin.size(); i++)
{
@@ -413,7 +435,7 @@ Value signrawtransaction(const Array& params, bool fHelp)
const CScript& prevPubKey = mapPrevOut[txin.prevout];
txin.scriptSig.clear();
- SignSignature(keystore, prevPubKey, mergedTx, i);
+ SignSignature(keystore, prevPubKey, mergedTx, i, nHashType);
// ... and merge in other signatures:
BOOST_FOREACH(const CTransaction& txv, txVariants)
@@ -454,17 +476,29 @@ Value sendrawtransaction(const Array& params, bool fHelp)
catch (std::exception &e) {
throw JSONRPCError(-22, "TX decode failed");
}
+ uint256 hashTx = tx.GetHash();
- // push to local node
- CTxDB txdb("r");
- if (!tx.AcceptToMemoryPool(txdb))
- throw JSONRPCError(-22, "TX rejected");
-
- SyncWithWallets(tx, NULL, true);
+ // See if the transaction is already in a block
+ // or in the memory pool:
+ CTransaction existingTx;
+ uint256 hashBlock = 0;
+ if (GetTransaction(hashTx, existingTx, hashBlock))
+ {
+ if (hashBlock != 0)
+ throw JSONRPCError(-5, string("transaction already in block ")+hashBlock.GetHex());
+ // Not in block, but already in the memory pool; will drop
+ // through to re-relay it.
+ }
+ else
+ {
+ // push to local node
+ CTxDB txdb("r");
+ if (!tx.AcceptToMemoryPool(txdb))
+ throw JSONRPCError(-22, "TX rejected");
- // relay to network
- CInv inv(MSG_TX, tx.GetHash());
- RelayInventory(inv);
+ SyncWithWallets(tx, NULL, true);
+ }
+ RelayMessage(CInv(MSG_TX, hashTx), tx);
- return tx.GetHash().GetHex();
+ return hashTx.GetHex();
}
diff --git a/src/util.cpp b/src/util.cpp
index 9881545a02..963d58cd8b 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -51,6 +51,8 @@ namespace boost {
#endif
#include <io.h> /* for _commit */
#include "shlobj.h"
+#elif defined(__linux__)
+# include <sys/prctl.h>
#endif
using namespace std;
@@ -1275,3 +1277,20 @@ void runCommand(std::string strCommand)
printf("runCommand error: system(%s) returned %d\n", strCommand.c_str(), nErr);
}
+void RenameThread(const char* name)
+{
+#if defined(PR_SET_NAME)
+ // Only the first 15 characters are used (16 - NUL terminator)
+ ::prctl(PR_SET_NAME, name, 0, 0, 0);
+#elif 0 && (defined(__FreeBSD__) || defined(__OpenBSD__))
+ // TODO: This is currently disabled because it needs to be verified to work
+ // on FreeBSD or OpenBSD first. When verified the '0 &&' part can be
+ // removed.
+ pthread_set_name_np(pthread_self(), name);
+#elif defined(MAC_OSX)
+ pthread_setname_np(name);
+#else
+ // Prevent warnings for unused parameters...
+ (void)name;
+#endif
+}
diff --git a/src/util.h b/src/util.h
index 7b2c678916..4423d2ff58 100644
--- a/src/util.h
+++ b/src/util.h
@@ -391,6 +391,46 @@ inline uint256 Hash(const T1 pbegin, const T1 pend)
return hash2;
}
+class CHashWriter
+{
+private:
+ SHA256_CTX ctx;
+
+public:
+ int nType;
+ int nVersion;
+
+ void Init() {
+ SHA256_Init(&ctx);
+ }
+
+ CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) {
+ Init();
+ }
+
+ CHashWriter& write(const char *pch, size_t size) {
+ SHA256_Update(&ctx, pch, size);
+ return (*this);
+ }
+
+ // invalidates the object
+ uint256 GetHash() {
+ uint256 hash1;
+ SHA256_Final((unsigned char*)&hash1, &ctx);
+ uint256 hash2;
+ SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
+ return hash2;
+ }
+
+ template<typename T>
+ CHashWriter& operator<<(const T& obj) {
+ // Serialize to this stream
+ ::Serialize(*this, obj, nType, nVersion);
+ return (*this);
+ }
+};
+
+
template<typename T1, typename T2>
inline uint256 Hash(const T1 p1begin, const T1 p1end,
const T2 p2begin, const T2 p2end)
@@ -428,13 +468,9 @@ inline uint256 Hash(const T1 p1begin, const T1 p1end,
template<typename T>
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
{
- // Most of the time is spent allocating and deallocating CDataStream's
- // buffer. If this ever needs to be optimized further, make a CStaticStream
- // class with its buffer on the stack.
- CDataStream ss(nType, nVersion);
- ss.reserve(10000);
+ CHashWriter ss(nType, nVersion);
ss << obj;
- return Hash(ss.begin(), ss.end());
+ return ss.GetHash();
}
inline uint160 Hash160(const std::vector<unsigned char>& vch)
@@ -585,9 +621,7 @@ inline void ExitThread(size_t nExitCode)
}
#endif
-
-
-
+void RenameThread(const char* name);
inline uint32_t ByteReverse(uint32_t value)
{
diff --git a/src/walletdb.cpp b/src/walletdb.cpp
index 2c4d4c0ef0..72c548e602 100644
--- a/src/walletdb.cpp
+++ b/src/walletdb.cpp
@@ -323,6 +323,9 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
void ThreadFlushWalletDB(void* parg)
{
+ // Make this thread recognisable as the wallet flushing thread
+ RenameThread("bitcoin-wallet");
+
const string& strFile = ((const string*)parg)[0];
static bool fOneThread;
if (fOneThread)