Merge pull request #540 from langerhans/btc-0.9.2-batch-4

BTC 0.9.2 batch 4
This commit is contained in:
langerhans 2014-06-06 20:49:00 +02:00
commit 944b9e52ab
68 changed files with 9960 additions and 5498 deletions

View file

@ -1,3 +1,16 @@
bitcoin (0.9.1-precise1) precise; urgency=medium
* New upstream release.
* Backport pull #4019
-- Matt Corallo <matt@bluematt.me> Sat, 19 Apr 2014 17:29:00 -0400
bitcoin (0.9.0-precise1) precise; urgency=medium
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Thu, 20 Mar 2014 13:10:00 -0400
bitcoin (0.8.6-precise1) precise; urgency=medium
* New upstream release.

View file

@ -5,6 +5,7 @@ Maintainer: Jonas Smedegaard <dr@jones.dk>
Uploaders: Micah Anderson <micah@debian.org>
Build-Depends: debhelper,
devscripts,
automake,
bash-completion,
libboost-system-dev (>> 1.35) | libboost-system1.35-dev,
libdb4.8++-dev,
@ -17,7 +18,8 @@ Build-Depends: debhelper,
libboost-test-dev (>> 1.35) | libboost-test1.35-dev,
qt4-qmake,
libqt4-dev,
libqrencode-dev
libqrencode-dev,
libprotobuf-dev, protobuf-compiler
Standards-Version: 3.9.2
Homepage: http://www.dogecoin.com/
Vcs-Git: git://github.com/dogecoin/dogecoin.git
@ -34,7 +36,7 @@ Description: peer-to-peer network based digital currency - daemon
check for double-spending.
.
Full transaction history is stored locally at each client. This
requires 2+ GB of space, slowly growing.
requires 20+ GB of space, slowly growing.
.
This package provides dogecoind, a combined daemon and CLI tool to
interact with the daemon.
@ -50,6 +52,6 @@ Description: peer-to-peer network based digital currency - Qt GUI
check for double-spending.
.
Full transaction history is stored locally at each client. This
requires 2+ GB of space, slowly growing.
requires 20+ GB of space, slowly growing.
.
This package provides Dogecoin-Qt, a GUI for Dogecoin based on Qt.

View file

@ -1,6 +1,6 @@
dogecoin-qt usr/bin
share/pixmaps/dogecoin32.xpm usr/share/pixmaps
share/pixmaps/dogecoin16.xpm usr/share/pixmaps
share/pixmaps/dogecoin128.png usr/share/pixmaps
usr/local/bin/dogecoin-qt usr/bin
share/pixmaps/bitcoin32.xpm usr/share/pixmaps
share/pixmaps/bitcoin16.xpm usr/share/pixmaps
share/pixmaps/bitcoin128.png usr/share/pixmaps
debian/dogecoin-qt.desktop usr/share/applications
debian/dogecoin-qt.protocol usr/share/kde4/services/

View file

@ -1 +1,2 @@
src/dogecoind usr/bin
usr/local/bin/dogecoind usr/bin
usr/local/bin/dogecoin-cli usr/bin

View file

@ -11,23 +11,14 @@ DEB_INSTALL_MANPAGES_dogecoind += debian/manpages/*
%:
dh --with bash-completion $@
override_dh_auto_build:
cd src; $(MAKE) -f makefile.unix dogecoind
$(MAKE)
override_dh_auto_clean:
if [ -f Makefile ]; then $(MAKE) clean; else rm -rf build/; rm -f dogecoin-qt; fi
cd src; $(MAKE) -f makefile.unix clean
if [ -f Makefile ]; then $(MAKE) distclean; fi
rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/bitcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in
# Yea, autogen should be run on the source archive, but I like doing git archive
override_dh_auto_configure:
qmake dogecoin-qt.pro USE_QRCODE=1
./autogen.sh
./configure
override_dh_auto_test:
cd src; $(MAKE) -f makefile.unix test_dogecoin
src/test_dogecoin
# Ensure wrapper is set executable
binary-post-install/dogecoind:
chmod +x $(cdbs_curdestdir)usr/bin/dogecoind
binary-post-install/dogecoin-qt:
chmod +x $(cdbs_curdestdir)usr/bin/dogecoin-qt
make check

View file

@ -3,7 +3,7 @@ Contents
This directory contains tools for developers working on this repository.
github-merge.sh
----------------
==================
A small script to automate merging pull-requests securely and sign them with GPG.
@ -36,7 +36,8 @@ Configuring the github-merge tool for the bitcoin repository is done in the foll
git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing)
git config --global user.signingkey mykeyid (if you want to GPG sign)
## fix-copyright-headers.py
fix-copyright-headers.py
===========================
Every year newly updated files need to have its copyright headers updated to reflect the current year.
If you run this script from src/ it will automatically update the year on the copyright header for all
@ -46,4 +47,25 @@ For example a file changed in 2014 (with 2014 being the current year):
```// Copyright (c) 2009-2013 The Bitcoin developers```
would be changed to:
```// Copyright (c) 2009-2014 The Bitcoin developers```
```// Copyright (c) 2009-2014 The Bitcoin developers```
symbol-check.py
==================
A script to check that the (Linux) executables produced by gitian only contain
allowed gcc, glibc and libstdc++ version symbols. This makes sure they are
still compatible with the minimum supported Linux distribution versions.
Example usage after a gitian build:
find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py
If only supported symbols are used the return value will be 0 and the output will be empty.
If there are 'unsupported' symbols, the return value will be 1 a list like this will be printed:
.../64/test_bitcoin: symbol memcpy from unsupported version GLIBC_2.14
.../64/test_bitcoin: symbol __fdelt_chk from unsupported version GLIBC_2.15
.../64/test_bitcoin: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15
.../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15

108
contrib/devtools/symbol-check.py Executable file
View file

@ -0,0 +1,108 @@
#!/usr/bin/python
# Copyright (c) 2014 Wladimir J. van der Laan
# Distributed under the MIT/X11 software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
'''
A script to check that the (Linux) executables produced by gitian only contain
allowed gcc, glibc and libstdc++ version symbols. This makes sure they are
still compatible with the minimum supported Linux distribution versions.
Example usage:
find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py
'''
from __future__ import division, print_function
import subprocess
import re
import sys
# Debian 6.0.9 (Squeeze) has:
#
# - g++ version 4.4.5 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=g%2B%2B)
# - libc version 2.11.3 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libc6)
# - libstdc++ version 4.4.5 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libstdc%2B%2B6)
#
# Ubuntu 10.04.4 (Lucid Lynx) has:
#
# - g++ version 4.4.3 (http://packages.ubuntu.com/search?keywords=g%2B%2B&searchon=names&suite=lucid&section=all)
# - libc version 2.11.1 (http://packages.ubuntu.com/search?keywords=libc6&searchon=names&suite=lucid&section=all)
# - libstdc++ version 4.4.3 (http://packages.ubuntu.com/search?suite=lucid&section=all&arch=any&keywords=libstdc%2B%2B&searchon=names)
#
# Taking the minimum of these as our target.
#
# According to GNU ABI document (http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html) this corresponds to:
# GCC 4.4.0: GCC_4.4.0
# GCC 4.4.2: GLIBCXX_3.4.13, CXXABI_1.3.3
# (glibc) GLIBC_2_11
#
MAX_VERSIONS = {
'GCC': (4,4,0),
'CXXABI': (1,3,3),
'GLIBCXX': (3,4,13),
'GLIBC': (2,11)
}
READELF_CMD = '/usr/bin/readelf'
CPPFILT_CMD = '/usr/bin/c++filt'
class CPPFilt(object):
'''
Demangle C++ symbol names.
Use a pipe to the 'c++filt' command.
'''
def __init__(self):
self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def __call__(self, mangled):
self.proc.stdin.write(mangled + '\n')
return self.proc.stdout.readline().rstrip()
def close(self):
self.proc.stdin.close()
self.proc.stdout.close()
self.proc.wait()
def read_symbols(executable, imports=True):
'''
Parse an ELF executable and return a list of (symbol,version) tuples
for dynamic, imported symbols.
'''
p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
(stdout, stderr) = p.communicate()
if p.returncode:
raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip()))
syms = []
for line in stdout.split('\n'):
line = line.split()
if len(line)>7 and re.match('[0-9]+:$', line[0]):
(sym, _, version) = line[7].partition('@')
is_import = line[6] == 'UND'
if version.startswith('@'):
version = version[1:]
if is_import == imports:
syms.append((sym, version))
return syms
def check_version(max_versions, version):
if '_' in version:
(lib, _, ver) = version.rpartition('_')
else:
lib = version
ver = '0'
ver = tuple([int(x) for x in ver.split('.')])
if not lib in max_versions:
return False
return ver <= max_versions[lib]
if __name__ == '__main__':
cppfilt = CPPFilt()
retval = 0
for filename in sys.argv[1:]:
for sym,version in read_symbols(filename, True):
if version and not check_version(MAX_VERSIONS, version):
print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version))
retval = 1
exit(retval)

View file

@ -119,6 +119,10 @@ Berkeley DB
-----------
You need Berkeley DB 5.1. If you have to build Berkeley DB yourself:
wget 'http://download.oracle.com/berkeley-db/db-5.1.29.NC.tar.gz'
echo '08238e59736d1aacdd47cfb8e68684c695516c37f4fbe1b8267dde58dc3a576c db-5.1.29.NC.tar.gz' | sha256sum -c
# -> db-5.1.29.NC.tar.gz: OK
tar -xzvf db-5.1.29.NC.tar.gz
cd build_unix/
../dist/configure --enable-cxx
make

View file

@ -227,7 +227,6 @@ In this section we will be setting up the Debian installation for Gitian buildin
First we need to log in as `root` to set up dependencies and make sure that our
user can use the sudo command. Type/paste the following in the terminal:
```bash
apt-get install git ruby sudo apt-cacher-ng qemu-utils debootstrap lxc python-cheetah parted kpartx bridge-utils
adduser debian sudo
@ -249,15 +248,16 @@ echo '#!/bin/sh -e' > /etc/rc.local
echo 'brctl addbr br0' >> /etc/rc.local
echo 'ifconfig br0 10.0.3.2/24 up' >> /etc/rc.local
echo 'exit 0' >> /etc/rc.local
# make sure that USE_LXC is always set when logging in as debian
# make sure that USE_LXC is always set when logging in as debian,
# and configure LXC IP addresses
echo 'export USE_LXC=1' >> /home/debian/.profile
echo 'export GITIAN_HOST_IP=10.0.3.2' >> /home/debian/.profile
echo 'export LXC_GUEST_IP=10.0.3.5' >> /home/debian/.profile
reboot
```
At the end the VM is rebooted to make sure that the changes take effect.
**Note**: If you're following this guide on a physical system instead of a VirtualBox VM you could use `10.0.2.2` instead
of `10.0.3.2` in the above `ifconfig` line. This avoids having to patch gitian-builder in next section.
At the end the VM is rebooted to make sure that the changes take effect. The steps in this
section need only to be performed once.
Installing gitian
------------------
@ -286,20 +286,6 @@ git clone https://github.com/devrandom/gitian-builder.git
git clone https://github.com/dogecoin/dogecoin
```
We need to change the guest IP range for the gitian builder because otherwise it will
collide with VirtualBox its NAT IP range. Gitian does not have a way yet to configure
this, so we need to patch the IPs using `sed`. This is not nice but it will
have to do for now... (a [pull request
(#52)](https://github.com/devrandom/gitian-builder/pull/52) to make this
configurable without patching has been submitted):
```bash
sed -i 's/10.0.2.2/10.0.3.2/g' gitian-builder/target-bin/bootstrap-fixup
sed -i 's/10.0.2.5/10.0.3.5/g' gitian-builder/etc/lxc.config.in
```
*note* After you update the gitian-builder repository, you may need to repeat these manual changes.
Setting up gitian images
-------------------------

View file

@ -17,13 +17,13 @@
<string>APPL</string>
<key>CFBundleGetInfoString</key>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@, Copyright © 2013-@COPYRIGHT_YEAR@ Dogecoin Core developers, 2009-@COPYRIGHT_YEAR@ The Bitcoin Core developers</string>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@, Copyright © 2013-@COPYRIGHT_YEAR@ Dogecoin Core developers, 2009-@COPYRIGHT_YEAR@ The Bitcoin Core developers</string>
<key>CFBundleShortVersionString</key>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@</string>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@</string>
<key>CFBundleVersion</key>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@</string>
<string>@CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@</string>
<key>CFBundleSignature</key>
<string>????</string>

View file

@ -127,6 +127,7 @@ libbitcoin_server_wallet_a_SOURCES = \
$(BITCOIN_CORE_H)
libbitcoin_common_a_SOURCES = \
base58.cpp \
allocators.cpp \
chainparams.cpp \
core.cpp \

91
src/base58.cpp Normal file
View file

@ -0,0 +1,91 @@
// Copyright (c) 2014 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <assert.h>
#include <stdint.h>
#include <string.h>
#include <vector>
#include <string>
/* All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
bool DecodeBase58(const char *psz, std::vector<unsigned char>& vch) {
// Skip leading spaces.
while (*psz && isspace(*psz))
psz++;
// Skip and count leading '1's.
int zeroes = 0;
while (*psz == '1') {
zeroes++;
psz++;
}
// Allocate enough space in big-endian base256 representation.
std::vector<unsigned char> b256(strlen(psz) * 733 / 1000 + 1); // log(58) / log(256), rounded up.
// Process the characters.
while (*psz && !isspace(*psz)) {
// Decode base58 character
const char *ch = strchr(pszBase58, *psz);
if (ch == NULL)
return false;
// Apply "b256 = b256 * 58 + ch".
int carry = ch - pszBase58;
for (std::vector<unsigned char>::reverse_iterator it = b256.rbegin(); it != b256.rend(); it++) {
carry += 58 * (*it);
*it = carry % 256;
carry /= 256;
}
assert(carry == 0);
psz++;
}
// Skip trailing spaces.
while (isspace(*psz))
psz++;
if (*psz != 0)
return false;
// Skip leading zeroes in b256.
std::vector<unsigned char>::iterator it = b256.begin();
while (it != b256.end() && *it == 0)
it++;
// Copy result into output vector.
vch.reserve(zeroes + (b256.end() - it));
vch.assign(zeroes, 0x00);
while (it != b256.end())
vch.push_back(*(it++));
return true;
}
std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) {
// Skip & count leading zeroes.
int zeroes = 0;
while (pbegin != pend && *pbegin == 0) {
pbegin++;
zeroes++;
}
// Allocate enough space in big-endian base58 representation.
std::vector<unsigned char> b58((pend - pbegin) * 138 / 100 + 1); // log(256) / log(58), rounded up.
// Process the bytes.
while (pbegin != pend) {
int carry = *pbegin;
// Apply "b58 = b58 * 256 + ch".
for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); it != b58.rend(); it++) {
carry += 256 * (*it);
*it = carry % 58;
carry /= 58;
}
assert(carry == 0);
pbegin++;
}
// Skip leading zeroes in base58 result.
std::vector<unsigned char>::iterator it = b58.begin();
while (it != b58.end() && *it == 0)
it++;
// Translate the result into a string.
std::string str;
str.reserve(zeroes + (b58.end() - it));
str.assign(zeroes, '1');
while (it != b58.end())
str += pszBase58[*(it++)];
return str;
}

View file

@ -14,7 +14,6 @@
#ifndef BITCOIN_BASE58_H
#define BITCOIN_BASE58_H
#include "bignum.h"
#include "chainparams.h"
#include "hash.h"
#include "key.h"
@ -27,51 +26,11 @@
#include <boost/variant/apply_visitor.hpp>
#include <boost/variant/static_visitor.hpp>
/* All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
/**
* Encode a byte sequence as a base58-encoded string
* Encode a byte sequence as a base58-encoded string.
* pbegin and pend cannot be NULL, unless both are.
*/
inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
{
CAutoBN_CTX pctx;
CBigNum bn58 = 58;
CBigNum bn0 = 0;
// Convert big endian data to little endian - the extra zero at the end will
// ensure bignum interprets it as a positive number */
std::vector<unsigned char> vchTmp(pend-pbegin+1, 0);
reverse_copy(pbegin, pend, vchTmp.begin());
// Convert little endian data to bignum
CBigNum bn;
bn.setvch(vchTmp);
// Convert bignum to std::string
std::string str;
// The expected size increase from base58 conversion is approximately 137%,
// but use 138% to be safe
str.reserve((pend - pbegin) * 138 / 100 + 1);
CBigNum dv;
CBigNum rem;
while (bn > bn0)
{
if (!BN_div(&dv, &rem, &bn, &bn58, pctx))
throw bignum_error("EncodeBase58 : BN_div failed");
bn = dv;
unsigned int c = rem.getulong();
str += pszBase58[c];
}
// Leading zeroes encoded as base58 zeros
for (const unsigned char* p = pbegin; p < pend && *p == 0; p++)
str += pszBase58[0];
// Convert little endian std::string to big endian
reverse(str.begin(), str.end());
return str;
}
std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend);
/**
* Encode a byte vector as a base58-encoded string
@ -82,58 +41,15 @@ inline std::string EncodeBase58(const std::vector<unsigned char>& vch)
}
/**
* Decode a base58-encoded string (psz) into a byte vector (vchRet)
* return true if decoding is successful
* Decode a base58-encoded string (psz) into a byte vector (vchRet).
* return true if decoding is successful.
* psz cannot be NULL.
*/
inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet)
{
CAutoBN_CTX pctx;
vchRet.clear();
CBigNum bn58 = 58;
CBigNum bn = 0;
CBigNum bnChar;
while (isspace(*psz))
psz++;
// Convert big endian string to bignum
for (const char* p = psz; *p; p++)
{
const char* p1 = strchr(pszBase58, *p);
if (p1 == NULL)
{
while (isspace(*p))
p++;
if (*p != '\0')
return false;
break;
}
bnChar.setulong(p1 - pszBase58);
if (!BN_mul(&bn, &bn, &bn58, pctx))
throw bignum_error("DecodeBase58 : BN_mul failed");
bn += bnChar;
}
// Get bignum as little endian data
std::vector<unsigned char> vchTmp = bn.getvch();
// Trim off the sign byte if present
if (vchTmp.size() >= 2 && vchTmp.end()[-1] == 0 && vchTmp.end()[-2] >= 0x80)
vchTmp.erase(vchTmp.end()-1);
// Restore leading zeros
int nLeadingZeros = 0;
for (const char* p = psz; *p == pszBase58[0]; p++)
nLeadingZeros++;
vchRet.assign(nLeadingZeros + vchTmp.size(), 0);
// Convert little endian data to big endian
reverse_copy(vchTmp.begin(), vchTmp.end(), vchRet.end() - vchTmp.size());
return true;
}
bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet);
/**
* Decode a base58-encoded string (str) into a byte vector (vchRet)
* return true if decoding is successful
* Decode a base58-encoded string (str) into a byte vector (vchRet).
* return true if decoding is successful.
*/
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet)
{

View file

@ -127,7 +127,7 @@ public:
CTransaction txNew;
txNew.vin.resize(1);
txNew.vout.resize(1);
txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vout[0].nValue = 88 * COIN;
txNew.vout[0].scriptPubKey = CScript() << ParseHex("040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9") << OP_CHECKSIG;
genesis.vtx.push_back(txNew);

View file

@ -79,53 +79,54 @@ const string strMessageMagic = "Dogecoin Signed Message:\n";
// Internal stuff
namespace {
struct CBlockIndexWorkComparator
{
bool operator()(CBlockIndex *pa, CBlockIndex *pb) {
// First sort by most total work, ...
if (pa->nChainWork > pb->nChainWork) return false;
if (pa->nChainWork < pb->nChainWork) return true;
struct CBlockIndexWorkComparator
{
bool operator()(CBlockIndex *pa, CBlockIndex *pb) {
// First sort by most total work, ...
if (pa->nChainWork > pb->nChainWork) return false;
if (pa->nChainWork < pb->nChainWork) return true;
// ... then by earliest time received, ...
if (pa->nSequenceId < pb->nSequenceId) return false;
if (pa->nSequenceId > pb->nSequenceId) return true;
// ... then by earliest time received, ...
if (pa->nSequenceId < pb->nSequenceId) return false;
if (pa->nSequenceId > pb->nSequenceId) return true;
// Use pointer address as tie breaker (should only happen with blocks
// loaded from disk, as those all have id 0).
if (pa < pb) return false;
if (pa > pb) return true;
// Use pointer address as tie breaker (should only happen with blocks
// loaded from disk, as those all have id 0).
if (pa < pb) return false;
if (pa > pb) return true;
// Identical blocks.
return false;
}
};
// Identical blocks.
return false;
}
};
CBlockIndex *pindexBestInvalid;
set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexValid; // may contain all CBlockIndex*'s that have validness >=BLOCK_VALID_TRANSACTIONS, and must contain those who aren't failed
CBlockIndex *pindexBestInvalid;
// may contain all CBlockIndex*'s that have validness >=BLOCK_VALID_TRANSACTIONS, and must contain those who aren't failed
set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexValid;
CCriticalSection cs_LastBlockFile;
CBlockFileInfo infoLastBlockFile;
int nLastBlockFile = 0;
CCriticalSection cs_LastBlockFile;
CBlockFileInfo infoLastBlockFile;
int nLastBlockFile = 0;
// Every received block is assigned a unique and increasing identifier, so we
// know which one to give priority in case of a fork.
CCriticalSection cs_nBlockSequenceId;
// Blocks loaded from disk are assigned id 0, so start the counter at 1.
uint32_t nBlockSequenceId = 1;
// Every received block is assigned a unique and increasing identifier, so we
// know which one to give priority in case of a fork.
CCriticalSection cs_nBlockSequenceId;
// Blocks loaded from disk are assigned id 0, so start the counter at 1.
uint32_t nBlockSequenceId = 1;
// Sources of received blocks, to be able to send them reject messages or ban
// them, if processing happens afterwards. Protected by cs_main.
map<uint256, NodeId> mapBlockSource;
// Sources of received blocks, to be able to send them reject messages or ban
// them, if processing happens afterwards. Protected by cs_main.
map<uint256, NodeId> mapBlockSource;
// Blocks that are in flight, and that are in the queue to be downloaded.
// Protected by cs_main.
struct QueuedBlock {
uint256 hash;
int64_t nTime; // Time of "getdata" request in microseconds.
int nQueuedBefore; // Number of blocks in flight at the time of request.
};
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
map<uint256, pair<NodeId, list<uint256>::iterator> > mapBlocksToDownload;
// Blocks that are in flight, and that are in the queue to be downloaded.
// Protected by cs_main.
struct QueuedBlock {
uint256 hash;
int64_t nTime; // Time of "getdata" request in microseconds.
int nQueuedBefore; // Number of blocks in flight at the time of request.
};
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
map<uint256, pair<NodeId, list<uint256>::iterator> > mapBlocksToDownload;
}
//////////////////////////////////////////////////////////////////////////////
@ -479,6 +480,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
//TODO: this isn't identical to dogecoin reference client.
bool IsStandardTx(const CTransaction& tx, string& reason)
{
AssertLockHeld(cs_main);
if (tx.nVersion > CTransaction::CURRENT_VERSION || tx.nVersion < 1) {
reason = "version";
return false;
@ -561,6 +563,7 @@ bool IsStandardTx(const CTransaction& tx, string& reason)
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
{
AssertLockHeld(cs_main);
// Time based nLockTime implemented in 0.1.6
if (tx.nLockTime == 0)
return true;
@ -672,6 +675,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, CCoinsViewCache& inputs)
int CMerkleTx::SetMerkleBranch(const CBlock* pblock)
{
AssertLockHeld(cs_main);
CBlock blockTmp;
if (pblock == NULL) {
@ -809,6 +813,7 @@ int64_t GetMinFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree,
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
bool* pfMissingInputs, bool fRejectInsaneFee)
{
AssertLockHeld(cs_main);
if (pfMissingInputs)
*pfMissingInputs = false;
@ -954,6 +959,7 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const
{
if (hashBlock == 0 || nIndex == -1)
return 0;
AssertLockHeld(cs_main);
// Find the block it claims to be in
map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
@ -977,6 +983,7 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const
int CMerkleTx::GetDepthInMainChain(CBlockIndex* &pindexRet) const
{
AssertLockHeld(cs_main);
int nResult = GetDepthInMainChainINTERNAL(pindexRet);
if (nResult == 0 && !mempool.exists(GetHash()))
return -1; // Not in chain, not in mempool
@ -1032,11 +1039,11 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock
fseek(file, postx.nTxOffset, SEEK_CUR);
file >> txOut;
} catch (std::exception &e) {
return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
return error("%s : Deserialize or I/O error - %s", __func__, e.what());
}
hashBlock = header.GetHash();
if (txOut.GetHash() != hash)
return error("%s : txid mismatch", __PRETTY_FUNCTION__);
return error("%s : txid mismatch", __func__);
return true;
}
}
@ -1120,7 +1127,7 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos)
filein >> block;
}
catch (std::exception &e) {
return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
return error("%s : Deserialize or I/O error - %s", __func__, e.what());
}
// Check the header
@ -1390,6 +1397,7 @@ int GetNumBlocksOfPeers()
bool IsInitialBlockDownload()
{
LOCK(cs_main);
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate())
return true;
static int64_t nLastUpdate;
@ -1409,6 +1417,7 @@ CBlockIndex *pindexBestForkTip = NULL, *pindexBestForkBase = NULL;
void CheckForkWarningConditions()
{
AssertLockHeld(cs_main);
// Before we get past initial download, we cannot reliably alert about forks
// (we assume we don't get stuck on a fork before the last checkpoint)
if (IsInitialBlockDownload())
@ -1454,6 +1463,7 @@ void CheckForkWarningConditions()
void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip)
{
AssertLockHeld(cs_main);
// If we are on a fork that is sufficiently large, set a warning flag
CBlockIndex* pfork = pindexNewForkTip;
CBlockIndex* plonger = chainActive.Tip();
@ -1820,6 +1830,7 @@ void ThreadScriptCheck() {
bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck)
{
AssertLockHeld(cs_main);
// Check it again in case a previous version let a bad block in
if (!CheckBlock(block, state, !fJustCheck, !fJustCheck))
return false;
@ -1944,8 +1955,13 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
if (fJustCheck)
return true;
// Correct transaction counts.
pindex->nTx = block.vtx.size();
if (pindex->pprev)
pindex->nChainTx = pindex->pprev->nChainTx + block.vtx.size();
// Write undo information to disk
if (pindex->GetUndoPos().IsNull() || (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_SCRIPTS)
if (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS))
{
if (pindex->GetUndoPos().IsNull()) {
CDiskBlockPos pos;
@ -1959,7 +1975,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
pindex->nStatus |= BLOCK_HAVE_UNDO;
}
pindex->nStatus = (pindex->nStatus & ~BLOCK_VALID_MASK) | BLOCK_VALID_SCRIPTS;
pindex->RaiseValidity(BLOCK_VALID_SCRIPTS);
CDiskBlockIndex blockindex(pindex);
if (!pblocktree->WriteBlockIndex(blockindex))
@ -2153,10 +2169,11 @@ void static FindMostWorkChain() {
CBlockIndex *pindexTest = pindexNew;
bool fInvalidAncestor = false;
while (pindexTest && !chainActive.Contains(pindexTest)) {
if (pindexTest->nStatus & BLOCK_FAILED_MASK) {
if (!pindexTest->IsValid(BLOCK_VALID_TRANSACTIONS) || !(pindexTest->nStatus & BLOCK_HAVE_DATA)) {
// Candidate has an invalid ancestor, remove entire chain from the set.
if (pindexBestInvalid == NULL || pindexNew->nChainWork > pindexBestInvalid->nChainWork)
pindexBestInvalid = pindexNew; CBlockIndex *pindexFailed = pindexNew;
pindexBestInvalid = pindexNew;
CBlockIndex *pindexFailed = pindexNew;
while (pindexTest != pindexFailed) {
pindexFailed->nStatus |= BLOCK_FAILED_CHILD;
setBlockIndexValid.erase(pindexFailed);
@ -2183,6 +2200,7 @@ void static FindMostWorkChain() {
// Try to activate to the most-work chain (thereby connecting it).
bool ActivateBestChain(CValidationState &state) {
LOCK(cs_main);
CBlockIndex *pindexOldTip = chainActive.Tip();
bool fComplete = false;
while (!fComplete) {
@ -2229,12 +2247,14 @@ bool ActivateBestChain(CValidationState &state) {
return true;
}
bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos& pos)
CBlockIndex* AddToBlockIndex(CBlockHeader& block)
{
// Check for duplicate
uint256 hash = block.GetHash();
if (mapBlockIndex.count(hash))
return state.Invalid(error("AddToBlockIndex() : %s already exists", hash.ToString()), 0, "duplicate");
std::map<uint256, CBlockIndex*>::iterator it = mapBlockIndex.find(hash);
if (it != mapBlockIndex.end())
return it->second;
// Construct new block index object
CBlockIndex* pindexNew = new CBlockIndex(block);
@ -2251,14 +2271,38 @@ bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos
pindexNew->pprev = (*miPrev).second;
pindexNew->nHeight = pindexNew->pprev->nHeight + 1;
}
pindexNew->nTx = block.vtx.size();
pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + pindexNew->GetBlockWork().getuint256();
pindexNew->nChainTx = (pindexNew->pprev ? pindexNew->pprev->nChainTx : 0) + pindexNew->nTx;
pindexNew->RaiseValidity(BLOCK_VALID_TREE);
return pindexNew;
}
// Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS).
bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBlockIndex *pindexNew, const CDiskBlockPos& pos)
{
pindexNew->nTx = block.vtx.size();
if (pindexNew->pprev) {
// Not the genesis block.
if (pindexNew->pprev->nChainTx) {
// This parent's block's total number transactions is known, so compute outs.
pindexNew->nChainTx = pindexNew->pprev->nChainTx + pindexNew->nTx;
} else {
// The total number of transactions isn't known yet.
// We will compute it when the block is connected.
pindexNew->nChainTx = 0;
}
} else {
// Genesis block.
pindexNew->nChainTx = pindexNew->nTx;
}
pindexNew->nFile = pos.nFile;
pindexNew->nDataPos = pos.nPos;
pindexNew->nUndoPos = 0;
pindexNew->nStatus = BLOCK_VALID_TRANSACTIONS | BLOCK_HAVE_DATA;
setBlockIndexValid.insert(pindexNew);
pindexNew->nStatus |= BLOCK_HAVE_DATA;
if (pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS))
setBlockIndexValid.insert(pindexNew);
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexNew)))
return state.Abort(_("Failed to write block index"));
@ -2267,6 +2311,7 @@ bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos
if (!ActivateBestChain(state))
return false;
LOCK(cs_main);
if (pindexNew == chainActive.Tip())
{
// Clear fork warning if its no longer applicable
@ -2381,26 +2426,55 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
}
bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW)
{
// Check proof of work matches claimed amount
if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits))
return state.DoS(50, error("CheckBlockHeader() : proof of work failed"),
REJECT_INVALID, "high-hash");
// Check timestamp
if (block.GetBlockTime() > GetAdjustedTime() + 2 * 60 * 60)
return state.Invalid(error("CheckBlockHeader() : block timestamp too far in the future"),
REJECT_INVALID, "time-too-new");
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(mapBlockIndex);
if (pcheckpoint && block.hashPrevBlock != (chainActive.Tip() ? chainActive.Tip()->GetBlockHash() : uint256(0)))
{
// Extra checks to prevent "fill up memory by spamming with bogus blocks"
int64_t deltaTime = block.GetBlockTime() - pcheckpoint->nTime;
if (deltaTime < 0)
{
return state.DoS(100, error("CheckBlockHeader() : block with timestamp before last checkpoint"),
REJECT_CHECKPOINT, "time-too-old");
}
CBigNum bnNewBlock;
bnNewBlock.SetCompact(block.nBits);
CBigNum bnRequired;
bnRequired.SetCompact(ComputeMinWork(pcheckpoint->nBits, deltaTime));
if (bnNewBlock > bnRequired)
{
return state.DoS(100, error("CheckBlockHeader() : block with too little proof-of-work"),
REJECT_INVALID, "bad-diffbits");
}
}
return true;
}
bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bool fCheckMerkleRoot)
{
// These are checks that are independent of context
// that can be verified before saving an orphan block.
if (!CheckBlockHeader(block, state, fCheckPOW))
return false;
// Size limits
if (block.vtx.empty() || block.vtx.size() > MAX_BLOCK_SIZE || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE)
return state.DoS(100, error("CheckBlock() : size limits failed"),
REJECT_INVALID, "bad-blk-length");
// Check proof of work matches claimed amount
if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits))
return state.DoS(50, error("CheckBlock() : proof of work failed"),
REJECT_INVALID, "high-hash");
// Check timestamp
if (block.GetBlockTime() > GetAdjustedTime() + 2 * 60 * 60)
return state.Invalid(error("CheckBlock() : block timestamp too far in the future"),
REJECT_INVALID, "time-too-new");
// First transaction must be coinbase, the rest must not be
if (block.vtx.empty() || !block.vtx[0].IsCoinBase())
return state.DoS(100, error("CheckBlock() : first tx is not coinbase"),
@ -2447,12 +2521,18 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo
return true;
}
bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp)
bool AcceptBlockHeader(CBlockHeader& block, CValidationState& state, CBlockIndex** ppindex)
{
AssertLockHeld(cs_main);
// Check for duplicate
uint256 hash = block.GetHash();
if (mapBlockIndex.count(hash))
return state.Invalid(error("AcceptBlock() : block already in mapBlockIndex"), 0, "duplicate");
std::map<uint256, CBlockIndex*>::iterator miSelf = mapBlockIndex.find(hash);
CBlockIndex *pindex = NULL;
if (miSelf != mapBlockIndex.end()) {
pindex = miSelf->second;
if (pindex->nStatus & BLOCK_FAILED_MASK)
return state.Invalid(error("AcceptBlock() : block is marked invalid"), 0, "duplicate");
}
// Get prev block index
CBlockIndex* pindexPrev = NULL;
@ -2474,12 +2554,6 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp)
return state.Invalid(error("AcceptBlock() : block's timestamp is too early"),
REJECT_INVALID, "time-too-old");
// Check that all transactions are finalized
BOOST_FOREACH(const CTransaction& tx, block.vtx)
if (!IsFinalTx(tx, nHeight, block.GetBlockTime()))
return state.DoS(10, error("AcceptBlock() : contains a non-final transaction"),
REJECT_INVALID, "bad-txns-nonfinal");
// Check that the block chain matches the known block chain up to a checkpoint
if (!Checkpoints::CheckBlock(nHeight, hash))
return state.DoS(100, error("AcceptBlock() : rejected by checkpoint lock-in at %d", nHeight),
@ -2500,18 +2574,57 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp)
REJECT_OBSOLETE, "bad-version");
}
}
// Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
if (block.nVersion >= 2)
}
if (pindex == NULL)
pindex = AddToBlockIndex(block);
if (ppindex)
*ppindex = pindex;
return true;
}
bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, CDiskBlockPos* dbp)
{
AssertLockHeld(cs_main);
CBlockIndex *&pindex = *ppindex;
if (!AcceptBlockHeader(block, state, &pindex))
return false;
if (!CheckBlock(block, state)) {
if (state.Invalid() && !state.CorruptionPossible()) {
pindex->nStatus |= BLOCK_FAILED_VALID;
}
return false;
}
int nHeight = pindex->nHeight;
uint256 hash = pindex->GetBlockHash();
// Check that all transactions are finalized
BOOST_FOREACH(const CTransaction& tx, block.vtx)
if (!IsFinalTx(tx, nHeight, block.GetBlockTime())) {
pindex->nStatus |= BLOCK_FAILED_VALID;
return state.DoS(10, error("AcceptBlock() : contains a non-final transaction"),
REJECT_INVALID, "bad-txns-nonfinal");
}
// Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
if (block.nVersion >= 2)
{
// if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
if ((!TestNet() && CBlockIndex::IsSuperMajority(2, pindex->pprev, 750, 1000)) ||
(TestNet() && CBlockIndex::IsSuperMajority(2, pindex->pprev, 51, 100)))
{
// if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
if ((!TestNet() && CBlockIndex::IsSuperMajority(2, pindexPrev, 750, 1000)) ||
(TestNet() && CBlockIndex::IsSuperMajority(2, pindexPrev, 51, 100)))
{
CScript expect = CScript() << nHeight;
if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
!std::equal(expect.begin(), expect.end(), block.vtx[0].vin[0].scriptSig.begin()))
return state.DoS(100, error("AcceptBlock() : block height mismatch in coinbase"),
REJECT_INVALID, "bad-cb-height");
CScript expect = CScript() << nHeight;
if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
!std::equal(expect.begin(), expect.end(), block.vtx[0].vin[0].scriptSig.begin())) {
pindex->nStatus |= BLOCK_FAILED_VALID;
return state.DoS(100, error("AcceptBlock() : block height mismatch in coinbase"),
REJECT_INVALID, "bad-cb-height");
}
}
}
@ -2527,8 +2640,8 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp)
if (dbp == NULL)
if (!WriteBlockToDisk(block, blockPos))
return state.Abort(_("Failed to write block"));
if (!AddToBlockIndex(block, state, blockPos))
return error("AcceptBlock() : AddToBlockIndex failed");
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
return error("AcceptBlock() : ReceivedBlockTransactions failed");
} catch(std::runtime_error &e) {
return state.Abort(_("System error: ") + e.what());
}
@ -2563,6 +2676,7 @@ bool CBlockIndex::IsSuperMajority(int minVersion, const CBlockIndex* pstart, uns
int64_t CBlockIndex::GetMedianTime() const
{
AssertLockHeld(cs_main);
const CBlockIndex* pindex = this;
for (int i = 0; i < nMedianTimeSpan/2; i++)
{
@ -2575,6 +2689,7 @@ int64_t CBlockIndex::GetMedianTime() const
void PushGetBlocks(CNode* pnode, CBlockIndex* pindexBegin, uint256 hashEnd)
{
AssertLockHeld(cs_main);
// Filter out duplicate requests
if (pindexBegin == pnode->pindexLastGetBlocksBegin && hashEnd == pnode->hashLastGetBlocksEnd)
return;
@ -2599,30 +2714,9 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl
if (!CheckBlock(*pblock, state))
return error("ProcessBlock() : CheckBlock FAILED");
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(mapBlockIndex);
if (pcheckpoint && pblock->hashPrevBlock != (chainActive.Tip() ? chainActive.Tip()->GetBlockHash() : uint256(0)))
{
// Extra checks to prevent "fill up memory by spamming with bogus blocks"
int64_t deltaTime = pblock->GetBlockTime() - pcheckpoint->nTime;
if (deltaTime < 0)
{
return state.DoS(100, error("ProcessBlock() : block with timestamp before last checkpoint"),
REJECT_CHECKPOINT, "time-too-old");
}
CBigNum bnNewBlock;
bnNewBlock.SetCompact(pblock->nBits);
CBigNum bnRequired;
bnRequired.SetCompact(ComputeMinWork(pcheckpoint->nBits, deltaTime));
if (bnNewBlock > bnRequired)
{
return state.DoS(100, error("ProcessBlock() : block with too little proof-of-work"),
REJECT_INVALID, "bad-diffbits");
}
}
// If we don't already have its previous block, shunt it off to holding area until we get it
if (pblock->hashPrevBlock != 0 && !mapBlockIndex.count(pblock->hashPrevBlock))
// If we don't already have its previous block (with full data), shunt it off to holding area until we get it
std::map<uint256, CBlockIndex*>::iterator it = mapBlockIndex.find(pblock->hashPrevBlock);
if (pblock->hashPrevBlock != 0 && (it == mapBlockIndex.end() || !(it->second->nStatus & BLOCK_HAVE_DATA)))
{
LogPrintf("ProcessBlock: ORPHAN BLOCK %lu, prev=%s\n", (unsigned long)mapOrphanBlocks.size(), pblock->hashPrevBlock.ToString());
@ -2647,7 +2741,9 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl
}
// Store to disk
if (!AcceptBlock(*pblock, state, dbp))
CBlockIndex *pindex = NULL;
bool ret = AcceptBlock(*pblock, state, &pindex, dbp);
if (!ret)
return error("ProcessBlock() : AcceptBlock FAILED");
// Recursively process any orphan blocks that depended on this one
@ -2668,7 +2764,8 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl
block.BuildMerkleTree();
// Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan resolution (that is, feeding people an invalid block based on LegitBlockX in order to get anyone relaying LegitBlockX banned)
CValidationState stateDummy;
if (AcceptBlock(block, stateDummy))
CBlockIndex *pindexChild = NULL;
if (AcceptBlock(block, stateDummy, &pindexChild))
vWorkQueue.push_back(mi->second->hashBlock);
mapOrphanBlocks.erase(mi->second->hashBlock);
delete mi->second;
@ -2931,7 +3028,7 @@ bool static LoadBlockIndexDB()
CBlockIndex* pindex = item.second;
pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + pindex->GetBlockWork().getuint256();
pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx;
if ((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS && !(pindex->nStatus & BLOCK_FAILED_MASK))
if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS))
setBlockIndexValid.insert(pindex);
if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork))
pindexBestInvalid = pindex;
@ -3056,6 +3153,7 @@ bool LoadBlockIndex()
bool InitBlockIndex() {
LOCK(cs_main);
// Check whether we're already initialized
if (chainActive.Genesis() != NULL)
return true;
@ -3077,7 +3175,8 @@ bool InitBlockIndex() {
return error("LoadBlockIndex() : FindBlockPos failed");
if (!WriteBlockToDisk(block, blockPos))
return error("LoadBlockIndex() : writing genesis block to disk failed");
if (!AddToBlockIndex(block, state, blockPos))
CBlockIndex *pindex = AddToBlockIndex(block);
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
return error("LoadBlockIndex() : genesis block not accepted");
} catch(std::runtime_error &e) {
return error("LoadBlockIndex() : failed to initialize block database: %s", e.what());
@ -3091,6 +3190,7 @@ bool InitBlockIndex() {
void PrintBlockTree()
{
AssertLockHeld(cs_main);
// pre-compute tree structure
map<CBlockIndex*, vector<CBlockIndex*> > mapNext;
for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)
@ -3183,11 +3283,11 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
unsigned int nSize = 0;
try {
// locate a header
unsigned char buf[4];
unsigned char buf[MESSAGE_START_SIZE];
blkdat.FindByte(Params().MessageStart()[0]);
nRewind = blkdat.GetPos()+1;
blkdat >> FLATDATA(buf);
if (memcmp(buf, Params().MessageStart(), 4))
if (memcmp(buf, Params().MessageStart(), MESSAGE_START_SIZE))
continue;
// read size
blkdat >> nSize;
@ -3217,7 +3317,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
break;
}
} catch (std::exception &e) {
LogPrintf("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
LogPrintf("%s : Deserialize or I/O error - %s", __func__, e.what());
}
}
fclose(fileIn);
@ -4303,6 +4403,10 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
}
}
TRY_LOCK(cs_main, lockMain); // Acquire cs_main for IsInitialBlockDownload() and CNodeState()
if (!lockMain)
return true;
// Address refresh broadcast
static int64_t nLastRebroadcast;
if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60))
@ -4353,10 +4457,6 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto->PushMessage("addr", vAddr);
}
TRY_LOCK(cs_main, lockMain);
if (!lockMain)
return true;
CNodeState &state = *State(pto->GetId());
if (state.fShouldBan) {
if (pto->addr.IsLocal())

View file

@ -400,7 +400,7 @@ public:
filein >> hashChecksum;
}
catch (std::exception &e) {
return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
return error("%s : Deserialize or I/O error - %s", __func__, e.what());
}
// Verify checksum
@ -624,11 +624,13 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos& pos);
// Context-independent validity checks
bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW = true);
bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
// Store block on disk
// if dbp is provided, the file is known to already reside on disk
bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp = NULL);
bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex **pindex, CDiskBlockPos* dbp = NULL);
bool AcceptBlockHeader(CBlockHeader& block, CValidationState& state, CBlockIndex **ppindex= NULL);
@ -888,6 +890,29 @@ public:
{
LogPrintf("%s\n", ToString().c_str());
}
// Check whether this block index entry is valid up to the passed validity level.
bool IsValid(enum BlockStatus nUpTo = BLOCK_VALID_TRANSACTIONS) const
{
assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
if (nStatus & BLOCK_FAILED_MASK)
return false;
return ((nStatus & BLOCK_VALID_MASK) >= nUpTo);
}
// Raise the validity level of this block index entry.
// Returns true if the validity was changed.
bool RaiseValidity(enum BlockStatus nUpTo)
{
assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
if (nStatus & BLOCK_FAILED_MASK)
return false;
if ((nStatus & BLOCK_VALID_MASK) < nUpTo) {
nStatus = (nStatus & ~BLOCK_VALID_MASK) | nUpTo;
return true;
}
return false;
}
};

View file

@ -359,7 +359,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int&
}
++nExtraNonce;
unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2
pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CBigNum(nExtraNonce)) + COINBASE_FLAGS;
pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100);
pblock->hashMerkleRoot = pblock->BuildMerkleTree();

View file

@ -37,6 +37,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Cannot obtain a lock on data directory %s. Dogecoin is probably already "
"running."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Continuously rate-limit free transactions to <n>*1000 bytes per minute "
"(default:15)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Enter regression test mode, which uses a special chain in which blocks can "
"be solved instantly. This is intended for regression testing tools and app "
"development."),
@ -62,6 +65,17 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Execute command when the best block changes (%s in cmd is replaced by block "
"hash)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Fees smaller than this are considered zero fee (for transaction creation) "
"(default:"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Flush database activity from memory pool to disk log every <n> megabytes "
"(default: 100)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"How thorough the block verification of -checkblocks is (0-4, default: 3)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"In this mode -genproclimit controls how many blocks are generated "
"immediately."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Listen for JSON-RPC connections on <port> (default: 22555 or testnet: 44555)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Number of seconds to keep misbehaving peers from reconnecting (default: "
@ -71,8 +85,11 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set maximum size of high-priority/low-fee transactions in bytes (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set the number of script verification threads (up to 16, 0 = auto, <0 = "
"leave that many cores free, default: 0)"),
"Set the number of script verification threads (%u to %d, 0 = auto, <0 = "
"leave that many cores free, default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set the processor limit for when generation is on (-1 = unlimited, default: "
"-1)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"This is a pre-release test build - use at your own risk - do not use for "
"mining or merchant applications"),
@ -105,6 +122,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"%s\n"
"If the file does not exist, create it with owner-readable-only file "
"permissions."),
QT_TRANSLATE_NOOP("bitcoin-core", "(default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "(default: wallet.dat)"),
QT_TRANSLATE_NOOP("bitcoin-core", "<category> can be:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"),
QT_TRANSLATE_NOOP("bitcoin-core", "Accept connections from outside (default: 1 if no -proxy or -connect)"),
@ -113,6 +132,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for -addnode, -seednode and
QT_TRANSLATE_NOOP("bitcoin-core", "Allow JSON-RPC connections from specified IP address"),
QT_TRANSLATE_NOOP("bitcoin-core", "Allow peers to set bloom filters (default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet.dat"),
QT_TRANSLATE_NOOP("bitcoin-core", "Dogecoin Core Daemon"),
QT_TRANSLATE_NOOP("bitcoin-core", "Dogecoin Core RPC client version"),
QT_TRANSLATE_NOOP("bitcoin-core", "Block creation options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot downgrade wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -bind address: '%s'"),
@ -123,7 +144,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node(s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect through SOCKS proxy"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect to JSON-RPC on <port> (default: 22555 or testnet: 44555)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect to a node to retrieve peer addresses, and disconnect"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connection options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Corrupted block database detected"),
QT_TRANSLATE_NOOP("bitcoin-core", "Debugging/Testing options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Disable safemode, override a real safe mode event (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Discover own IP address (default: 1 when listening and no -externalip)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do not load the wallet and disable wallet RPC calls"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do you want to rebuild the block database now?"),
@ -153,12 +177,14 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write to coin database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write transaction index"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write undo data"),
QT_TRANSLATE_NOOP("bitcoin-core", "Fee per kB to add to transactions you send"),
QT_TRANSLATE_NOOP("bitcoin-core", "Fees smaller than this are considered zero fee (for relaying) (default:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Find peers using DNS lookup (default: 1 unless -connect)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Force safe mode (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command"),
QT_TRANSLATE_NOOP("bitcoin-core", "How many blocks to check at startup (default: 288, 0 = all)"),
QT_TRANSLATE_NOOP("bitcoin-core", "How thorough the block verification is (0-4, default: 3)"),
QT_TRANSLATE_NOOP("bitcoin-core", "If <category> is not supplied, output all debugging information."),
QT_TRANSLATE_NOOP("bitcoin-core", "Importing..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Imports blocks from external blk000??.dat file"),
QT_TRANSLATE_NOOP("bitcoin-core", "Incorrect or no genesis block found. Wrong datadir for network?"),
QT_TRANSLATE_NOOP("bitcoin-core", "Information"),
@ -169,11 +195,13 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -minrelaytxfee=<amount>: '
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -mintxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount"),
QT_TRANSLATE_NOOP("bitcoin-core", "Limit size of signature cache to <n> entries (default: 50000)"),
QT_TRANSLATE_NOOP("bitcoin-core", "List commands"),
QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on <port> (default: 22556 or testnet: 44556)"),
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", "Log transaction priority and fee per kB when mining blocks (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Maintain a full transaction index (default: 0)"),
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: 5000)"),
@ -184,10 +212,17 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network <net> (IPv4,
QT_TRANSLATE_NOOP("bitcoin-core", "Options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp (default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Print block on startup, if found in block index"),
QT_TRANSLATE_NOOP("bitcoin-core", "Print block tree on startup (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)"),
QT_TRANSLATE_NOOP("bitcoin-core", "RPC client options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "RPC server options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Randomly drop 1 of every <n> network messages"),
QT_TRANSLATE_NOOP("bitcoin-core", "Randomly fuzz 1 of every <n> network messages"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild block chain index from current blk000??.dat files"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Run a thread to flush wallet periodically (default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"),
QT_TRANSLATE_NOOP("bitcoin-core", "SSL options: (see the Bitcoin Wiki for SSL setup instructions)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Select SOCKS version for -proxy (4 or 5, default: 5)"),
@ -201,6 +236,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to <n> (default: 100)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set maximum block size in bytes (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set minimum block size in bytes (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set the number of threads to service RPC calls (default: 4)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Sets the DB_PRIVATE flag in the wallet db environment (default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Show all debugging options (usage: --help -help-debug)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Show benchmark information (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Shrink debug.log file on client startup (default: 1 when no -debug)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Signing transaction failed"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: dogecoin.conf)"),
@ -241,6 +279,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Deprecated argument -debugnet ignore
QT_TRANSLATE_NOOP("bitcoin-core", "Warning: This version is obsolete, upgrade required!"),
QT_TRANSLATE_NOOP("bitcoin-core", "You need to rebuild the database using -reindex to change -txindex"),
QT_TRANSLATE_NOOP("bitcoin-core", "Zapping all transactions from wallet..."),
QT_TRANSLATE_NOOP("bitcoin-core", "on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", "version"),
QT_TRANSLATE_NOOP("bitcoin-core", "wallet.dat corrupt, salvage failed"),
};

View file

@ -46,6 +46,7 @@ int ClientModel::getNumConnections() const
int ClientModel::getNumBlocks() const
{
LOCK(cs_main);
return chainActive.Height();
}
@ -67,6 +68,7 @@ quint64 ClientModel::getTotalBytesSent() const
QDateTime ClientModel::getLastBlockDate() const
{
LOCK(cs_main);
if (chainActive.Tip())
return QDateTime::fromTime_t(chainActive.Tip()->GetBlockTime());
else
@ -75,11 +77,18 @@ QDateTime ClientModel::getLastBlockDate() const
double ClientModel::getVerificationProgress() const
{
LOCK(cs_main);
return Checkpoints::GuessVerificationProgress(chainActive.Tip());
}
void ClientModel::updateTimer()
{
// Get required lock upfront. This avoids the GUI from getting stuck on
// periodical polls if the core is holding the locks for a longer time -
// for example, during a wallet rescan.
TRY_LOCK(cs_main, lockMain);
if(!lockMain)
return;
// Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change.
// Periodically check and update with a timer.
int newNumBlocks = getNumBlocks();

View file

@ -471,6 +471,30 @@
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3_Display">
<item>
<widget class="QLabel" name="thirdPartyTxUrlsLabel">
<property name="toolTip">
<string>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</string>
</property>
<property name="text">
<string>Third party transaction URLs</string>
</property>
<property name="buddy">
<cstring>thirdPartyTxUrls</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="thirdPartyTxUrls">
<property name="toolTip">
<string>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_Display">
<property name="orientation">

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en">
<TS version="2.0" language="en">
<context>
<name>AboutDialog</name>
<message>
@ -41,7 +41,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<message>
<location line="+12"/>
<location line="+2"/>
<source> (%1-bit)</source>
<source>(%1-bit)</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -724,7 +724,7 @@ Address: %4
<translation>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoin.cpp" line="+441"/>
<location filename="../bitcoin.cpp" line="+447"/>
<source>A fatal error occurred. Dogecoin Core can no longer continue safely and will quit.</source>
<translation>A fatal error occurred. Dogecoin Core can no longer continue safely and will quit.</translation>
</message>
@ -732,7 +732,7 @@ Address: %4
<context>
<name>ClientModel</name>
<message>
<location filename="../clientmodel.cpp" line="+128"/>
<location filename="../clientmodel.cpp" line="+137"/>
<source>Network Alert</source>
<translation>Network Alert</translation>
</message>
@ -946,7 +946,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
<location line="+31"/>
<location line="+32"/>
<source>none</source>
<translation type="unfinished"></translation>
</message>
@ -1014,12 +1014,12 @@ Address: %4
</message>
<message>
<location line="+43"/>
<location line="+63"/>
<location line="+61"/>
<source>(no label)</source>
<translation type="unfinished">(no label)</translation>
</message>
<message>
<location line="-9"/>
<location line="-7"/>
<source>change from %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1100,7 @@ Address: %4
<context>
<name>FreespaceChecker</name>
<message>
<location filename="../intro.cpp" line="+65"/>
<location filename="../intro.cpp" line="+68"/>
<source>A new data directory will be created.</source>
<translation>A new data directory will be created.</translation>
</message>
@ -1158,7 +1158,7 @@ Address: %4
<translation type="unfinished">UI options</translation>
</message>
<message>
<location line="+1"/>
<location line="+2"/>
<source>Set language, for example &quot;de_DE&quot; (default: system locale)</source>
<translation type="unfinished">Set language, for example &quot;de_DE&quot; (default: system locale)</translation>
</message>
@ -1167,13 +1167,18 @@ Address: %4
<source>Start minimized</source>
<translation type="unfinished">Start minimized</translation>
</message>
<message>
<location line="+1"/>
<source>Set SSL root certificates for payment request (default: -system-)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Show splash screen on startup (default: 1)</source>
<translation type="unfinished">Show splash screen on startup (default: 1)</translation>
</message>
<message>
<location line="+1"/>
<location line="-4"/>
<source>Choose data directory on startup (default: 0)</source>
<translation type="unfinished">Choose data directory on startup (default: 0)</translation>
</message>
@ -1221,7 +1226,7 @@ Address: %4
<translation type="unfinished">Error: Specified data directory &quot;%1&quot; can not be created.</translation>
</message>
<message>
<location line="+19"/>
<location line="+24"/>
<source>Error</source>
<translation>Error</translation>
</message>
@ -1277,7 +1282,7 @@ Address: %4
<translation>&amp;Main</translation>
</message>
<message>
<location line="+122"/>
<location line="+116"/>
<source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source>
<translation>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</translation>
</message>
@ -1287,7 +1292,7 @@ Address: %4
<translation>Pay transaction &amp;fee</translation>
</message>
<message>
<location line="-131"/>
<location line="-125"/>
<source>Automatically start Dogecoin Core after logging in to the system.</source>
<translation>Automatically start Dogecoin Core after logging in to the system.</translation>
</message>
@ -1312,12 +1317,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>Set the number of script verification threads (up to 16, 0 = auto, &lt;0 = leave that many cores free, default: 0)</source>
<translation type="unfinished">Set the number of script verification threads (up to 16, 0 = auto, &lt;0 = leave that many cores free, default: 0)</translation>
</message>
<message>
<location line="+153"/>
<location line="+160"/>
<source>Connect to the Dogecoin network through a SOCKS proxy.</source>
<translation type="unfinished"></translation>
</message>
@ -1352,7 +1352,12 @@ Address: %4
<translation>&amp;Network</translation>
</message>
<message>
<location line="-95"/>
<location line="-131"/>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+36"/>
<source>W&amp;allet</source>
<translation type="unfinished"></translation>
</message>
@ -1487,7 +1492,7 @@ Address: %4
<translation>&amp;Cancel</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="+70"/>
<location filename="../optionsdialog.cpp" line="+72"/>
<source>default</source>
<translation>default</translation>
</message>
@ -1497,7 +1502,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
<location line="+78"/>
<location line="+80"/>
<source>Confirm options reset</source>
<translation>Confirm options reset</translation>
</message>
@ -1690,23 +1695,34 @@ Address: %4
<context>
<name>QObject</name>
<message>
<location filename="../bitcoin.cpp" line="+63"/>
<location line="+14"/>
<location filename="../bitcoin.cpp" line="+71"/>
<location line="+7"/>
<location line="+13"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
<message>
<location line="-13"/>
<location line="-19"/>
<source>Error: Specified data directory &quot;%1&quot; does not exist.</source>
<translation>Error: Specified data directory &quot;%1&quot; does not exist.</translation>
</message>
<message>
<location line="+13"/>
<location line="+7"/>
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Error: Invalid combination of -regtest and -testnet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../guiutil.cpp" line="+82"/>
<location line="+60"/>
<source>Dogecoin Core did&apos;t yet exit safely...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../guiutil.cpp" line="+89"/>
<source>Enter a Dogecoin address (e.g. DJ7zB7c5BsB9UJLy1rKQtY7c6CQfGiaRLM)</source>
<translation type="unfinished">Enter a Dogecoin address (e.g. DJ7zB7c5BsB9UJLy1rKQtY7c6CQfGiaRLM)</translation>
</message>
@ -2491,7 +2507,7 @@ Address: %4
<context>
<name>ShutdownWindow</name>
<message>
<location filename="../utilitydialog.cpp" line="+48"/>
<location filename="../utilitydialog.cpp" line="+52"/>
<source>Dogecoin Core is shutting down...</source>
<translation type="unfinished"></translation>
</message>
@ -2691,7 +2707,7 @@ Address: %4
<context>
<name>SplashScreen</name>
<message>
<location filename="../splashscreen.cpp" line="+28"/>
<location filename="../splashscreen.cpp" line="+32"/>
<source>Dogecoin Core</source>
<translation type="unfinished">Dogecoin Core</translation>
</message>
@ -2717,7 +2733,7 @@ Address: %4
<context>
<name>TransactionDesc</name>
<message>
<location filename="../transactiondesc.cpp" line="+28"/>
<location filename="../transactiondesc.cpp" line="+29"/>
<source>Open until %1</source>
<translation>Open until %1</translation>
</message>
@ -2742,7 +2758,7 @@ Address: %4
<translation>%1 confirmations</translation>
</message>
<message>
<location line="+18"/>
<location line="+17"/>
<source>Status</source>
<translation>Status</translation>
</message>
@ -2875,7 +2891,7 @@ Address: %4
<translation>Inputs</translation>
</message>
<message>
<location line="+23"/>
<location line="+21"/>
<source>Amount</source>
<translation>Amount</translation>
</message>
@ -2890,12 +2906,12 @@ Address: %4
<translation>false</translation>
</message>
<message>
<location line="-232"/>
<location line="-230"/>
<source>, has not been successfully broadcast yet</source>
<translation>, has not been successfully broadcast yet</translation>
</message>
<message numerus="yes">
<location line="-37"/>
<location line="-36"/>
<source>Open for %n more block(s)</source>
<translation>
<numerusform>Open for %n more block</numerusform>
@ -2903,7 +2919,7 @@ Address: %4
</translation>
</message>
<message>
<location line="+72"/>
<location line="+71"/>
<source>unknown</source>
<translation>unknown</translation>
</message>
@ -2924,7 +2940,7 @@ Address: %4
<context>
<name>TransactionTableModel</name>
<message>
<location filename="../transactiontablemodel.cpp" line="+234"/>
<location filename="../transactiontablemodel.cpp" line="+238"/>
<source>Date</source>
<translation>Date</translation>
</message>
@ -2944,7 +2960,7 @@ Address: %4
<translation>Amount</translation>
</message>
<message>
<location line="+78"/>
<location line="+70"/>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation type="unfinished"></translation>
</message>
@ -3242,7 +3258,7 @@ Address: %4
<context>
<name>WalletModel</name>
<message>
<location filename="../walletmodel.cpp" line="+245"/>
<location filename="../walletmodel.cpp" line="+258"/>
<source>Send Coins</source>
<translation>Send Coins</translation>
</message>
@ -3250,7 +3266,7 @@ Address: %4
<context>
<name>WalletView</name>
<message>
<location filename="../walletview.cpp" line="+43"/>
<location filename="../walletview.cpp" line="+44"/>
<source>&amp;Export</source>
<translation>&amp;Export</translation>
</message>
@ -3260,7 +3276,7 @@ Address: %4
<translation>Export the data in the current tab to a file</translation>
</message>
<message>
<location line="+181"/>
<location line="+184"/>
<source>Backup Wallet</source>
<translation>Backup Wallet</translation>
</message>
@ -3293,27 +3309,27 @@ Address: %4
<context>
<name>dogecoin-core</name>
<message>
<location filename="../bitcoinstrings.cpp" line="+226"/>
<location filename="../bitcoinstrings.cpp" line="+262"/>
<source>Usage:</source>
<translation>Usage:</translation>
</message>
<message>
<location line="-55"/>
<location line="-66"/>
<source>List commands</source>
<translation>List commands</translation>
</message>
<message>
<location line="-14"/>
<location line="-15"/>
<source>Get help for a command</source>
<translation>Get help for a command</translation>
</message>
<message>
<location line="+26"/>
<location line="+28"/>
<source>Options:</source>
<translation>Options:</translation>
</message>
<message>
<location line="+22"/>
<location line="+32"/>
<source>Specify configuration file (default: dogecoin.conf)</source>
<translation>Specify configuration file (default: dogecoin.conf)</translation>
</message>
@ -3328,22 +3344,22 @@ Address: %4
<translation>Specify data directory</translation>
</message>
<message>
<location line="-35"/>
<location line="-46"/>
<source>Listen for connections on &lt;port&gt; (default: 22556 or testnet: 44556)</source>
<translation>Listen for connections on &lt;port&gt; (default: 22556 or testnet: 44556)</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Maintain at most &lt;n&gt; connections to peers (default: 125)</source>
<translation>Maintain at most &lt;n&gt; connections to peers (default: 125)</translation>
</message>
<message>
<location line="-51"/>
<location line="-58"/>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
<translation>Connect to a node to retrieve peer addresses, and disconnect</translation>
</message>
<message>
<location line="+84"/>
<location line="+101"/>
<source>Specify your own public address</source>
<translation>Specify your own public address</translation>
</message>
@ -3353,42 +3369,47 @@ Address: %4
<translation>Threshold for disconnecting misbehaving peers (default: 100)</translation>
</message>
<message>
<location line="-151"/>
<location line="-173"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source>
<translation>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</translation>
</message>
<message>
<location line="-38"/>
<location line="-52"/>
<source>An error occurred while setting up the RPC port %u for listening on IPv4: %s</source>
<translation>An error occurred while setting up the RPC port %u for listening on IPv4: %s</translation>
</message>
<message>
<location line="+36"/>
<location line="+50"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: 22555 or testnet: 44555)</source>
<translation>Listen for JSON-RPC connections on &lt;port&gt; (default: 22555 or testnet: 44555)</translation>
</message>
<message>
<location line="+46"/>
<location line="+51"/>
<source>Accept command line and JSON-RPC commands</source>
<translation>Accept command line and JSON-RPC commands</translation>
</message>
<message>
<location line="+81"/>
<location line="+7"/>
<source>Dogecoin Core RPC client version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+88"/>
<source>Run in the background as a daemon and accept commands</source>
<translation>Run in the background as a daemon and accept commands</translation>
</message>
<message>
<location line="+40"/>
<location line="+43"/>
<source>Use the test network</source>
<translation>Use the test network</translation>
</message>
<message>
<location line="-120"/>
<location line="-137"/>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation>
</message>
<message>
<location line="-98"/>
<location line="-117"/>
<source>%s, you must set a rpcpassword in the configuration file:
%s
It is recommended you use the following random password:
@ -3429,6 +3450,11 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
</message>
<message>
<location line="+6"/>
<source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:15)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
<translation>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</translation>
</message>
@ -3458,13 +3484,43 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</translation>
</message>
<message>
<location line="+18"/>
<location line="+6"/>
<source>Fees smaller than this are considered zero fee (for transaction creation) (default:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: 100)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</translation>
</message>
<message>
<location line="+3"/>
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -3504,6 +3560,16 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
</message>
<message>
<location line="+9"/>
<source>(default: 1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>(default: wallet.dat)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>&lt;category&gt; can be:</source>
<translation type="unfinished"></translation>
</message>
@ -3518,12 +3584,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Dogecoin RPC client version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<location line="+2"/>
<source>Block creation options:</source>
<translation>Block creation options:</translation>
</message>
@ -3549,9 +3610,24 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
</message>
<message>
<location line="+2"/>
<source>Connection options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Corrupted block database detected</source>
<translation>Corrupted block database detected</translation>
</message>
<message>
<location line="+1"/>
<source>Debugging/Testing options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Disable safemode, override a real safe mode event (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Discover own IP address (default: 1 when listening and no -externalip)</source>
@ -3662,11 +3738,21 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<source>Fee per kB to add to transactions you send</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Fees smaller than this are considered zero fee (for relaying) (default:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Find peers using DNS lookup (default: 1 unless -connect)</source>
<translation>Find peers using DNS lookup (default: 1 unless -connect)</translation>
</message>
<message>
<location line="+1"/>
<source>Force safe mode (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Generate coins (default: 0)</source>
@ -3679,12 +3765,12 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
</message>
<message>
<location line="+1"/>
<source>How thorough the block verification is (0-4, default: 3)</source>
<translation>How thorough the block verification is (0-4, default: 3)</translation>
<source>If &lt;category&gt; is not supplied, output all debugging information.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>If &lt;category&gt; is not supplied, output all debugging information.</source>
<source>Importing...</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -3698,7 +3784,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+17"/>
<source>Not enough file descriptors available.</source>
<translation>Not enough file descriptors available.</translation>
</message>
@ -3708,27 +3794,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<location line="+4"/>
<source>RPC client options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<location line="+4"/>
<source>Rebuild block chain index from current blk000??.dat files</source>
<translation>Rebuild block chain index from current blk000??.dat files</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Select SOCKS version for -proxy (4 or 5, default: 5)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Send command to Dogecoin server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation type="unfinished"></translation>
</message>
@ -3743,7 +3824,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Set the number of threads to service RPC calls (default: 4)</translation>
</message>
<message>
<location line="+7"/>
<location line="+10"/>
<source>Specify wallet file (within data directory)</source>
<translation>Specify wallet file (within data directory)</translation>
</message>
@ -3753,12 +3834,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Start Dogecoin server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>This is intended for regression testing tools and app development.</source>
<translation type="unfinished"></translation>
</message>
@ -3803,22 +3879,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>You need to rebuild the database using -reindex to change -txindex</translation>
</message>
<message>
<location line="-80"/>
<location line="-92"/>
<source>Imports blocks from external blk000??.dat file</source>
<translation>Imports blocks from external blk000??.dat file</translation>
</message>
<message>
<location line="-126"/>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<location line="-150"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+22"/>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</translation>
</message>
<message>
<location line="+14"/>
<location line="+25"/>
<source>Output debugging information (default: 0, supplying &lt;category&gt; is optional)</source>
<translation type="unfinished"></translation>
</message>
@ -3828,12 +3904,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Set the number of script verification threads (up to 16, 0 = auto, &lt;0 = leave that many cores free, default: 0)</source>
<translation>Set the number of script verification threads (up to 16, 0 = auto, &lt;0 = leave that many cores free, default: 0)</translation>
</message>
<message>
<location line="+91"/>
<location line="+103"/>
<source>Information</source>
<translation>Information</translation>
</message>
@ -3848,7 +3919,17 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Invalid amount for -mintxfee=&lt;amount&gt;: &apos;%s&apos;</translation>
</message>
<message>
<location line="+8"/>
<location line="+3"/>
<source>Limit size of signature cache to &lt;n&gt; entries (default: 50000)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Log transaction priority and fee per kB when mining blocks (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Maintain a full transaction index (default: 0)</source>
<translation>Maintain a full transaction index (default: 0)</translation>
</message>
@ -3873,12 +3954,52 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Only connect to nodes in network &lt;net&gt; (IPv4, IPv6 or Tor)</translation>
</message>
<message>
<location line="+9"/>
<location line="+4"/>
<source>Print block on startup, if found in block index</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Print block tree on startup (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>RPC server options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Randomly fuzz 1 of every &lt;n&gt; network messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Run a thread to flush wallet periodically (default: 1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>SSL options: (see the Bitcoin Wiki for SSL setup instructions)</translation>
</message>
<message>
<location line="+4"/>
<location line="+2"/>
<source>Send command to Dogecoin Core</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Send trace/debug info to console instead of debug.log file</translation>
</message>
@ -3889,6 +4010,21 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
</message>
<message>
<location line="+2"/>
<source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Show benchmark information (default: 0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Shrink debug.log file on client startup (default: 1 when no -debug)</translation>
</message>
@ -3903,7 +4039,12 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Specify connection timeout in milliseconds (default: 5000)</translation>
</message>
<message>
<location line="+7"/>
<location line="+6"/>
<source>Start Dogecoin Core Daemon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>System error: </source>
<translation>System error: </translation>
</message>
@ -3952,6 +4093,11 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<source>Zapping all transactions from wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>on startup</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>version</source>
@ -3963,47 +4109,47 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>wallet.dat corrupt, salvage failed</translation>
</message>
<message>
<location line="-60"/>
<location line="-71"/>
<source>Password for JSON-RPC connections</source>
<translation>Password for JSON-RPC connections</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>Allow JSON-RPC connections from specified IP address</source>
<translation>Allow JSON-RPC connections from specified IP address</translation>
</message>
<message>
<location line="+81"/>
<location line="+95"/>
<source>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)</source>
<translation>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)</translation>
</message>
<message>
<location line="-134"/>
<location line="-164"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation>
</message>
<message>
<location line="+164"/>
<location line="+197"/>
<source>Upgrade wallet to latest format</source>
<translation>Upgrade wallet to latest format</translation>
</message>
<message>
<location line="-25"/>
<location line="-28"/>
<source>Set key pool size to &lt;n&gt; (default: 100)</source>
<translation>Set key pool size to &lt;n&gt; (default: 100)</translation>
</message>
<message>
<location line="-11"/>
<location line="-12"/>
<source>Rescan the block chain for missing wallet transactions</source>
<translation>Rescan the block chain for missing wallet transactions</translation>
</message>
<message>
<location line="+39"/>
<location line="+43"/>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
<translation>Use OpenSSL (https) for JSON-RPC connections</translation>
</message>
<message>
<location line="-31"/>
<location line="-34"/>
<source>Server certificate file (default: server.cert)</source>
<translation>Server certificate file (default: server.cert)</translation>
</message>
@ -4013,7 +4159,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Server private key (default: server.pem)</translation>
</message>
<message>
<location line="+17"/>
<location line="+20"/>
<source>This help message</source>
<translation>This help message</translation>
</message>
@ -4023,17 +4169,17 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Unable to bind to %s on this computer (bind returned error %d, %s)</translation>
</message>
<message>
<location line="-109"/>
<location line="-126"/>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Allow DNS lookups for -addnode, -seednode and -connect</translation>
</message>
<message>
<location line="+61"/>
<location line="+67"/>
<source>Loading addresses...</source>
<translation>Loading addresses...</translation>
</message>
<message>
<location line="-37"/>
<location line="-40"/>
<source>Error loading wallet.dat: Wallet corrupted</source>
<translation>Error loading wallet.dat: Wallet corrupted</translation>
</message>
@ -4043,22 +4189,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Error loading wallet.dat: Wallet requires newer version of Dogecoin Core</translation>
</message>
<message>
<location line="+99"/>
<location line="+113"/>
<source>Wallet needed to be rewritten: restart Dogecoin Core to complete</source>
<translation>Wallet needed to be rewritten: restart Dogecoin Core to complete</translation>
</message>
<message>
<location line="-101"/>
<location line="-115"/>
<source>Error loading wallet.dat</source>
<translation>Error loading wallet.dat</translation>
</message>
<message>
<location line="+31"/>
<location line="+33"/>
<source>Invalid -proxy address: &apos;%s&apos;</source>
<translation>Invalid -proxy address: &apos;%s&apos;</translation>
</message>
<message>
<location line="+57"/>
<location line="+69"/>
<source>Unknown network specified in -onlynet: &apos;%s&apos;</source>
<translation>Unknown network specified in -onlynet: &apos;%s&apos;</translation>
</message>
@ -4068,7 +4214,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Unknown -socks proxy version requested: %i</translation>
</message>
<message>
<location line="-103"/>
<location line="-120"/>
<source>Cannot resolve -bind address: &apos;%s&apos;</source>
<translation>Cannot resolve -bind address: &apos;%s&apos;</translation>
</message>
@ -4078,7 +4224,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Cannot resolve -externalip address: &apos;%s&apos;</translation>
</message>
<message>
<location line="+49"/>
<location line="+54"/>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos;</source>
<translation>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos;</translation>
</message>
@ -4093,22 +4239,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Insufficient funds</translation>
</message>
<message>
<location line="+10"/>
<location line="+11"/>
<source>Loading block index...</source>
<translation>Loading block index...</translation>
</message>
<message>
<location line="-63"/>
<location line="-69"/>
<source>Add a node to connect to and attempt to keep the connection open</source>
<translation>Add a node to connect to and attempt to keep the connection open</translation>
</message>
<message>
<location line="+64"/>
<location line="+70"/>
<source>Loading wallet...</source>
<translation>Loading wallet...</translation>
</message>
<message>
<location line="-57"/>
<location line="-63"/>
<source>Cannot downgrade wallet</source>
<translation>Cannot downgrade wallet</translation>
</message>
@ -4118,27 +4264,27 @@ for example: alertnotify=echo %%s | mail -s &quot;Dogecoin Alert&quot; admin@foo
<translation>Cannot write default address</translation>
</message>
<message>
<location line="+68"/>
<location line="+81"/>
<source>Rescanning...</source>
<translation>Rescanning...</translation>
</message>
<message>
<location line="-58"/>
<location line="-68"/>
<source>Done loading</source>
<translation>Done loading</translation>
</message>
<message>
<location line="+86"/>
<location line="+100"/>
<source>To use the %s option</source>
<translation>To use the %s option</translation>
</message>
<message>
<location line="-78"/>
<location line="-92"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location line="-36"/>
<location line="-41"/>
<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>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="he" version="2.0">
<?xml version="1.0" ?><!DOCTYPE TS><TS language="he" version="2.1">
<context>
<name>AboutDialog</name>
<message>
<location filename="../forms/aboutdialog.ui" line="+14"/>
<source>About Dogecoin Core</source>
<translation type="unfinished"/>
<translation>על אודות ליבת ביטקוין</translation>
</message>
<message>
<location line="+39"/>
@ -71,7 +71,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation type="unfinished"/>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>C&amp;lose</source>
<translation type="unfinished"/>
</message>
@ -81,7 +81,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>העתק כתובת</translation>
</message>
<message>
<location filename="../forms/addressbookpage.ui" line="-41"/>
<location filename="../forms/addressbookpage.ui" line="-47"/>
<source>Delete the currently selected address from the list</source>
<translation>מחק את הכתובת שנבחרה מהרשימה</translation>
</message>
@ -328,7 +328,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<context>
<name>BitcoinGUI</name>
<message>
<location filename="../bitcoingui.cpp" line="+295"/>
<location filename="../bitcoingui.cpp" line="+294"/>
<source>Sign &amp;message...</source>
<translation>חתום על הודעה</translation>
</message>
@ -343,12 +343,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>&amp;סקירה</translation>
</message>
<message>
<location line="-137"/>
<location line="-136"/>
<source>Node</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+138"/>
<location line="+137"/>
<source>Show general overview of wallet</source>
<translation>הצג סקירה כללית של הארנק</translation>
</message>
@ -469,17 +469,17 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>אמת הודעה...</translation>
</message>
<message>
<location line="+430"/>
<location line="+440"/>
<source>Dogecoin</source>
<translation>ביטקוין</translation>
</message>
<message>
<location line="-643"/>
<location line="-652"/>
<source>Wallet</source>
<translation>ארנק</translation>
</message>
<message>
<location line="+146"/>
<location line="+145"/>
<source>&amp;Send</source>
<translation>&amp;שלח</translation>
</message>
@ -535,20 +535,20 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>סרגל כלים טאבים</translation>
</message>
<message>
<location line="-284"/>
<location line="+376"/>
<location line="-283"/>
<location line="+375"/>
<source>[testnet]</source>
<translation>[רשת-בדיקה]</translation>
</message>
<message>
<location line="-401"/>
<location line="-400"/>
<source>Dogecoin Core</source>
<translation>ליבת ביטקוין</translation>
</message>
<message>
<location line="+163"/>
<location line="+162"/>
<source>Request payments (generates QR codes and dogecoin: URIs)</source>
<translation type="unfinished"/>
<translation>בקש תשלומים (מייצר קודיי QR וסכימות URI של :dogecoin)</translation>
</message>
<message>
<location line="+29"/>
@ -608,7 +608,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>הושלם עיבוד של %1 בלוקים של היסטוריית פעולות.</translation>
</message>
<message numerus="yes">
<location line="+23"/>
<location line="+27"/>
<source>%n hour(s)</source>
<translation><numerusform>%n שעה</numerusform><numerusform>%n שעות</numerusform></translation>
</message>
@ -619,6 +619,7 @@ This product includes software developed by the OpenSSL Project for use in the O
</message>
<message numerus="yes">
<location line="+4"/>
<location line="+6"/>
<source>%n week(s)</source>
<translation><numerusform>%n שבוע</numerusform><numerusform>%n שבועות</numerusform></translation>
</message>
@ -663,12 +664,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>מידע</translation>
</message>
<message>
<location line="-85"/>
<location line="-95"/>
<source>Up to date</source>
<translation>עדכני</translation>
</message>
<message>
<location line="+34"/>
<location line="+44"/>
<source>Catching up...</source>
<translation>מתעדכן...</translation>
</message>
@ -705,7 +706,7 @@ Address: %4
<translation>הארנק &lt;b&gt;מוצפן&lt;/b&gt; וכרגע &lt;b&gt;נעול&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoin.cpp" line="+435"/>
<location filename="../bitcoin.cpp" line="+441"/>
<source>A fatal error occurred. Dogecoin Core can no longer continue safely and will quit.</source>
<translation>שגיאה סופנית אירעה. ביטקוין אינו יכול להמשיך לפעול בבטחה ולכן ייסגר.</translation>
</message>
@ -713,7 +714,7 @@ Address: %4
<context>
<name>ClientModel</name>
<message>
<location filename="../clientmodel.cpp" line="+119"/>
<location filename="../clientmodel.cpp" line="+128"/>
<source>Network Alert</source>
<translation>אזעקת רשת</translation>
</message>
@ -811,7 +812,7 @@ Address: %4
<translation>קדימות</translation>
</message>
<message>
<location filename="../coincontroldialog.cpp" line="+42"/>
<location filename="../coincontroldialog.cpp" line="+41"/>
<source>Copy address</source>
<translation>העתק כתובת</translation>
</message>
@ -877,7 +878,7 @@ Address: %4
<translation type="unfinished"/>
</message>
<message>
<location line="+323"/>
<location line="+332"/>
<source>highest</source>
<translation>הכי גבוה</translation>
</message>
@ -995,7 +996,7 @@ Address: %4
</message>
<message>
<location line="+43"/>
<location line="+66"/>
<location line="+63"/>
<source>(no label)</source>
<translation>(ללא תוית)</translation>
</message>
@ -1083,7 +1084,7 @@ Address: %4
<message>
<location filename="../intro.cpp" line="+65"/>
<source>A new data directory will be created.</source>
<translation type="unfinished"/>
<translation>ספריית מידע חדשה תיווצר.</translation>
</message>
<message>
<location line="+22"/>
@ -1093,17 +1094,17 @@ Address: %4
<message>
<location line="+2"/>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished"/>
<translation>הספריה כבר קיימת. הוסף %1 אם ברצונך ליצור ספריה חדשה כאן.</translation>
</message>
<message>
<location line="+3"/>
<source>Path already exists, and is not a directory.</source>
<translation type="unfinished"/>
<translation>הנתיב כבר קיים ואינו מצביע על ספרייה.</translation>
</message>
<message>
<location line="+7"/>
<source>Cannot create data directory here.</source>
<translation type="unfinished"/>
<translation>לא ניתן ליצור ספריית מידע כאן.</translation>
</message>
</context>
<context>
@ -1184,15 +1185,15 @@ Address: %4
<message>
<location line="+10"/>
<source>Use the default data directory</source>
<translation type="unfinished"/>
<translation>השתמש בברירת המחדל עבור ספריית המידע.</translation>
</message>
<message>
<location line="+7"/>
<source>Use a custom data directory:</source>
<translation type="unfinished"/>
<translation>השתמש בספריית מידע מותאמת אישית:</translation>
</message>
<message>
<location filename="../intro.cpp" line="+85"/>
<location filename="../intro.cpp" line="+82"/>
<source>Dogecoin</source>
<translation>ביטקוין</translation>
</message>
@ -1209,12 +1210,12 @@ Address: %4
<message>
<location line="+9"/>
<source>GB of free space available</source>
<translation type="unfinished"/>
<translation>ג&quot;ב של שטח אחסון פנוי</translation>
</message>
<message>
<location line="+3"/>
<source>(of %1GB needed)</source>
<translation type="unfinished"/>
<translation>(מתוך %1 ג&quot;ב נחוצים)</translation>
</message>
</context>
<context>
@ -1260,7 +1261,7 @@ Address: %4
<message>
<location line="+122"/>
<source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source>
<translation>עמלת פעולה אופציונלית לכל kB תבטיח שהפעולה שלך תעובד בזריזות. רוב הפעולות הן 1 kB. מומלצת עמלה בסך 0.01.</translation>
<translation>עמלת פעולה אופציונלית לכל kB תבטיח שהפעולה שלך תעובד בזריזות. רוב הפעולות הן 1 kB.</translation>
</message>
<message>
<location line="+15"/>
@ -1298,12 +1299,7 @@ Address: %4
<translation>קבע את מספר תהליכוני אימות הסקריפטים (1-16, 0 = אוטומטי, ברירת מחדל: 0)</translation>
</message>
<message>
<location line="+107"/>
<source>&amp;Spend unconfirmed change (experts only)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+37"/>
<location line="+153"/>
<source>Connect to the Dogecoin network through a SOCKS proxy.</source>
<translation type="unfinished"/>
</message>
@ -1318,7 +1314,7 @@ Address: %4
<translation type="unfinished"/>
</message>
<message>
<location line="+224"/>
<location line="+214"/>
<source>Active command-line options that override above options:</source>
<translation type="unfinished"/>
</message>
@ -1333,22 +1329,37 @@ Address: %4
<translation>איפוס אפשרויות</translation>
</message>
<message>
<location line="-323"/>
<location line="-313"/>
<source>&amp;Network</source>
<translation>רשת</translation>
</message>
<message>
<location line="-86"/>
<location line="-95"/>
<source>W&amp;allet</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+52"/>
<location line="+65"/>
<source>Expert</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+9"/>
<source>Enable coin &amp;control features</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+7"/>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+40"/>
<location line="+3"/>
<source>&amp;Spend unconfirmed change</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+17"/>
<source>Automatically open the Dogecoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>פתח את פורט ביטקוין בנתב באופן אוטומטי. עובד רק אם UPnP מאופשר ונתמך ע&quot;י הנתב.</translation>
</message>
@ -1443,17 +1454,12 @@ Address: %4
<translation>הצג כתובות ברשימת הפעולות</translation>
</message>
<message>
<location line="+7"/>
<location line="-262"/>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+3"/>
<source>Display coin &amp;control features (experts only)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+136"/>
<location line="+398"/>
<source>&amp;OK</source>
<translation>אישור</translation>
</message>
@ -1585,7 +1591,7 @@ Address: %4
<message>
<location line="+96"/>
<source>Requested payment amount of %1 is too small (considered dust).</source>
<translation type="unfinished"/>
<translation>הסכום הנדרש לתשלום %1 קטן מדי (נחשב לאבק)</translation>
</message>
<message>
<location line="-221"/>
@ -1630,7 +1636,7 @@ Address: %4
<message>
<location line="+73"/>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation type="unfinished"/>
<translation>בקשות לתשלום לסקריפטיי תשלום מותאמים אישית אינן נתמכות.</translation>
</message>
<message>
<location line="+59"/>
@ -1640,7 +1646,7 @@ Address: %4
<message>
<location line="+43"/>
<source>Error communicating with %1: %2</source>
<translation type="unfinished"/>
<translation>שגיאה בתקשורת עם %1: %2</translation>
</message>
<message>
<location line="+24"/>
@ -1650,7 +1656,7 @@ Address: %4
<message>
<location line="+11"/>
<source>Bad response from server %1</source>
<translation type="unfinished"/>
<translation>מענה שגוי משרת %1</translation>
</message>
<message>
<location line="+33"/>
@ -1666,20 +1672,20 @@ Address: %4
<context>
<name>QObject</name>
<message>
<location filename="../bitcoin.cpp" line="+71"/>
<location line="+11"/>
<location filename="../bitcoin.cpp" line="+63"/>
<location line="+14"/>
<source>Dogecoin</source>
<translation>ביטקוין</translation>
</message>
<message>
<location line="+1"/>
<location line="-13"/>
<source>Error: Specified data directory &quot;%1&quot; does not exist.</source>
<translation type="unfinished"/>
<translation>שגיאה: הספריה &quot;%1&quot; לא קיימת.</translation>
</message>
<message>
<location line="-12"/>
<location line="+13"/>
<source>Error: Invalid combination of -regtest and -testnet.</source>
<translation type="unfinished"/>
<translation>שגיאה: שילוב בלתי חוקי של regtest- ו testnet-.</translation>
</message>
<message>
<location filename="../guiutil.cpp" line="+82"/>
@ -1728,7 +1734,7 @@ Address: %4
<location line="+36"/>
<location line="+23"/>
<location line="+23"/>
<location filename="../rpcconsole.cpp" line="+359"/>
<location filename="../rpcconsole.cpp" line="+373"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
@ -1824,11 +1830,13 @@ Address: %4
</message>
<message>
<location line="+64"/>
<location filename="../rpcconsole.cpp" line="-10"/>
<source>In:</source>
<translation>נכנס:</translation>
</message>
<message>
<location line="+80"/>
<location filename="../rpcconsole.cpp" line="+1"/>
<source>Out:</source>
<translation>יוצא:</translation>
</message>
@ -1853,7 +1861,7 @@ Address: %4
<translation>נקה לוח בקרה</translation>
</message>
<message>
<location filename="../rpcconsole.cpp" line="-30"/>
<location filename="../rpcconsole.cpp" line="-35"/>
<source>Welcome to the Dogecoin Core RPC console.</source>
<translation>ברוכים הבאים ללוח בקרת RPC של ביטקוין</translation>
</message>
@ -1868,7 +1876,7 @@ Address: %4
<translation>הקלד &lt;b&gt;help&lt;/b&gt; בשביל סקירה של הפקודות הזמינות.</translation>
</message>
<message>
<location line="+122"/>
<location line="+136"/>
<source>%1 B</source>
<translation>%1 בייט</translation>
</message>
@ -1923,7 +1931,7 @@ Address: %4
<message>
<location line="-20"/>
<source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source>
<translation type="unfinished"/>
<translation>השתמש שוב באחת מכתובות הקבלה שכבר נעשה בהן שימוש. לשימוש חוזר בכתובות ישהן השלכות אבטחה ופרטיות. השתמש בזה רק אם אתה מייצר מחדש בקשת תשלום שכבר נעשתה.</translation>
</message>
<message>
<location line="+3"/>
@ -1984,7 +1992,7 @@ Address: %4
<translation>הצג</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>Remove the selected entries from the list</source>
<translation type="unfinished"/>
</message>
@ -1994,7 +2002,7 @@ Address: %4
<translation>הסר</translation>
</message>
<message>
<location filename="../receivecoinsdialog.cpp" line="+38"/>
<location filename="../receivecoinsdialog.cpp" line="+39"/>
<source>Copy label</source>
<translation>העתק תוית</translation>
</message>
@ -2044,7 +2052,7 @@ Address: %4
<message>
<location line="+1"/>
<source>URI</source>
<translation type="unfinished"/>
<translation>כתובת (אתר או משאב)</translation>
</message>
<message>
<location line="+2"/>
@ -2215,12 +2223,12 @@ Address: %4
<translation>נקה הכל</translation>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>Balance:</source>
<translation>יתרה:</translation>
</message>
<message>
<location line="-78"/>
<location line="-84"/>
<source>Confirm the send action</source>
<translation>אשר את פעולת השליחה</translation>
</message>
@ -2240,7 +2248,7 @@ Address: %4
<location line="+5"/>
<location line="+4"/>
<source>%1 to %2</source>
<translation type="unfinished"/>
<translation>%1 אל %2</translation>
</message>
<message>
<location line="-121"/>
@ -2360,7 +2368,7 @@ Address: %4
<message>
<location line="+8"/>
<source>Invalid payment address %1</source>
<translation type="unfinished"/>
<translation>כתובת תשלום שגויה %1</translation>
</message>
</context>
<context>
@ -2437,7 +2445,7 @@ Address: %4
<message>
<location line="-991"/>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation type="unfinished"/>
<translation>הקלד תווית עבור כתובת זו בכדי להוסיף אותה לרשימת הכתובות בשימוש</translation>
</message>
<message>
<location line="+33"/>
@ -2820,12 +2828,12 @@ Address: %4
<message>
<location line="+18"/>
<source>Merchant</source>
<translation type="unfinished"/>
<translation>סוחר</translation>
</message>
<message>
<location line="+7"/>
<source>Generated coins must mature %1 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>מטבעות חדשים שנוצרו חייבים להבשיל במשך %1 בלוקים לפני שניתן לנצל אותם. כשבלוק זה נוצר הוא שודר ברשת על מנת שייכנס לשרשרת הבלוקים. במקרה והוא לא ייכנס לשרשרת, מצבו ישתנה ל&quot;לא התקבל&quot; ולא ניתן יהיה לנצלו. זה יכול לקרות מדי פעם אם במקרה צומת אחרת ייצרה בלוק בהבדל של שניות בודדות ממך.</translation>
</message>
<message>
<location line="+8"/>
@ -3118,7 +3126,7 @@ Address: %4
<translation>הצג פרטי פעולה</translation>
</message>
<message>
<location line="+142"/>
<location line="+140"/>
<source>Export Transaction History</source>
<translation>יצוא היסטוריית פעולות</translation>
</message>
@ -3255,7 +3263,7 @@ Address: %4
<context>
<name>dogecoin-core</name>
<message>
<location filename="../bitcoinstrings.cpp" line="+223"/>
<location filename="../bitcoinstrings.cpp" line="+226"/>
<source>Usage:</source>
<translation>שימוש:</translation>
</message>
@ -3290,12 +3298,7 @@ Address: %4
<translation>ציין תיקיית נתונים</translation>
</message>
<message>
<location line="-9"/>
<source>Set database cache size in megabytes (default: 25)</source>
<translation>קבע את גודל המטמון של מסד הנתונים במגהבייט (ברירת מחדל: 25)</translation>
</message>
<message>
<location line="-26"/>
<location line="-35"/>
<source>Listen for connections on &lt;port&gt; (default: 22556 or testnet: 44556)</source>
<translation>האזן לחיבורים ב&lt;פורט&gt; (ברירת מחדל: 22556 או ברשת הבדיקה: 44556)</translation>
</message>
@ -3320,22 +3323,22 @@ Address: %4
<translation>סף להתנתקות מעמיתים הנוהגים שלא כהלכה (ברירת מחדל: 100)</translation>
</message>
<message>
<location line="-150"/>
<location line="-151"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source>
<translation>מספר שניות למנוע מעמיתים הנוהגים שלא כהלכה מלהתחבר מחדש (ברירת מחדל: 86400)</translation>
</message>
<message>
<location line="-36"/>
<location line="-38"/>
<source>An error occurred while setting up the RPC port %u for listening on IPv4: %s</source>
<translation>אירעה שגיאה בעת הגדרת פורט RPC %u להאזנה ב-IPv4: %s</translation>
</message>
<message>
<location line="+34"/>
<location line="+36"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: 22555 or testnet: 44555)</source>
<translation>האזן לחיבורי JSON-RPC ב- &lt;port&gt; (ברירת מחדל: 22555 או רשת בדיקה: 44555)</translation>
</message>
<message>
<location line="+45"/>
<location line="+46"/>
<source>Accept command line and JSON-RPC commands</source>
<translation>קבל פקודות משורת הפקודה ו- JSON-RPC</translation>
</message>
@ -3355,7 +3358,7 @@ Address: %4
<translation>קבל חיבורים מבחוץ (ברירת מחדל: 1 ללא -proxy או -connect)</translation>
</message>
<message>
<location line="-95"/>
<location line="-98"/>
<source>%s, you must set a rpcpassword in the configuration file:
%s
It is recommended you use the following random password:
@ -3382,7 +3385,7 @@ rpcpassword=%s
<message>
<location line="+12"/>
<source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source>
<translation type="unfinished"/>
<translation>צפנים קבילים (ברירת מחדל: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation>
</message>
<message>
<location line="+5"/>
@ -3395,14 +3398,9 @@ rpcpassword=%s
<translation>קשור עם כתובת נתונה והאזן לה תמיד. השתמש בסימון [host]:port עבוד IPv6.</translation>
</message>
<message>
<location line="+3"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation>לא מסוגל להשיג נעילה על תיקיית הנתונים %s. כנראה שביטקוין כבר רץ.</translation>
</message>
<message>
<location line="+3"/>
<location line="+6"/>
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
<translation type="unfinished"/>
<translation>כניסה למצב בדיקת רגרסיה, בה נעשה שימוש בשרשרת מיוחדת המאפשרת פתרון מיידי של בלוקים. מצב זה מיועד לכלי בדיקת רגרסיה ופיתוח תוכנה.</translation>
</message>
<message>
<location line="+4"/>
@ -3411,6 +3409,11 @@ rpcpassword=%s
</message>
<message>
<location line="+3"/>
<source>Error: Listening for incoming connections failed (listen returned error %d)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+2"/>
<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>שגיאה: הפעולה נדחתה! זה עלול לקרות אם כמה מהמטבעות בארנק שלך כבר נוצלו, למשל אם השתמשת בעותק של wallet.dat ומטבעות נשלחו בעותק אך לא סומנו כמנוצלות כאן.</translation>
</message>
@ -3430,7 +3433,12 @@ rpcpassword=%s
<translation>זוהי בניית ניסיון טרום-שחרור - השימוש בה על אחריותך - אין להשתמש לצורך כריה או יישומי מסחר</translation>
</message>
<message>
<location line="+5"/>
<location line="+3"/>
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+3"/>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source>
<translation type="unfinished"/>
</message>
@ -3447,12 +3455,12 @@ rpcpassword=%s
<message>
<location line="+3"/>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation type="unfinished"/>
<translation>אזהרה: נראה שלא כל הרשת מסכימה! נראה שישנם כורים אשר נתקלים בבעיות.</translation>
</message>
<message>
<location line="+3"/>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
<translation type="unfinished"/>
<translation>אזהרה: נראה שאנחנו לא מסכימים לחלוטין עם העמיתים שלנו! ייתכן ואנחנו צריכים לשדרג, או שצמתים אחרות צריכות לשדרג.</translation>
</message>
<message>
<location line="+3"/>
@ -3482,7 +3490,7 @@ rpcpassword=%s
<message>
<location line="+1"/>
<source>Dogecoin Core RPC client version</source>
<translation type="unfinished"/>
<translation>גרסת לקוח RPC של ביטקוין</translation>
</message>
<message>
<location line="+1"/>
@ -3507,7 +3515,7 @@ rpcpassword=%s
<message>
<location line="+1"/>
<source>Connect to JSON-RPC on &lt;port&gt; (default: 22555 or testnet: 44555)</source>
<translation type="unfinished"/>
<translation>התחבר ל JSON-RPC ב &lt;port&gt; (ברירת מחדל: 22555 או ברשת בדיקה: 44555)</translation>
</message>
<message>
<location line="+2"/>
@ -3652,12 +3660,12 @@ rpcpassword=%s
<message>
<location line="+2"/>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
<translation type="unfinished"/>
<translation>בלוק בראשית הינו שגוי או לא נמצא. ספריית מידע לא נכונה עבור הרשת?</translation>
</message>
<message>
<location line="+3"/>
<source>Invalid -onion address: &apos;%s&apos;</source>
<translation type="unfinished"/>
<translation>כתובת onion- שגויה: &apos;%s&apos;</translation>
</message>
<message>
<location line="+15"/>
@ -3690,7 +3698,12 @@ rpcpassword=%s
<translation>שליחת פקודה לשרת הביטקוין</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+2"/>
<source>Set maximum block size in bytes (default: %d)</source>
<translation type="unfinished"/>
</message>
@ -3702,7 +3715,7 @@ rpcpassword=%s
<message>
<location line="+7"/>
<source>Specify wallet file (within data directory)</source>
<translation type="unfinished"/>
<translation>ציין קובץ ארנק (בתוך ספריית המידע)</translation>
</message>
<message>
<location line="+2"/>
@ -3722,7 +3735,7 @@ rpcpassword=%s
<message>
<location line="+10"/>
<source>Usage (deprecated, use dogecoin-cli):</source>
<translation type="unfinished"/>
<translation>שימוש (מיושן, השתמש ב bitcoin-cli):</translation>
</message>
<message>
<location line="+7"/>
@ -3742,7 +3755,7 @@ rpcpassword=%s
<message>
<location line="+1"/>
<source>Wallet %s resides outside data directory %s</source>
<translation type="unfinished"/>
<translation>הארנק %s יושב מחוץ לספריית המידע %s</translation>
</message>
<message>
<location line="+2"/>
@ -3765,10 +3778,15 @@ rpcpassword=%s
<translation>מייבא בלוקים מקובצי blk000??.dat חיצוניים</translation>
</message>
<message>
<location line="-106"/>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<location line="-126"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+19"/>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>הרץ פקודה כאשר ההתראה הרלוונטית מתקבלת או כשאנחנו עדים לפיצול ארוך מאוד (%s בשורת הפקודה יוחלף ע&quot;י ההודעה)</translation>
</message>
<message>
<location line="+14"/>
<source>Output debugging information (default: 0, supplying &lt;category&gt; is optional)</source>
@ -3785,7 +3803,7 @@ rpcpassword=%s
<translation>קבע את מספר תהליכוני אימות הסקריפטים (1-16, 0 = אוטומטי, ברירת מחדל: 0)</translation>
</message>
<message>
<location line="+90"/>
<location line="+91"/>
<source>Information</source>
<translation>מידע</translation>
</message>
@ -3930,12 +3948,12 @@ rpcpassword=%s
<translation>שלח פקודות לצומת ב-&lt;ip&gt; (ברירת מחדל: 127.0.0.1)</translation>
</message>
<message>
<location line="-133"/>
<location line="-134"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation>בצע פקודה זו כשהבלוק הטוב ביותר משתנה (%s בפקודה יוחלף בגיבוב הבלוק)</translation>
</message>
<message>
<location line="+163"/>
<location line="+164"/>
<source>Upgrade wallet to latest format</source>
<translation>שדרג את הארנק לפורמט העדכני</translation>
</message>
@ -4055,12 +4073,7 @@ rpcpassword=%s
<translation>הוסף צומת להתחברות ונסה לשמור את החיבור פתוח</translation>
</message>
<message>
<location line="-32"/>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation>לא ניתן לקשור ל-%s במחשב זה. ביטקוין כנראה עדיין רץ.</translation>
</message>
<message>
<location line="+96"/>
<location line="+64"/>
<source>Loading wallet...</source>
<translation>טוען ארנק...</translation>
</message>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pl" version="2.0">
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pl" version="2.1">
<context>
<name>AboutDialog</name>
<message>
@ -40,7 +40,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<location line="+12"/>
<location line="+2"/>
<source> (%1-bit)</source>
<translation type="unfinished"/>
<translation>(%1-bit)</translation>
</message>
</context>
<context>
@ -71,7 +71,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>&amp;Kopiuj</translation>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>C&amp;lose</source>
<translation>Z&amp;amknij</translation>
</message>
@ -81,7 +81,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>&amp;Kopiuj adres</translation>
</message>
<message>
<location filename="../forms/addressbookpage.ui" line="-41"/>
<location filename="../forms/addressbookpage.ui" line="-47"/>
<source>Delete the currently selected address from the list</source>
<translation>Usuń zaznaczony adres z listy</translation>
</message>
@ -143,7 +143,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<message>
<location line="+1"/>
<source>&amp;Edit</source>
<translation>&amp;Edytuj</translation>
<translation>&amp;Modyfikuj</translation>
</message>
<message>
<location line="+194"/>
@ -326,9 +326,9 @@ This product includes software developed by the OpenSSL Project for use in the O
</message>
</context>
<context>
<name>BitcoinGUI</name>
<name>DogecoinGUI</name>
<message>
<location filename="../bitcoingui.cpp" line="+295"/>
<location filename="../bitcoingui.cpp" line="+294"/>
<source>Sign &amp;message...</source>
<translation>Podpisz wiado&amp;mość...</translation>
</message>
@ -343,12 +343,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>P&amp;odsumowanie</translation>
</message>
<message>
<location line="-137"/>
<location line="-136"/>
<source>Node</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+138"/>
<location line="+137"/>
<source>Show general overview of wallet</source>
<translation>Pokazuje ogólny zarys portfela</translation>
</message>
@ -411,17 +411,17 @@ This product includes software developed by the OpenSSL Project for use in the O
<message>
<location line="+10"/>
<source>Very &amp;sending addresses...</source>
<translation type="unfinished"/>
<translation>Adres wysyłania</translation>
</message>
<message>
<location line="+2"/>
<source>Much &amp;receiving addresses...</source>
<translation type="unfinished"/>
<translation>Adres odbiorczy</translation>
</message>
<message>
<location line="+3"/>
<source>Open &amp;URI...</source>
<translation type="unfinished"/>
<translation>Otwórz URI...</translation>
</message>
<message>
<location line="+325"/>
@ -469,17 +469,17 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>&amp;Zweryfikuj wiadomość...</translation>
</message>
<message>
<location line="+430"/>
<location line="+440"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
<message>
<location line="-643"/>
<location line="-652"/>
<source>Wallet</source>
<translation>Portfel</translation>
</message>
<message>
<location line="+146"/>
<location line="+145"/>
<source>&amp;Send</source>
<translation>Wyślij</translation>
</message>
@ -535,18 +535,18 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>Pasek zakładek</translation>
</message>
<message>
<location line="-284"/>
<location line="+376"/>
<location line="-283"/>
<location line="+375"/>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
<message>
<location line="-401"/>
<location line="-400"/>
<source>Dogecoin Core</source>
<translation>Rdzeń Dogecoin</translation>
</message>
<message>
<location line="+163"/>
<location line="+162"/>
<source>Request payments (generates QR codes and dogecoin: URIs)</source>
<translation>Żądaj płatności (generuje kod QR oraz dogecoin URI)</translation>
</message>
@ -608,7 +608,7 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>Pobrano %1 bloków z historią transakcji.</translation>
</message>
<message numerus="yes">
<location line="+23"/>
<location line="+27"/>
<source>%n hour(s)</source>
<translation><numerusform>%n godzina</numerusform><numerusform>%n godzin</numerusform><numerusform>%n godzin</numerusform></translation>
</message>
@ -619,13 +619,24 @@ This product includes software developed by the OpenSSL Project for use in the O
</message>
<message numerus="yes">
<location line="+4"/>
<location line="+6"/>
<source>%n week(s)</source>
<translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform></translation>
</message>
<message>
<location line="+0"/>
<source>%1 and %2</source>
<translation>%1 i %2</translation>
</message>
<message numerus="yes">
<location line="+0"/>
<source>%n year(s)</source>
<translation><numerusform>%n rok</numerusform><numerusform>%n lata</numerusform><numerusform>%n lat</numerusform></translation>
</message>
<message>
<location line="+4"/>
<source>%1 behind</source>
<translation>%1 do tyłu</translation>
<translation>%1 wstecz</translation>
</message>
<message>
<location line="+21"/>
@ -653,12 +664,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<translation>Informacja</translation>
</message>
<message>
<location line="-85"/>
<location line="-95"/>
<source>Up to date</source>
<translation>Aktualny</translation>
</message>
<message>
<location line="+34"/>
<location line="+44"/>
<source>Catching up...</source>
<translation>Łapanie bloków...</translation>
</message>
@ -696,7 +707,7 @@ Adres: %4
<translation>Portfel jest &lt;b&gt;zaszyfrowany&lt;/b&gt; i obecnie &lt;b&gt;zablokowany&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoin.cpp" line="+435"/>
<location filename="../bitcoin.cpp" line="+441"/>
<source>A fatal error occurred. Dogecoin Core can no longer continue safely and will quit.</source>
<translation>Błąd krytyczny. Dogecoin nie może kontynuować bezpiecznie więc zostanie zamknięty.</translation>
</message>
@ -704,7 +715,7 @@ Adres: %4
<context>
<name>ClientModel</name>
<message>
<location filename="../clientmodel.cpp" line="+119"/>
<location filename="../clientmodel.cpp" line="+128"/>
<source>Network Alert</source>
<translation>Sieć Alert</translation>
</message>
@ -802,7 +813,7 @@ Adres: %4
<translation>Priorytet</translation>
</message>
<message>
<location filename="../coincontroldialog.cpp" line="+42"/>
<location filename="../coincontroldialog.cpp" line="+41"/>
<source>Copy address</source>
<translation>Kopiuj adres</translation>
</message>
@ -868,7 +879,7 @@ Adres: %4
<translation>Skopiuj resztę</translation>
</message>
<message>
<location line="+323"/>
<location line="+332"/>
<source>highest</source>
<translation>najwyższa</translation>
</message>
@ -940,39 +951,39 @@ Adres: %4
<message>
<location line="+10"/>
<source>This label turns red, if the transaction size is greater than 5000 bytes.</source>
<translation type="unfinished"/>
<translation>Etykieta staje się czerwona kiedy transakcja jest większa niż 1000 bajtów.</translation>
</message>
<message>
<location line="+1"/>
<location line="+5"/>
<source>This means a fee of at least %1 per kB is required.</source>
<translation type="unfinished"/>
<translation>Oznacza to wymaganą opłatę minimum %1 na kB.</translation>
</message>
<message>
<location line="-4"/>
<source>Can vary +/- 1 byte per input.</source>
<translation type="unfinished"/>
<translation>Waha się +/- 1 bajt na wejście.</translation>
</message>
<message>
<location line="+2"/>
<source>Transactions with higher priority are more likely to get included into a block.</source>
<translation type="unfinished"/>
<translation>Transakcje o wyższym priorytecie zostają szybciej dołączone do bloku.</translation>
</message>
<message>
<location line="+1"/>
<source>This label turns red, if the priority is smaller than &quot;medium&quot;.</source>
<translation type="unfinished"/>
<translation>Ta etykieta jest czerwona, jeżeli priorytet jest mniejszy niż &quot;średni&quot;</translation>
</message>
<message>
<location line="+3"/>
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
<translation type="unfinished"/>
<translation>Etykieta staje się czerwona kiedy którykolwiek odbiorca otrzymuje kwotę mniejszą niż %1.</translation>
</message>
<message>
<location line="+1"/>
<location line="+4"/>
<source>This means a fee of at least %1 is required.</source>
<translation type="unfinished"/>
<translation>Oznacza to, że wymagana jest opłata przynajmniej %1.</translation>
</message>
<message>
<location line="-3"/>
@ -982,11 +993,11 @@ Adres: %4
<message>
<location line="+2"/>
<source>This label turns red, if the change is smaller than %1.</source>
<translation type="unfinished"/>
<translation>Etykieta staje się czerwona kiedy reszta jest mniejsza niż %1.</translation>
</message>
<message>
<location line="+43"/>
<location line="+66"/>
<location line="+63"/>
<source>(no label)</source>
<translation>(bez etykiety)</translation>
</message>
@ -1006,7 +1017,7 @@ Adres: %4
<message>
<location filename="../forms/editaddressdialog.ui" line="+14"/>
<source>Edit Address</source>
<translation>Edytuj adres</translation>
<translation>Zmień adres</translation>
</message>
<message>
<location line="+11"/>
@ -1041,12 +1052,12 @@ Adres: %4
<message>
<location line="+3"/>
<source>Edit receiving address</source>
<translation>Edytuj adres odbioru</translation>
<translation>Zmień adres odbioru</translation>
</message>
<message>
<location line="+4"/>
<source>Edit sending address</source>
<translation>Edytuj adres wysyłania</translation>
<translation>Zmień adres wysyłania</translation>
</message>
<message>
<location line="+76"/>
@ -1102,7 +1113,7 @@ Adres: %4
<message>
<location filename="../forms/helpmessagedialog.ui" line="+19"/>
<source>Dogecoin Core - Command-line options</source>
<translation type="unfinished"/>
<translation>Opcje konsoli</translation>
</message>
<message>
<location filename="../utilitydialog.cpp" line="+24"/>
@ -1160,17 +1171,17 @@ Adres: %4
<message>
<location line="+9"/>
<source>Welcome to Dogecoin Core.</source>
<translation type="unfinished"/>
<translation>Witam w Dogecoin Core</translation>
</message>
<message>
<location line="+26"/>
<source>As this is the first time the program is launched, you can choose where Dogecoin Core will store its data.</source>
<translation type="unfinished"/>
<translation>Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie będą przechowywane informacje.</translation>
</message>
<message>
<location line="+10"/>
<source>Dogecoin Core will download and store a copy of the Dogecoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
<translation type="unfinished"/>
<translation>Program pobierze i będzie przechowywał kopię łańcucha bloków Dogecoin. W wybranym katalogu musi być przynajmniej %1GB miejsca, a z czasem wielkość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu.</translation>
</message>
<message>
<location line="+10"/>
@ -1183,7 +1194,7 @@ Adres: %4
<translation>Użyj wybranego folderu dla danych</translation>
</message>
<message>
<location filename="../intro.cpp" line="+85"/>
<location filename="../intro.cpp" line="+82"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
@ -1276,7 +1287,7 @@ Adres: %4
<message>
<location line="+16"/>
<source>MB</source>
<translation type="unfinished"/>
<translation>MB</translation>
</message>
<message>
<location line="+27"/>
@ -1289,12 +1300,7 @@ Adres: %4
<translation>Ustaw liczbę wątków skryptu weryfikacji (do 16, 0 = auto, &lt;0 = zostawia taką ilość rdzenie wolnych, domyślnie: 0)</translation>
</message>
<message>
<location line="+107"/>
<source>&amp;Spend unconfirmed change (experts only)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+37"/>
<location line="+153"/>
<source>Connect to the Dogecoin network through a SOCKS proxy.</source>
<translation type="unfinished"/>
</message>
@ -1309,7 +1315,7 @@ Adres: %4
<translation>Adres IP serwera proxy (np. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
<location line="+224"/>
<location line="+214"/>
<source>Active command-line options that override above options:</source>
<translation type="unfinished"/>
</message>
@ -1324,22 +1330,37 @@ Adres: %4
<translation>Z&amp;resetuj Ustawienia</translation>
</message>
<message>
<location line="-323"/>
<location line="-313"/>
<source>&amp;Network</source>
<translation>&amp;Sieć</translation>
</message>
<message>
<location line="-86"/>
<location line="-95"/>
<source>W&amp;allet</source>
<translation>Portfel</translation>
</message>
<message>
<location line="+65"/>
<source>Expert</source>
<translation>Ekspert</translation>
</message>
<message>
<location line="+9"/>
<source>Enable coin &amp;control features</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+52"/>
<location line="+7"/>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+40"/>
<location line="+3"/>
<source>&amp;Spend unconfirmed change</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+17"/>
<source>Automatically open the Dogecoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>Automatycznie otwiera port klienta Dogecoin na routerze. Ta opcja dzieła tylko jeśli twój router wspiera UPnP i jest ono włączone.</translation>
</message>
@ -1434,17 +1455,12 @@ Adres: %4
<translation>&amp;Wyświetlaj adresy w liście transakcji</translation>
</message>
<message>
<location line="+7"/>
<location line="-262"/>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+3"/>
<source>Display coin &amp;control features (experts only)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+136"/>
<location line="+398"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@ -1482,7 +1498,7 @@ Adres: %4
<message>
<location line="+33"/>
<source>This change would require a client restart.</source>
<translation type="unfinished"/>
<translation>Ta zmiana może wymagać ponownego uruchomienia klienta.</translation>
</message>
<message>
<location line="+34"/>
@ -1521,7 +1537,7 @@ Adres: %4
<message>
<location line="+16"/>
<source>Pending:</source>
<translation type="unfinished"/>
<translation>W toku:</translation>
</message>
<message>
<location line="+16"/>
@ -1657,18 +1673,18 @@ Adres: %4
<context>
<name>QObject</name>
<message>
<location filename="../bitcoin.cpp" line="+71"/>
<location line="+11"/>
<location filename="../bitcoin.cpp" line="+63"/>
<location line="+14"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
<message>
<location line="+1"/>
<location line="-13"/>
<source>Error: Specified data directory &quot;%1&quot; does not exist.</source>
<translation>Błąd: Określony folder danych &quot;%1&quot; nie istnieje.</translation>
</message>
<message>
<location line="-12"/>
<location line="+13"/>
<source>Error: Invalid combination of -regtest and -testnet.</source>
<translation>Błąd: Niepoprawna kombinacja -regtest i -testnet.</translation>
</message>
@ -1719,7 +1735,7 @@ Adres: %4
<location line="+36"/>
<location line="+23"/>
<location line="+23"/>
<location filename="../rpcconsole.cpp" line="+359"/>
<location filename="../rpcconsole.cpp" line="+373"/>
<source>N/A</source>
<translation>NIEDOSTĘPNE</translation>
</message>
@ -1815,11 +1831,13 @@ Adres: %4
</message>
<message>
<location line="+64"/>
<location filename="../rpcconsole.cpp" line="-10"/>
<source>In:</source>
<translation>Wejście:</translation>
</message>
<message>
<location line="+80"/>
<location filename="../rpcconsole.cpp" line="+1"/>
<source>Out:</source>
<translation>Wyjście:</translation>
</message>
@ -1844,7 +1862,7 @@ Adres: %4
<translation>Wyczyść konsolę</translation>
</message>
<message>
<location filename="../rpcconsole.cpp" line="-30"/>
<location filename="../rpcconsole.cpp" line="-35"/>
<source>Welcome to the Dogecoin Core RPC console.</source>
<translation>Witam w konsoli Dogecoin RPC</translation>
</message>
@ -1859,7 +1877,7 @@ Adres: %4
<translation>Wpisz &lt;b&gt;help&lt;/b&gt; aby uzyskać listę dostępnych komend</translation>
</message>
<message>
<location line="+122"/>
<location line="+136"/>
<source>%1 B</source>
<translation>%1 B</translation>
</message>
@ -1957,7 +1975,7 @@ Adres: %4
<message>
<location line="+78"/>
<source>Requested payments history</source>
<translation type="unfinished"/>
<translation>Żądanie historii płatności</translation>
</message>
<message>
<location line="-98"/>
@ -1975,7 +1993,7 @@ Adres: %4
<translation>Pokaż</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>Remove the selected entries from the list</source>
<translation>Usuń zaznaczone z listy</translation>
</message>
@ -1985,7 +2003,7 @@ Adres: %4
<translation>Usuń</translation>
</message>
<message>
<location filename="../receivecoinsdialog.cpp" line="+38"/>
<location filename="../receivecoinsdialog.cpp" line="+39"/>
<source>Copy label</source>
<translation>Kopiuj etykietę</translation>
</message>
@ -2098,7 +2116,7 @@ Adres: %4
<message>
<location line="+9"/>
<source>(no message)</source>
<translation type="unfinished"/>
<translation>(brak wiadomości)</translation>
</message>
<message>
<location line="+8"/>
@ -2123,17 +2141,17 @@ Adres: %4
<message>
<location line="+20"/>
<source>Inputs...</source>
<translation type="unfinished"/>
<translation>Wejścia...</translation>
</message>
<message>
<location line="+7"/>
<source>automatically selected</source>
<translation type="unfinished"/>
<translation>zaznaczone automatycznie</translation>
</message>
<message>
<location line="+19"/>
<source>Insufficient funds!</source>
<translation type="unfinished"/>
<translation>Niewystarczające środki</translation>
</message>
<message>
<location line="+89"/>
@ -2178,7 +2196,7 @@ Adres: %4
<message>
<location line="+44"/>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished"/>
<translation>Kiedy ta opcja jest wybrana, ale adres reszty jest pusty lub nieprawidłowy to reszta będzie wysyłana na adres nowo-wygenerowany.</translation>
</message>
<message>
<location line="+3"/>
@ -2206,12 +2224,12 @@ Adres: %4
<translation>Wyczyść &amp;wszystko</translation>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>Balance:</source>
<translation>Saldo:</translation>
</message>
<message>
<location line="-78"/>
<location line="-84"/>
<source>Confirm the send action</source>
<translation>Potwierdź akcję wysyłania</translation>
</message>
@ -2276,7 +2294,7 @@ Adres: %4
<message>
<location line="+170"/>
<source>Total Amount %1 (= %2)</source>
<translation type="unfinished"/>
<translation>Łączna kwota %1 (= %2)</translation>
</message>
<message>
<location line="+2"/>
@ -2316,7 +2334,7 @@ Adres: %4
<message>
<location line="+4"/>
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
<translation type="unfinished"/>
<translation>Transakcja została odrzucona! Może się to zdarzyć jeśli część monet z portfela została już wydana używając kopii pliku wallet.dat i nie zostało to tutaj uwzględnione.</translation>
</message>
<message>
<location line="+113"/>
@ -2458,7 +2476,7 @@ Adres: %4
<message>
<location filename="../utilitydialog.cpp" line="+48"/>
<source>Dogecoin Core is shutting down...</source>
<translation type="unfinished"/>
<translation>Dogecoin Core się zamyka...</translation>
</message>
<message>
<location line="+1"/>
@ -3101,7 +3119,7 @@ Adres: %4
<message>
<location line="+1"/>
<source>Edit label</source>
<translation>Edytuj etykietę</translation>
<translation>Zmień etykietę</translation>
</message>
<message>
<location line="+1"/>
@ -3109,7 +3127,7 @@ Adres: %4
<translation>Pokaż szczegóły transakcji</translation>
</message>
<message>
<location line="+142"/>
<location line="+140"/>
<source>Export Transaction History</source>
<translation>Eksport historii transakcji</translation>
</message>
@ -3230,12 +3248,12 @@ Adres: %4
<message>
<location line="+0"/>
<source>There was an error trying to save the wallet data to %1.</source>
<translation type="unfinished"/>
<translation>Wystąpił błąd przy próbie zapisu pliku portfela do %1.</translation>
</message>
<message>
<location line="+4"/>
<source>The wallet data was successfully saved to %1.</source>
<translation type="unfinished"/>
<translation>Plik portfela został zapisany do %1.</translation>
</message>
<message>
<location line="+0"/>
@ -3246,7 +3264,7 @@ Adres: %4
<context>
<name>dogecoin-core</name>
<message>
<location filename="../bitcoinstrings.cpp" line="+223"/>
<location filename="../bitcoinstrings.cpp" line="+226"/>
<source>Usage:</source>
<translation>Użycie:</translation>
</message>
@ -3281,12 +3299,7 @@ Adres: %4
<translation>Wskaż folder danych</translation>
</message>
<message>
<location line="-9"/>
<source>Set database cache size in megabytes (default: 25)</source>
<translation>Ustaw rozmiar w megabajtach cache-u bazy danych (domyślnie: 25)</translation>
</message>
<message>
<location line="-26"/>
<location line="-35"/>
<source>Listen for connections on &lt;port&gt; (default: 22556 or testnet: 44556)</source>
<translation>Nasłuchuj połączeń na &lt;port&gt; (domyślnie: 22556 lub testnet: 44556)</translation>
</message>
@ -3311,22 +3324,22 @@ Adres: %4
<translation>Próg po którym nastąpi rozłączenie nietrzymających się zasad peerów (domyślnie: 100)</translation>
</message>
<message>
<location line="-150"/>
<location line="-151"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source>
<translation>Czas w sekundach, przez jaki nietrzymający się zasad peerzy nie będą mogli ponownie się podłączyć (domyślnie: 86400)</translation>
</message>
<message>
<location line="-36"/>
<location line="-38"/>
<source>An error occurred while setting up the RPC port %u for listening on IPv4: %s</source>
<translation>Wystąpił błąd podczas ustawiania portu RPC %u w tryb nasłuchu: %s</translation>
</message>
<message>
<location line="+34"/>
<location line="+36"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: 22555 or testnet: 44555)</source>
<translation>Nasłuchuj połączeń JSON-RPC na &lt;port&gt; (domyślnie: 22555 or testnet: 44555)</translation>
</message>
<message>
<location line="+45"/>
<location line="+46"/>
<source>Accept command line and JSON-RPC commands</source>
<translation>Akceptuj linię poleceń oraz polecenia JSON-RPC</translation>
</message>
@ -3346,7 +3359,7 @@ Adres: %4
<translation>Akceptuj połączenia z zewnątrz (domyślnie: 1 jeśli nie ustawiono -proxy lub -connect)</translation>
</message>
<message>
<location line="-95"/>
<location line="-98"/>
<source>%s, you must set a rpcpassword in the configuration file:
%s
It is recommended you use the following random password:
@ -3385,12 +3398,7 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Skojarz z podanym adresem. Użyj formatu [host]:port dla IPv6 </translation>
</message>
<message>
<location line="+3"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation>Nie można zablokować folderu danych %s. Dogecoin prawdopodobnie już działa.</translation>
</message>
<message>
<location line="+3"/>
<location line="+6"/>
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
<translation>Wejście w tryb testów regresji, który wykorzystuje specjalny łańcuch, w którym bloki można rozwiązać natychmiast. To jest przeznaczone dla narzędzi testowania regresji i rozwoju aplikacji.</translation>
</message>
@ -3401,6 +3409,11 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
</message>
<message>
<location line="+3"/>
<source>Error: Listening for incoming connections failed (listen returned error %d)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+2"/>
<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>Błąd: transakcja została odrzucona. Może się to zdarzyć, gdy monety z Twojego portfela zostały już wydane, na przykład gdy używałeś kopii wallet.dat i dogecoiny które tam wydałeś nie zostały jeszcze odjęte z portfela z którego teraz korzystasz.</translation>
</message>
@ -3420,7 +3433,12 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>To jest testowa wersja - używaj na własne ryzyko - nie używaj do wykopywania oraz przy aplikacjach kupieckich</translation>
</message>
<message>
<location line="+5"/>
<location line="+3"/>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+3"/>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source>
<translation type="unfinished"/>
</message>
@ -3680,7 +3698,12 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Wyślij polecenie do serwera Dogecoin</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Ustaw wielkość pamięci podręcznej w megabajtach (%d do %d, domyślnie: %d)</translation>
</message>
<message>
<location line="+2"/>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Ustaw maksymalną wielkość bloku w bajtach (domyślnie: %d)</translation>
</message>
@ -3755,7 +3778,12 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Importuj bloki z zewnętrznego pliku blk000??.dat</translation>
</message>
<message>
<location line="-106"/>
<location line="-126"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+19"/>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>Uruchom polecenie przy otrzymaniu odpowiedniego powiadomienia lub gdy zobaczymy naprawdę długie rozgałęzienie (%s w poleceniu jest podstawiane za komunikat)</translation>
</message>
@ -3767,7 +3795,7 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<message>
<location line="+2"/>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation type="unfinished"/>
<translation>Ustaw maksymalny rozmiar transakcji o wysokim priorytecie/niskiej prowizji w bajtach (domyślnie: 27000)</translation>
</message>
<message>
<location line="+2"/>
@ -3775,7 +3803,7 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Ustaw liczbę wątków skryptu weryfikacji (do 16, 0 = auto, &lt;0 = zostawia taką ilość rdzenie wolnych, domyślnie: 0)</translation>
</message>
<message>
<location line="+90"/>
<location line="+91"/>
<source>Information</source>
<translation>Informacja</translation>
</message>
@ -3920,12 +3948,12 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Wysyłaj polecenia do węzła działającego na &lt;ip&gt; (domyślnie: 127.0.0.1)</translation>
</message>
<message>
<location line="-133"/>
<location line="-134"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation>Wykonaj polecenie kiedy najlepszy blok ulegnie zmianie (%s w komendzie zastanie zastąpione przez hash bloku)</translation>
</message>
<message>
<location line="+163"/>
<location line="+164"/>
<source>Upgrade wallet to latest format</source>
<translation>Zaktualizuj portfel do najnowszego formatu.</translation>
</message>
@ -4045,12 +4073,7 @@ na przykład: alertnotify=echo %%s | mail -s &quot;Alarm Dogecoin&quot; admin@fo
<translation>Dodaj węzeł do łączenia się and attempt to keep the connection open</translation>
</message>
<message>
<location line="-32"/>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation>Nie można przywiązać %s na tym komputerze. Dogecoin prawdopodobnie już działa.</translation>
</message>
<message>
<location line="+96"/>
<location line="+64"/>
<source>Loading wallet...</source>
<translation>Wczytywanie portfela...</translation>
</message>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ro_RO" version="2.0">
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ro_RO" version="2.1">
<context>
<name>AboutDialog</name>
<message>
@ -71,7 +71,7 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>&amp;Copiere</translation>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>C&amp;lose</source>
<translation>&amp;Inchidere</translation>
</message>
@ -81,7 +81,7 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>&amp;Copiază adresa</translation>
</message>
<message>
<location filename="../forms/addressbookpage.ui" line="-41"/>
<location filename="../forms/addressbookpage.ui" line="-47"/>
<source>Delete the currently selected address from the list</source>
<translation>Sterge adresele curent selectate din lista</translation>
</message>
@ -326,9 +326,9 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
</message>
</context>
<context>
<name>BitcoinGUI</name>
<name>DogecoinGUI</name>
<message>
<location filename="../bitcoingui.cpp" line="+295"/>
<location filename="../bitcoingui.cpp" line="+294"/>
<source>Sign &amp;message...</source>
<translation>Semnează &amp;mesaj...</translation>
</message>
@ -343,12 +343,12 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>&amp;Imagine de ansamblu</translation>
</message>
<message>
<location line="-137"/>
<location line="-136"/>
<source>Node</source>
<translation>Nod</translation>
</message>
<message>
<location line="+138"/>
<location line="+137"/>
<source>Show general overview of wallet</source>
<translation>Arată o stare generală de ansamblu a portofelului</translation>
</message>
@ -469,17 +469,17 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>&amp;Verifică mesajul...</translation>
</message>
<message>
<location line="+430"/>
<location line="+440"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
<message>
<location line="-643"/>
<location line="-652"/>
<source>Wallet</source>
<translation>Portofelul</translation>
</message>
<message>
<location line="+146"/>
<location line="+145"/>
<source>&amp;Send</source>
<translation>&amp;Trimite</translation>
</message>
@ -535,18 +535,18 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>Bara de file</translation>
</message>
<message>
<location line="-284"/>
<location line="+376"/>
<location line="-283"/>
<location line="+375"/>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
<message>
<location line="-401"/>
<location line="-400"/>
<source>Dogecoin Core</source>
<translation>Dogecoin Core</translation>
</message>
<message>
<location line="+163"/>
<location line="+162"/>
<source>Request payments (generates QR codes and dogecoin: URIs)</source>
<translation>Cereti plati (genereaza coduri QR si dogecoin-uri: URls)</translation>
</message>
@ -608,7 +608,7 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>S-au procesat %1 blocuri din istoricul tranzacțiilor.</translation>
</message>
<message numerus="yes">
<location line="+23"/>
<location line="+27"/>
<source>%n hour(s)</source>
<translation><numerusform>%n oră</numerusform><numerusform>%n ore</numerusform><numerusform>%n ore</numerusform></translation>
</message>
@ -619,6 +619,7 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
</message>
<message numerus="yes">
<location line="+4"/>
<location line="+6"/>
<source>%n week(s)</source>
<translation><numerusform>%n săptămână</numerusform><numerusform>%n săptămâni</numerusform><numerusform>%n de săptămâni</numerusform></translation>
</message>
@ -663,12 +664,12 @@ Acest produs include programe dezvoltate de către OpenSSL Project pentru a fi f
<translation>Informație</translation>
</message>
<message>
<location line="-85"/>
<location line="-95"/>
<source>Up to date</source>
<translation>Actualizat</translation>
</message>
<message>
<location line="+34"/>
<location line="+44"/>
<source>Catching up...</source>
<translation>Se actualizează...</translation>
</message>
@ -706,7 +707,7 @@ Adresa: %4
<translation>Portofelul este &lt;b&gt;criptat&lt;/b&gt; iar în momentul de față este &lt;b&gt;blocat&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoin.cpp" line="+435"/>
<location filename="../bitcoin.cpp" line="+441"/>
<source>A fatal error occurred. Dogecoin Core can no longer continue safely and will quit.</source>
<translation>A survenit o eroare fatala. Dogecoin nu mai poate continua in siguranta si se va opri.</translation>
</message>
@ -714,7 +715,7 @@ Adresa: %4
<context>
<name>ClientModel</name>
<message>
<location filename="../clientmodel.cpp" line="+119"/>
<location filename="../clientmodel.cpp" line="+128"/>
<source>Network Alert</source>
<translation>Alertă rețea</translation>
</message>
@ -812,7 +813,7 @@ Adresa: %4
<translation>Prioritate</translation>
</message>
<message>
<location filename="../coincontroldialog.cpp" line="+42"/>
<location filename="../coincontroldialog.cpp" line="+41"/>
<source>Copy address</source>
<translation>Copiază adresa</translation>
</message>
@ -878,7 +879,7 @@ Adresa: %4
<translation>Copiaţi schimb</translation>
</message>
<message>
<location line="+323"/>
<location line="+332"/>
<source>highest</source>
<translation>cel mai mare</translation>
</message>
@ -930,7 +931,7 @@ Adresa: %4
<message>
<location line="+31"/>
<source>none</source>
<translation type="unfinished"/>
<translation>nimic</translation>
</message>
<message>
<location line="+141"/>
@ -971,7 +972,7 @@ Adresa: %4
<message>
<location line="+1"/>
<source>This label turns red, if the priority is smaller than &quot;medium&quot;.</source>
<translation type="unfinished"/>
<translation>Aceasta eticheta se face rosie daca prioritatea e mai mica decat media</translation>
</message>
<message>
<location line="+3"/>
@ -996,7 +997,7 @@ Adresa: %4
</message>
<message>
<location line="+43"/>
<location line="+66"/>
<location line="+63"/>
<source>(no label)</source>
<translation>(fără etichetă)</translation>
</message>
@ -1193,7 +1194,7 @@ Adresa: %4
<translation>Folosește un dosar de date personalizat:</translation>
</message>
<message>
<location filename="../intro.cpp" line="+85"/>
<location filename="../intro.cpp" line="+82"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
@ -1299,12 +1300,7 @@ Adresa: %4
<translation type="unfinished"/>
</message>
<message>
<location line="+107"/>
<source>&amp;Spend unconfirmed change (experts only)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+37"/>
<location line="+153"/>
<source>Connect to the Dogecoin network through a SOCKS proxy.</source>
<translation>Conecteaza-te la reteaua Dogecoin printr-un proxy SOCKS</translation>
</message>
@ -1319,7 +1315,7 @@ Adresa: %4
<translation type="unfinished"/>
</message>
<message>
<location line="+224"/>
<location line="+214"/>
<source>Active command-line options that override above options:</source>
<translation type="unfinished"/>
</message>
@ -1334,22 +1330,37 @@ Adresa: %4
<translation>&amp;Resetează opțiunile</translation>
</message>
<message>
<location line="-323"/>
<location line="-313"/>
<source>&amp;Network</source>
<translation>&amp;Retea</translation>
</message>
<message>
<location line="-86"/>
<location line="-95"/>
<source>W&amp;allet</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+52"/>
<location line="+65"/>
<source>Expert</source>
<translation>expert</translation>
</message>
<message>
<location line="+9"/>
<source>Enable coin &amp;control features</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+7"/>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+40"/>
<location line="+3"/>
<source>&amp;Spend unconfirmed change</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+17"/>
<source>Automatically open the Dogecoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>Deschide automat în router portul aferent clientului Dogecoin. Funcţionează doar în cazul în care routerul e compatibil UPnP şi opţiunea e activată.</translation>
</message>
@ -1444,17 +1455,12 @@ Adresa: %4
<translation>&amp;Afişează adresele în lista de tranzacţii</translation>
</message>
<message>
<location line="+7"/>
<location line="-262"/>
<source>Whether to show coin control features or not.</source>
<translation>Dacă se afişeze controlul caracteristicilor monedei sau nu.</translation>
</message>
<message>
<location line="+3"/>
<source>Display coin &amp;control features (experts only)</source>
<translation>Afişeare controlul caracteristicilor monedei (doat pentru experţi)</translation>
</message>
<message>
<location line="+136"/>
<location line="+398"/>
<source>&amp;OK</source>
<translation>&amp; OK</translation>
</message>
@ -1471,7 +1477,7 @@ Adresa: %4
<message>
<location line="+58"/>
<source>none</source>
<translation type="unfinished"/>
<translation>nimic</translation>
</message>
<message>
<location line="+78"/>
@ -1667,18 +1673,18 @@ Adresa: %4
<context>
<name>QObject</name>
<message>
<location filename="../bitcoin.cpp" line="+71"/>
<location line="+11"/>
<location filename="../bitcoin.cpp" line="+63"/>
<location line="+14"/>
<source>Dogecoin</source>
<translation>Dogecoin</translation>
</message>
<message>
<location line="+1"/>
<location line="-13"/>
<source>Error: Specified data directory &quot;%1&quot; does not exist.</source>
<translation>Eroare: Directorul datelor specificate &quot;%1&quot; nu exista.</translation>
</message>
<message>
<location line="-12"/>
<location line="+13"/>
<source>Error: Invalid combination of -regtest and -testnet.</source>
<translation>Eroare: combinație nevalidă de -regtest și -testnet.</translation>
</message>
@ -1729,7 +1735,7 @@ Adresa: %4
<location line="+36"/>
<location line="+23"/>
<location line="+23"/>
<location filename="../rpcconsole.cpp" line="+359"/>
<location filename="../rpcconsole.cpp" line="+373"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
@ -1825,11 +1831,13 @@ Adresa: %4
</message>
<message>
<location line="+64"/>
<location filename="../rpcconsole.cpp" line="-10"/>
<source>In:</source>
<translation>în:</translation>
</message>
<message>
<location line="+80"/>
<location filename="../rpcconsole.cpp" line="+1"/>
<source>Out:</source>
<translation>Ieșire.</translation>
</message>
@ -1854,7 +1862,7 @@ Adresa: %4
<translation>Curăță consola</translation>
</message>
<message>
<location filename="../rpcconsole.cpp" line="-30"/>
<location filename="../rpcconsole.cpp" line="-35"/>
<source>Welcome to the Dogecoin Core RPC console.</source>
<translation>Bun venit la consola dogecoin RPC</translation>
</message>
@ -1869,7 +1877,7 @@ Adresa: %4
<translation>Scrie &lt;b&gt;help&lt;/b&gt; pentru a vedea comenzile disponibile</translation>
</message>
<message>
<location line="+122"/>
<location line="+136"/>
<source>%1 B</source>
<translation>%1 B</translation>
</message>
@ -1967,7 +1975,7 @@ Adresa: %4
<message>
<location line="+78"/>
<source>Requested payments history</source>
<translation type="unfinished"/>
<translation>Istoricul platilor a fost cerut</translation>
</message>
<message>
<location line="-98"/>
@ -1985,7 +1993,7 @@ Adresa: %4
<translation>Arată</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>Remove the selected entries from the list</source>
<translation type="unfinished"/>
</message>
@ -1995,7 +2003,7 @@ Adresa: %4
<translation>Elimină</translation>
</message>
<message>
<location filename="../receivecoinsdialog.cpp" line="+38"/>
<location filename="../receivecoinsdialog.cpp" line="+39"/>
<source>Copy label</source>
<translation>Copiază eticheta</translation>
</message>
@ -2216,12 +2224,12 @@ Adresa: %4
<translation>Șterge &amp;tot</translation>
</message>
<message>
<location line="+52"/>
<location line="+58"/>
<source>Balance:</source>
<translation>Balanță:</translation>
</message>
<message>
<location line="-78"/>
<location line="-84"/>
<source>Confirm the send action</source>
<translation>Confirmă operațiunea de trimitere</translation>
</message>
@ -2423,7 +2431,7 @@ Adresa: %4
<location line="+524"/>
<location line="+536"/>
<source>Remove this entry</source>
<translation type="unfinished"/>
<translation>Scoate aceasta introducere</translation>
</message>
<message>
<location line="-1008"/>
@ -3119,7 +3127,7 @@ Adresa: %4
<translation>Arată detaliile tranzacției</translation>
</message>
<message>
<location line="+142"/>
<location line="+140"/>
<source>Export Transaction History</source>
<translation>Exportare Istoric Tranzacţii</translation>
</message>
@ -3256,7 +3264,7 @@ Adresa: %4
<context>
<name>dogecoin-core</name>
<message>
<location filename="../bitcoinstrings.cpp" line="+223"/>
<location filename="../bitcoinstrings.cpp" line="+226"/>
<source>Usage:</source>
<translation>Uz:</translation>
</message>
@ -3291,12 +3299,7 @@ Adresa: %4
<translation>Specifică dosarul de date</translation>
</message>
<message>
<location line="-9"/>
<source>Set database cache size in megabytes (default: 25)</source>
<translation>Setează mărimea cache a bazei de date în megabiți (implicit: 25)</translation>
</message>
<message>
<location line="-26"/>
<location line="-35"/>
<source>Listen for connections on &lt;port&gt; (default: 22556 or testnet: 44556)</source>
<translation>Ascultă pentru conectări pe &lt;port&gt; (implicit: 22556 sau testnet: 44556)</translation>
</message>
@ -3321,22 +3324,22 @@ Adresa: %4
<translation>Prag pentru deconectarea partenerilor care nu funcționează corect (implicit: 100)</translation>
</message>
<message>
<location line="-150"/>
<location line="-151"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source>
<translation>Numărul de secunde pentru a preveni reconectarea partenerilor care nu funcționează corect (implicit: 86400)</translation>
</message>
<message>
<location line="-36"/>
<location line="-38"/>
<source>An error occurred while setting up the RPC port %u for listening on IPv4: %s</source>
<translation>A intervenit o eroare in timp ce se seta portul RPC %u pentru ascultare pe IPv4: %s</translation>
</message>
<message>
<location line="+34"/>
<location line="+36"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: 22555 or testnet: 44555)</source>
<translation>Ascultă pentru conexiuni JSON-RPC pe &lt;port&gt; (implicit:22555 sau testnet: 44555)</translation>
</message>
<message>
<location line="+45"/>
<location line="+46"/>
<source>Accept command line and JSON-RPC commands</source>
<translation>Se acceptă comenzi din linia de comandă și comenzi JSON-RPC</translation>
</message>
@ -3356,7 +3359,7 @@ Adresa: %4
<translation>Acceptă conexiuni din afară (implicit: 1 dacă nu se folosește -proxy sau -connect)</translation>
</message>
<message>
<location line="-95"/>
<location line="-98"/>
<source>%s, you must set a rpcpassword in the configuration file:
%s
It is recommended you use the following random password:
@ -3397,12 +3400,7 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Atasati adresei date si ascultati totdeauna pe ea. Folositi [host]:port notatia pentru IPv6</translation>
</message>
<message>
<location line="+3"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation>Nu se poate obține o blocare a directorului de date %s. Dogecoin probabil rulează deja.</translation>
</message>
<message>
<location line="+3"/>
<location line="+6"/>
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
<translation>Initiati modul de test al regresie, care foloseste un lant special in care block-urile pot fi rezolvate instantaneu. Acest lucru este facut pentru utilitare si aplicatii de dezvoltare pentru testarea regresiei.</translation>
</message>
@ -3413,6 +3411,11 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
</message>
<message>
<location line="+3"/>
<source>Error: Listening for incoming connections failed (listen returned error %d)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+2"/>
<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>Eroare: Tranzactia a fost respinsa! Acest lucru se poate intampla daca anumite monezi din portofelul dumneavoastra au fost deja cheltuite, deasemenea daca ati folosit o copie a fisierului wallet.dat si monezile au fost folosite in acea copie dar nu au fost marcate ca fiind folosite acolo.</translation>
</message>
@ -3432,7 +3435,12 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Aceasta este o versiune de test preliminara - va asumati riscul folosind-o - nu folositi pentru minerit sau aplicatiile comerciantilor.</translation>
</message>
<message>
<location line="+5"/>
<location line="+3"/>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+3"/>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source>
<translation>Utilizare proxy SOCKS5 separat pentru a ajunge la servicii ascunse TOR (implicit: -proxy)</translation>
</message>
@ -3692,7 +3700,12 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Trimite comanda la serverul Dogecoin</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+2"/>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Setaţi dimensiunea maximă a unui block în bytes (implicit: %d)</translation>
</message>
@ -3767,7 +3780,12 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Importă blocuri dintr-un fișier extern blk000??.dat</translation>
</message>
<message>
<location line="-106"/>
<location line="-126"/>
<source>Cannot obtain a lock on data directory %s. Dogecoin Core is probably already running.</source>
<translation type="unfinished"/>
</message>
<message>
<location line="+19"/>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>Executati comanda cand o alerta relevanta este primita sau vedem o bifurcatie foarte lunga (%s in cmd este inlocuti de mesaj)</translation>
</message>
@ -3787,7 +3805,7 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation type="unfinished"/>
</message>
<message>
<location line="+90"/>
<location line="+91"/>
<source>Information</source>
<translation>Informație</translation>
</message>
@ -3829,7 +3847,7 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<message>
<location line="+9"/>
<source>SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Optiuni SSl (vezi Dogecoin wiki pentru intructiunile de instalare)</translation>
<translation>Optiuni SSl (vezi Bitcoin wiki pentru intructiunile de instalare)</translation>
</message>
<message>
<location line="+4"/>
@ -3932,12 +3950,12 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Trimite comenzi la nodul care rulează la &lt;ip&gt; (implicit: 127.0.0.1)</translation>
</message>
<message>
<location line="-133"/>
<location line="-134"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation>Execută comanda când cel mai bun bloc se modifică (%s în cmd este înlocuit cu hash-ul blocului)</translation>
</message>
<message>
<location line="+163"/>
<location line="+164"/>
<source>Upgrade wallet to latest format</source>
<translation>Actualizează portofelul la ultimul format</translation>
</message>
@ -4057,12 +4075,7 @@ spre exemplu: alertnotify=echo %%s | mail -s &quot;Alerta Dogecoin&quot; admin@f
<translation>Adaugă un nod la care te poți conecta pentru a menține conexiunea deschisă</translation>
</message>
<message>
<location line="-32"/>
<source>Unable to bind to %s on this computer. Dogecoin Core is probably already running.</source>
<translation>Imposibilitatea de a lega la% s pe acest computer. Dogecoin este, probabil, deja în execuție.</translation>
</message>
<message>
<location line="+96"/>
<location line="+64"/>
<source>Loading wallet...</source>
<translation>Încarc portofel...</translation>
</message>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -96,6 +96,9 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
#endif
}
}
#if QT_VERSION >= 0x040700
ui->thirdPartyTxUrls->setPlaceholderText("https://example.com/tx/%s");
#endif
ui->unit->setModel(new BitcoinUnits(this));
ui->transactionFee->setSingleStep(CTransaction::nMinTxFee);
@ -151,6 +154,7 @@ void OptionsDialog::setModel(OptionsModel *model)
connect(ui->connectSocks, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
/* Display */
connect(ui->lang, SIGNAL(valueChanged()), this, SLOT(showRestartWarning()));
connect(ui->thirdPartyTxUrls, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning()));
}
void OptionsDialog::setMapper()
@ -183,6 +187,7 @@ void OptionsDialog::setMapper()
mapper->addMapping(ui->lang, OptionsModel::Language);
mapper->addMapping(ui->unit, OptionsModel::DisplayUnit);
mapper->addMapping(ui->displayAddresses, OptionsModel::DisplayAddresses);
mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls);
}
void OptionsDialog::enableOkButton()

View file

@ -65,6 +65,10 @@ void OptionsModel::Init()
settings.setValue("bDisplayAddresses", false);
bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
if (!settings.contains("strThirdPartyTxUrls"))
settings.setValue("strThirdPartyTxUrls", "http://dogechain.info/tx/%s|https://chain.so/tx/DOGE/%s");
strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
if (!settings.contains("fCoinControlFeatures"))
settings.setValue("fCoinControlFeatures", false);
fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
@ -205,6 +209,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
return nDisplayUnit;
case DisplayAddresses:
return bDisplayAddresses;
case ThirdPartyTxUrls:
return strThirdPartyTxUrls;
case Language:
return settings.value("language");
case CoinControlFeatures:
@ -306,6 +312,13 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
bDisplayAddresses = value.toBool();
settings.setValue("bDisplayAddresses", bDisplayAddresses);
break;
case ThirdPartyTxUrls:
if (strThirdPartyTxUrls != value.toString()) {
strThirdPartyTxUrls = value.toString();
settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
setRestartRequired(true);
}
break;
case Language:
if (settings.value("language") != value) {
settings.setValue("language", value);

View file

@ -36,6 +36,7 @@ public:
Fee, // qint64
DisplayUnit, // BitcoinUnits::Unit
DisplayAddresses, // bool
ThirdPartyTxUrls, // QString
Language, // QString
CoinControlFeatures, // bool
ThreadsScriptVerif, // int
@ -56,6 +57,7 @@ public:
bool getMinimizeOnClose() { return fMinimizeOnClose; }
int getDisplayUnit() { return nDisplayUnit; }
bool getDisplayAddresses() { return bDisplayAddresses; }
QString getThirdPartyTxUrls() { return strThirdPartyTxUrls; }
bool getProxySettings(QNetworkProxy& proxy) const;
bool getCoinControlFeatures() { return fCoinControlFeatures; }
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
@ -71,6 +73,7 @@ private:
QString language;
int nDisplayUnit;
bool bDisplayAddresses;
QString strThirdPartyTxUrls;
bool fCoinControlFeatures;
/* settings that were overriden by command-line */
QString strOverriddenByCommandLine;

View file

@ -20,6 +20,7 @@
QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
{
AssertLockHeld(cs_main);
if (!IsFinalTx(wtx, chainActive.Height() + 1))
{
if (wtx.nLockTime < LOCKTIME_THRESHOLD)
@ -45,268 +46,263 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, int vout, int u
{
QString strHTML;
LOCK2(cs_main, wallet->cs_wallet);
strHTML.reserve(4000);
strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>";
int64_t nTime = wtx.GetTxTime();
int64_t nCredit = wtx.GetCredit();
int64_t nDebit = wtx.GetDebit();
int64_t nNet = nCredit - nDebit;
strHTML += "<b>" + tr("Status") + ":</b> " + FormatTxStatus(wtx);
int nRequests = wtx.GetRequestCount();
if (nRequests != -1)
{
LOCK(wallet->cs_wallet);
strHTML.reserve(4000);
strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>";
if (nRequests == 0)
strHTML += tr(", has not been successfully broadcast yet");
else if (nRequests > 0)
strHTML += tr(", broadcast through %n node(s)", "", nRequests);
}
strHTML += "<br>";
int64_t nTime = wtx.GetTxTime();
int64_t nCredit = wtx.GetCredit();
int64_t nDebit = wtx.GetDebit();
int64_t nNet = nCredit - nDebit;
strHTML += "<b>" + tr("Date") + ":</b> " + (nTime ? GUIUtil::dateTimeStr(nTime) : "") + "<br>";
strHTML += "<b>" + tr("Status") + ":</b> " + FormatTxStatus(wtx);
int nRequests = wtx.GetRequestCount();
if (nRequests != -1)
//
// From
//
if (wtx.IsCoinBase())
{
strHTML += "<b>" + tr("Source") + ":</b> " + tr("Generated") + "<br>";
}
else if (wtx.mapValue.count("from") && !wtx.mapValue["from"].empty())
{
// Online transaction
strHTML += "<b>" + tr("From") + ":</b> " + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "<br>";
}
else
{
// Offline transaction
if (nNet > 0)
{
if (nRequests == 0)
strHTML += tr(", has not been successfully broadcast yet");
else if (nRequests > 0)
strHTML += tr(", broadcast through %n node(s)", "", nRequests);
}
strHTML += "<br>";
strHTML += "<b>" + tr("Date") + ":</b> " + (nTime ? GUIUtil::dateTimeStr(nTime) : "") + "<br>";
//
// From
//
if (wtx.IsCoinBase())
{
strHTML += "<b>" + tr("Source") + ":</b> " + tr("Generated") + "<br>";
}
else if (wtx.mapValue.count("from") && !wtx.mapValue["from"].empty())
{
// Online transaction
strHTML += "<b>" + tr("From") + ":</b> " + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "<br>";
}
else
{
// Offline transaction
if (nNet > 0)
{
// Credit
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
{
if (wallet->IsMine(txout))
{
CTxDestination address;
if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
{
if (wallet->mapAddressBook.count(address))
{
strHTML += "<b>" + tr("From") + ":</b> " + tr("unknown") + "<br>";
strHTML += "<b>" + tr("To") + ":</b> ";
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
if (!wallet->mapAddressBook[address].name.empty())
strHTML += " (" + tr("own address") + ", " + tr("label") + ": " + GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + ")";
else
strHTML += " (" + tr("own address") + ")";
strHTML += "<br>";
}
}
break;
}
}
}
}
//
// To
//
if (wtx.mapValue.count("to") && !wtx.mapValue["to"].empty())
{
// Online transaction
std::string strAddress = wtx.mapValue["to"];
strHTML += "<b>" + tr("To") + ":</b> ";
CTxDestination dest = CBitcoinAddress(strAddress).Get();
if (wallet->mapAddressBook.count(dest) && !wallet->mapAddressBook[dest].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[dest].name) + " ";
strHTML += GUIUtil::HtmlEscape(strAddress) + "<br>";
}
//
// Amount
//
if (wtx.IsCoinBase() && nCredit == 0)
{
//
// Coinbase
//
int64_t nUnmatured = 0;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
nUnmatured += wallet->GetCredit(txout);
strHTML += "<b>" + tr("Credit") + ":</b> ";
if (wtx.IsInMainChain())
strHTML += BitcoinUnits::formatWithUnit(unit, nUnmatured)+ " (" + tr("matures in %n more block(s)", "", wtx.GetBlocksToMaturity()) + ")";
else
strHTML += "(" + tr("not accepted") + ")";
strHTML += "<br>";
}
else if (nNet > 0)
{
//
// Credit
//
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nNet) + "<br>";
}
else
{
bool fAllFromMe = true;
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
fAllFromMe = fAllFromMe && wallet->IsMine(txin);
bool fAllToMe = true;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
fAllToMe = fAllToMe && wallet->IsMine(txout);
if (fAllFromMe)
{
//
// Debit
//
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if (wallet->IsMine(txout))
{
if (wallet->IsMine(txout))
continue;
if (!wtx.mapValue.count("to") || wtx.mapValue["to"].empty())
CTxDestination address;
if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
{
// Offline transaction
CTxDestination address;
if (ExtractDestination(txout.scriptPubKey, address))
if (wallet->mapAddressBook.count(address))
{
strHTML += "<b>" + tr("From") + ":</b> " + tr("unknown") + "<br>";
strHTML += "<b>" + tr("To") + ":</b> ";
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + " ";
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
if (!wallet->mapAddressBook[address].name.empty())
strHTML += " (" + tr("own address") + ", " + tr("label") + ": " + GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + ")";
else
strHTML += " (" + tr("own address") + ")";
strHTML += "<br>";
}
}
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -txout.nValue) + "<br>";
break;
}
if (fAllToMe)
{
// Payment to self
int64_t nChange = wtx.GetChange();
int64_t nValue = nCredit - nChange;
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nValue) + "<br>";
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nValue) + "<br>";
}
int64_t nTxFee = nDebit - wtx.GetValueOut();
if (nTxFee > 0)
strHTML += "<b>" + tr("Transaction fee") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nTxFee) + "<br>";
}
else
{
//
// Mixed debit transaction
//
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if (wallet->IsMine(txin))
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -wallet->GetDebit(txin)) + "<br>";
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if (wallet->IsMine(txout))
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, wallet->GetCredit(txout)) + "<br>";
}
}
}
strHTML += "<b>" + tr("Net amount") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nNet, true) + "<br>";
//
// To
//
if (wtx.mapValue.count("to") && !wtx.mapValue["to"].empty())
{
// Online transaction
std::string strAddress = wtx.mapValue["to"];
strHTML += "<b>" + tr("To") + ":</b> ";
CTxDestination dest = CBitcoinAddress(strAddress).Get();
if (wallet->mapAddressBook.count(dest) && !wallet->mapAddressBook[dest].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[dest].name) + " ";
strHTML += GUIUtil::HtmlEscape(strAddress) + "<br>";
}
//
// Amount
//
if (wtx.IsCoinBase() && nCredit == 0)
{
//
// Message
// Coinbase
//
if (wtx.mapValue.count("message") && !wtx.mapValue["message"].empty())
strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "<br>";
if (wtx.mapValue.count("comment") && !wtx.mapValue["comment"].empty())
strHTML += "<br><b>" + tr("Comment") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
strHTML += "<b>" + tr("Transaction ID") + ":</b> " + TransactionRecord::formatSubTxId(wtx.GetHash(), vout) + "<br>";
// Message from normal dogecoin:URI (dogecoin:D12...?message=example)
foreach (const PAIRTYPE(string, string)& r, wtx.vOrderForm)
if (r.first == "Message")
strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(r.second, true) + "<br>";
int64_t nUnmatured = 0;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
nUnmatured += wallet->GetCredit(txout);
strHTML += "<b>" + tr("Credit") + ":</b> ";
if (wtx.IsInMainChain())
strHTML += BitcoinUnits::formatWithUnit(unit, nUnmatured)+ " (" + tr("matures in %n more block(s)", "", wtx.GetBlocksToMaturity()) + ")";
else
strHTML += "(" + tr("not accepted") + ")";
strHTML += "<br>";
}
else if (nNet > 0)
{
//
// PaymentRequest info:
// Credit
//
foreach (const PAIRTYPE(string, string)& r, wtx.vOrderForm)
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nNet) + "<br>";
}
else
{
bool fAllFromMe = true;
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
fAllFromMe = fAllFromMe && wallet->IsMine(txin);
bool fAllToMe = true;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
fAllToMe = fAllToMe && wallet->IsMine(txout);
if (fAllFromMe)
{
if (r.first == "PaymentRequest")
{
PaymentRequestPlus req;
req.parse(QByteArray::fromRawData(r.second.data(), r.second.size()));
QString merchant;
if (req.getMerchant(PaymentServer::getCertStore(), merchant))
strHTML += "<b>" + tr("Merchant") + ":</b> " + GUIUtil::HtmlEscape(merchant) + "<br>";
}
}
if (wtx.IsCoinBase())
{
quint32 numBlocksToMaturity = COINBASE_MATURITY + 1;
if (wtx.GetDepthInMainChain() >= COINBASE_MATURITY_SWITCH)
{
numBlocksToMaturity = COINBASE_MATURITY_NEW + 1;
}
strHTML += "<br>" + tr("Generated coins must mature %1 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.").arg(QString::number(numBlocksToMaturity)) + "<br>";
}
//
// Debug view
//
if (fDebug)
{
strHTML += "<hr><br>" + tr("Debug information") + "<br><br>";
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if(wallet->IsMine(txin))
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -wallet->GetDebit(txin)) + "<br>";
//
// Debit
//
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if(wallet->IsMine(txout))
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, wallet->GetCredit(txout)) + "<br>";
strHTML += "<br><b>" + tr("Transaction") + ":</b><br>";
strHTML += GUIUtil::HtmlEscape(wtx.ToString(), true);
strHTML += "<br><b>" + tr("Inputs") + ":</b>";
strHTML += "<ul>";
{
LOCK(wallet->cs_wallet);
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
{
COutPoint prevout = txin.prevout;
if (wallet->IsMine(txout))
continue;
CCoins prev;
if(pcoinsTip->GetCoins(prevout.hash, prev))
if (!wtx.mapValue.count("to") || wtx.mapValue["to"].empty())
{
// Offline transaction
CTxDestination address;
if (ExtractDestination(txout.scriptPubKey, address))
{
if (prevout.n < prev.vout.size())
{
strHTML += "<li>";
const CTxOut &vout = prev.vout[prevout.n];
CTxDestination address;
if (ExtractDestination(vout.scriptPubKey, address))
{
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + " ";
strHTML += QString::fromStdString(CBitcoinAddress(address).ToString());
}
strHTML = strHTML + " " + tr("Amount") + "=" + BitcoinUnits::formatWithUnit(unit, vout.nValue);
strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? tr("true") : tr("false")) + "</li>";
}
strHTML += "<b>" + tr("To") + ":</b> ";
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + " ";
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
strHTML += "<br>";
}
}
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -txout.nValue) + "<br>";
}
strHTML += "</ul>";
if (fAllToMe)
{
// Payment to self
int64_t nChange = wtx.GetChange();
int64_t nValue = nCredit - nChange;
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nValue) + "<br>";
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nValue) + "<br>";
}
int64_t nTxFee = nDebit - wtx.GetValueOut();
if (nTxFee > 0)
strHTML += "<b>" + tr("Transaction fee") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nTxFee) + "<br>";
}
else
{
//
// Mixed debit transaction
//
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if (wallet->IsMine(txin))
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -wallet->GetDebit(txin)) + "<br>";
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if (wallet->IsMine(txout))
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, wallet->GetCredit(txout)) + "<br>";
}
}
strHTML += "<b>" + tr("Net amount") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nNet, true) + "<br>";
//
// Message
//
if (wtx.mapValue.count("message") && !wtx.mapValue["message"].empty())
strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "<br>";
if (wtx.mapValue.count("comment") && !wtx.mapValue["comment"].empty())
strHTML += "<br><b>" + tr("Comment") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
strHTML += "<b>" + tr("Transaction ID") + ":</b> " + TransactionRecord::formatSubTxId(wtx.GetHash(), vout) + "<br>";
// Message from normal dogecoin:URI (dogecoin:D12...?message=example)
foreach (const PAIRTYPE(string, string)& r, wtx.vOrderForm)
if (r.first == "Message")
strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(r.second, true) + "<br>";
//
// PaymentRequest info:
//
foreach (const PAIRTYPE(string, string)& r, wtx.vOrderForm)
{
if (r.first == "PaymentRequest")
{
PaymentRequestPlus req;
req.parse(QByteArray::fromRawData(r.second.data(), r.second.size()));
QString merchant;
if (req.getMerchant(PaymentServer::getCertStore(), merchant))
strHTML += "<b>" + tr("Merchant") + ":</b> " + GUIUtil::HtmlEscape(merchant) + "<br>";
}
}
if (wtx.IsCoinBase())
{
quint32 numBlocksToMaturity = COINBASE_MATURITY + 1;
if (wtx.GetDepthInMainChain() >= COINBASE_MATURITY_SWITCH)
{
numBlocksToMaturity = COINBASE_MATURITY_NEW + 1;
}
strHTML += "<br>" + tr("Generated coins must mature %1 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.").arg(QString::number(numBlocksToMaturity)) + "<br>";
}
//
// Debug view
//
if (fDebug)
{
strHTML += "<hr><br>" + tr("Debug information") + "<br><br>";
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
if(wallet->IsMine(txin))
strHTML += "<b>" + tr("Debit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -wallet->GetDebit(txin)) + "<br>";
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
if(wallet->IsMine(txout))
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, wallet->GetCredit(txout)) + "<br>";
strHTML += "<br><b>" + tr("Transaction") + ":</b><br>";
strHTML += GUIUtil::HtmlEscape(wtx.ToString(), true);
strHTML += "<br><b>" + tr("Inputs") + ":</b>";
strHTML += "<ul>";
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
{
COutPoint prevout = txin.prevout;
CCoins prev;
if(pcoinsTip->GetCoins(prevout.hash, prev))
{
if (prevout.n < prev.vout.size())
{
strHTML += "<li>";
const CTxOut &vout = prev.vout[prevout.n];
CTxDestination address;
if (ExtractDestination(vout.scriptPubKey, address))
{
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].name.empty())
strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address].name) + " ";
strHTML += QString::fromStdString(CBitcoinAddress(address).ToString());
}
strHTML = strHTML + " " + tr("Amount") + "=" + BitcoinUnits::formatWithUnit(unit, vout.nValue);
strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? tr("true") : tr("false")) + "</li>";
}
}
}
strHTML += "</font></html>";
strHTML += "</ul>";
}
strHTML += "</font></html>";
return strHTML;
}

View file

@ -150,6 +150,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *
void TransactionRecord::updateStatus(const CWalletTx &wtx)
{
AssertLockHeld(cs_main);
// Determine transaction status
// Find the block the tx is in
@ -234,6 +235,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx)
bool TransactionRecord::statusUpdateNeeded()
{
AssertLockHeld(cs_main);
return status.cur_num_blocks != chainActive.Height();
}

View file

@ -24,7 +24,6 @@
#include <QDebug>
#include <QIcon>
#include <QList>
#include <QTimer>
// Amount column is right-aligned it contains numbers
static int column_alignments[] = {
@ -78,7 +77,7 @@ public:
qDebug() << "TransactionTablePriv::refreshWallet";
cachedWallet.clear();
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
for(std::map<uint256, CWalletTx>::iterator it = wallet->mapWallet.begin(); it != wallet->mapWallet.end(); ++it)
{
if(TransactionRecord::showTransaction(it->second))
@ -96,7 +95,7 @@ public:
{
qDebug() << "TransactionTablePriv::updateWallet : " + QString::fromStdString(hash.ToString()) + " " + QString::number(status);
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
// Find transaction in wallet
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash);
@ -187,13 +186,19 @@ public:
{
TransactionRecord *rec = &cachedWallet[idx];
// Get required locks upfront. This avoids the GUI from getting
// stuck if the core is holding the locks for a longer time - for
// example, during a wallet rescan.
//
// If a status update is needed (blocks came in since last check),
// update the status of this transaction from the wallet. Otherwise,
// simply re-use the cached status.
if(rec->statusUpdateNeeded())
TRY_LOCK(cs_main, lockMain);
if(lockMain)
{
TRY_LOCK(wallet->cs_wallet, lockWallet);
if(lockWallet && rec->statusUpdateNeeded())
{
LOCK(wallet->cs_wallet);
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
if(mi != wallet->mapWallet.end())
@ -213,7 +218,7 @@ public:
QString describe(TransactionRecord *rec, int unit)
{
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
if(mi != wallet->mapWallet.end())
{
@ -228,17 +233,12 @@ TransactionTableModel::TransactionTableModel(CWallet* wallet, WalletModel *paren
QAbstractTableModel(parent),
wallet(wallet),
walletModel(parent),
priv(new TransactionTablePriv(wallet, this)),
cachedNumBlocks(0)
priv(new TransactionTablePriv(wallet, this))
{
columns << QString() << tr("Date") << tr("Type") << tr("Address") << tr("Amount");
priv->refreshWallet();
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateConfirmations()));
timer->start(MODEL_UPDATE_DELAY);
connect(walletModel->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
}
@ -257,16 +257,12 @@ void TransactionTableModel::updateTransaction(const QString &hash, int status)
void TransactionTableModel::updateConfirmations()
{
if(chainActive.Height() != cachedNumBlocks)
{
cachedNumBlocks = chainActive.Height();
// Blocks came in since last poll.
// Invalidate status (number of confirmations) and (possibly) description
// for all rows. Qt is smart enough to only actually request the data for the
// visible rows.
emit dataChanged(index(0, Status), index(priv->size()-1, Status));
emit dataChanged(index(0, ToAddress), index(priv->size()-1, ToAddress));
}
// Blocks came in since last poll.
// Invalidate status (number of confirmations) and (possibly) description
// for all rows. Qt is smart enough to only actually request the data for the
// visible rows.
emit dataChanged(index(0, Status), index(priv->size()-1, Status));
emit dataChanged(index(0, ToAddress), index(priv->size()-1, ToAddress));
}
int TransactionTableModel::rowCount(const QModelIndex &parent) const
@ -568,6 +564,8 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
return rec->credit + rec->debit;
case TxIDRole:
return rec->getTxID();
case TxHashRole:
return QString::fromStdString(rec->hash.ToString());
case ConfirmedRole:
return rec->status.countsForBalance;
case FormattedAmountRole:

View file

@ -50,6 +50,8 @@ public:
AmountRole,
/** Unique identifier */
TxIDRole,
/** Transaction hash */
TxHashRole,
/** Is transaction confirmed? */
ConfirmedRole,
/** Formatted amount, without brackets when unconfirmed */
@ -69,7 +71,6 @@ private:
WalletModel *walletModel;
QStringList columns;
TransactionTablePriv *priv;
int cachedNumBlocks;
QString lookupAddress(const std::string &address, bool tooltip) const;
QVariant addressColor(const TransactionRecord *wtx) const;

View file

@ -20,6 +20,7 @@
#include <QComboBox>
#include <QDateTimeEdit>
#include <QDesktopServices>
#include <QDoubleValidator>
#include <QHBoxLayout>
#include <QHeaderView>
@ -28,10 +29,10 @@
#include <QMenu>
#include <QPoint>
#include <QScrollBar>
#include <QSignalMapper>
#include <QTableView>
#include <QVBoxLayout>
#include <QDesktopServices>
#include <QUrl>
#include <QVBoxLayout>
TransactionView::TransactionView(QWidget *parent) :
QWidget(parent), model(0), transactionProxyModel(0),
@ -131,20 +132,20 @@ TransactionView::TransactionView(QWidget *parent) :
QAction *copyTxIDAction = new QAction(tr("Copy transaction ID"), this);
QAction *editLabelAction = new QAction(tr("Edit label"), this);
QAction *showDetailsAction = new QAction(tr("Show transaction details"), this);
QAction *viewOnDogechain = new QAction(tr("Show transaction on Dogechain"), this);
contextMenu = new QMenu();
contextMenu->addAction(copyAddressAction);
contextMenu->addAction(copyLabelAction);
contextMenu->addAction(copyAmountAction);
contextMenu->addAction(copyTxIDAction);
contextMenu->addSeparator();
contextMenu->addAction(editLabelAction);
contextMenu->addAction(showDetailsAction);
contextMenu->addSeparator();
contextMenu->addAction(viewOnDogechain);
mapperThirdPartyTxUrls = new QSignalMapper(this);
// Connect actions
connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString)));
connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
connect(addressWidget, SIGNAL(textChanged(QString)), this, SLOT(changedPrefix(QString)));
@ -159,7 +160,6 @@ TransactionView::TransactionView(QWidget *parent) :
connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID()));
connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel()));
connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails()));
connect(viewOnDogechain, SIGNAL(triggered()), this, SLOT(viewOnDogechain()));
}
void TransactionView::setModel(WalletModel *model)
@ -190,6 +190,25 @@ void TransactionView::setModel(WalletModel *model)
transactionView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(transactionView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH);
if (model->getOptionsModel())
{
// Add third party transaction URLs to context menu
QStringList listUrls = model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts);
for (int i = 0; i < listUrls.size(); ++i)
{
QString host = QUrl(listUrls[i].trimmed(), QUrl::StrictMode).host();
if (!host.isEmpty())
{
QAction *thirdPartyTxUrlAction = new QAction(host, this); // use host as menu item label
if (i == 0)
contextMenu->addSeparator();
contextMenu->addAction(thirdPartyTxUrlAction);
connect(thirdPartyTxUrlAction, SIGNAL(triggered()), mapperThirdPartyTxUrls, SLOT(map()));
mapperThirdPartyTxUrls->setMapping(thirdPartyTxUrlAction, listUrls[i].trimmed());
}
}
}
}
}
@ -390,18 +409,13 @@ void TransactionView::showDetails()
}
}
void TransactionView::viewOnDogechain()
void TransactionView::openThirdPartyTxUrl(QString url)
{
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!transactionView || !transactionView->selectionModel())
return;
QModelIndexList selection = transactionView->selectionModel()->selectedRows(0);
if(!selection.isEmpty())
{
QString format("http://dogechain.info/tx/");
QString munged = selection.at(0).data(TransactionTableModel::TxIDRole).toString();
format += munged.left(munged.lastIndexOf("-"));
QDesktopServices::openUrl(QUrl(format));
}
QDesktopServices::openUrl(QUrl::fromUserInput(url.replace("%s", selection.at(0).data(TransactionTableModel::TxHashRole).toString())));
}
QWidget *TransactionView::createDateRangeWidget()

View file

@ -19,6 +19,7 @@ class QFrame;
class QLineEdit;
class QMenu;
class QModelIndex;
class QSignalMapper;
class QTableView;
QT_END_NAMESPACE
@ -65,6 +66,7 @@ private:
QLineEdit *amountWidget;
QMenu *contextMenu;
QSignalMapper *mapperThirdPartyTxUrls;
QFrame *dateRangeWidget;
QDateTimeEdit *dateFrom;
@ -85,7 +87,7 @@ private slots:
void copyLabel();
void copyAmount();
void copyTxID();
void viewOnDogechain();
void openThirdPartyTxUrl(QString url);
signals:
void doubleClicked(const QModelIndex&);

View file

@ -98,11 +98,24 @@ void WalletModel::updateStatus()
void WalletModel::pollBalanceChanged()
{
// Get required locks upfront. This avoids the GUI from getting stuck on
// periodical polls if the core is holding the locks for a longer time -
// for example, during a wallet rescan.
TRY_LOCK(cs_main, lockMain);
if(!lockMain)
return;
TRY_LOCK(wallet->cs_wallet, lockWallet);
if(!lockWallet)
return;
if(chainActive.Height() != cachedNumBlocks)
{
// Balance and number of transactions might have changed
cachedNumBlocks = chainActive.Height();
checkBalanceChanged();
if(transactionTableModel)
transactionTableModel->updateConfirmations();
}
}
@ -520,7 +533,7 @@ bool WalletModel::getPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const
// returns a list of COutputs from COutPoints
void WalletModel::getOutputs(const std::vector<COutPoint>& vOutpoints, std::vector<COutput>& vOutputs)
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
BOOST_FOREACH(const COutPoint& outpoint, vOutpoints)
{
if (!wallet->mapWallet.count(outpoint.hash)) continue;
@ -533,7 +546,7 @@ void WalletModel::getOutputs(const std::vector<COutPoint>& vOutpoints, std::vect
bool WalletModel::isSpent(const COutPoint& outpoint) const
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
return wallet->IsSpent(outpoint.hash, outpoint.n);
}
@ -543,7 +556,7 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
std::vector<COutput> vCoins;
wallet->AvailableCoins(vCoins);
LOCK(wallet->cs_wallet); // ListLockedCoins, mapWallet
LOCK2(cs_main, wallet->cs_wallet); // ListLockedCoins, mapWallet
std::vector<COutPoint> vLockedCoins;
wallet->ListLockedCoins(vLockedCoins);
@ -575,25 +588,25 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
bool WalletModel::isLockedCoin(uint256 hash, unsigned int n) const
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
return wallet->IsLockedCoin(hash, n);
}
void WalletModel::lockCoin(COutPoint& output)
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
wallet->LockCoin(output);
}
void WalletModel::unlockCoin(COutPoint& output)
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
wallet->UnlockCoin(output);
}
void WalletModel::listLockedCoins(std::vector<COutPoint>& vOutpts)
{
LOCK(wallet->cs_wallet);
LOCK2(cs_main, wallet->cs_wallet);
wallet->ListLockedCoins(vOutpts);
}

View file

@ -154,7 +154,7 @@ Value importwallet(const Array& params, bool fHelp)
EnsureWalletIsUnlocked();
ifstream file;
file.open(params[0].get_str().c_str());
file.open(params[0].get_str().c_str(), std::ios::in | std::ios::ate);
if (!file.is_open())
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot open wallet dump file");
@ -162,7 +162,12 @@ Value importwallet(const Array& params, bool fHelp)
bool fGood = true;
int64_t nFilesize = std::max((int64_t)1, (int64_t)file.tellg());
file.seekg(0, file.beg);
pwalletMain->ShowProgress(_("Importing..."), 0); // show progress dialog in GUI
while (file.good()) {
pwalletMain->ShowProgress("", std::max(1, std::min(99, (int)(((double)file.tellg() / (double)nFilesize) * 100))));
std::string line;
std::getline(file, line);
if (line.empty() || line[0] == '#')
@ -208,6 +213,7 @@ Value importwallet(const Array& params, bool fHelp)
nTimeBegin = std::min(nTimeBegin, nTime);
}
file.close();
pwalletMain->ShowProgress("", 100); // hide progress dialog in GUI
CBlockIndex *pindex = chainActive.Tip();
while (pindex && pindex->pprev && pindex->nTime > nTimeBegin - 7200)

View file

@ -5,7 +5,6 @@
#include "script.h"
#include "bignum.h"
#include "core.h"
#include "hash.h"
#include "key.h"
@ -25,22 +24,13 @@ typedef vector<unsigned char> valtype;
static const valtype vchFalse(0);
static const valtype vchZero(0);
static const valtype vchTrue(1, 1);
static const CBigNum bnZero(0);
static const CBigNum bnOne(1);
static const CBigNum bnFalse(0);
static const CBigNum bnTrue(1);
static const size_t nMaxNumSize = 4;
static const CScriptNum bnZero(0);
static const CScriptNum bnOne(1);
static const CScriptNum bnFalse(0);
static const CScriptNum bnTrue(1);
bool CheckSig(vector<unsigned char> vchSig, const vector<unsigned char> &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags);
CBigNum CastToBigNum(const valtype& vch)
{
if (vch.size() > nMaxNumSize)
throw runtime_error("CastToBigNum() : overflow");
// Get rid of extra leading zeros
return CBigNum(CBigNum(vch).getvch());
}
bool CastToBool(const valtype& vch)
{
for (unsigned int i = 0; i < vch.size(); i++)
@ -306,7 +296,6 @@ bool IsCanonicalSignature(const valtype &vchSig, unsigned int flags) {
bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType)
{
CAutoBN_CTX pctx;
CScript::const_iterator pc = script.begin();
CScript::const_iterator pend = script.end();
CScript::const_iterator pbegincodehash = script.begin();
@ -380,7 +369,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
case OP_16:
{
// ( -- value)
CBigNum bn((int)opcode - (int)(OP_1 - 1));
CScriptNum bn((int)opcode - (int)(OP_1 - 1));
stack.push_back(bn.getvch());
}
break;
@ -556,7 +545,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
case OP_DEPTH:
{
// -- stacksize
CBigNum bn(stack.size());
CScriptNum bn(stack.size());
stack.push_back(bn.getvch());
}
break;
@ -606,7 +595,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
// (xn ... x2 x1 x0 n - ... x2 x1 x0 xn)
if (stack.size() < 2)
return false;
int n = CastToBigNum(stacktop(-1)).getint();
int n = CScriptNum(stacktop(-1)).getint();
popstack(stack);
if (n < 0 || n >= (int)stack.size())
return false;
@ -654,7 +643,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
// (in -- in size)
if (stack.size() < 1)
return false;
CBigNum bn(stacktop(-1).size());
CScriptNum bn(stacktop(-1).size());
stack.push_back(bn.getvch());
}
break;
@ -705,7 +694,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
// (in -- out)
if (stack.size() < 1)
return false;
CBigNum bn = CastToBigNum(stacktop(-1));
CScriptNum bn(stacktop(-1));
switch (opcode)
{
case OP_1ADD: bn += bnOne; break;
@ -738,9 +727,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
// (x1 x2 -- out)
if (stack.size() < 2)
return false;
CBigNum bn1 = CastToBigNum(stacktop(-2));
CBigNum bn2 = CastToBigNum(stacktop(-1));
CBigNum bn;
CScriptNum bn1(stacktop(-2));
CScriptNum bn2(stacktop(-1));
CScriptNum bn(0);
switch (opcode)
{
case OP_ADD:
@ -783,9 +772,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
// (x min max -- out)
if (stack.size() < 3)
return false;
CBigNum bn1 = CastToBigNum(stacktop(-3));
CBigNum bn2 = CastToBigNum(stacktop(-2));
CBigNum bn3 = CastToBigNum(stacktop(-1));
CScriptNum bn1(stacktop(-3));
CScriptNum bn2(stacktop(-2));
CScriptNum bn3(stacktop(-1));
bool fValue = (bn2 <= bn1 && bn1 < bn3);
popstack(stack);
popstack(stack);
@ -882,7 +871,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
if ((int)stack.size() < i)
return false;
int nKeysCount = CastToBigNum(stacktop(-i)).getint();
int nKeysCount = CScriptNum(stacktop(-i)).getint();
if (nKeysCount < 0 || nKeysCount > 20)
return false;
nOpCount += nKeysCount;
@ -893,7 +882,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
if ((int)stack.size() < i)
return false;
int nSigsCount = CastToBigNum(stacktop(-i)).getint();
int nSigsCount = CScriptNum(stacktop(-i)).getint();
if (nSigsCount < 0 || nSigsCount > nKeysCount)
return false;
int isig = ++i;

View file

@ -6,7 +6,6 @@
#ifndef H_BITCOIN_SCRIPT
#define H_BITCOIN_SCRIPT
#include "bignum.h"
#include "key.h"
#include "util.h"
@ -25,6 +24,155 @@ class CTransaction;
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes
static const unsigned int MAX_OP_RETURN_RELAY = 40; // bytes
class scriptnum_error : public std::runtime_error
{
public:
explicit scriptnum_error(const std::string& str) : std::runtime_error(str) {}
};
class CScriptNum
{
// Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers.
// The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1],
// but results may overflow (and are valid as long as they are not used in a subsequent
// numeric operation). CScriptNum enforces those semantics by storing results as
// an int64 and allowing out-of-range values to be returned as a vector of bytes but
// throwing an exception if arithmetic is done or the result is interpreted as an integer.
public:
explicit CScriptNum(const int64_t& n)
{
m_value = n;
}
explicit CScriptNum(const std::vector<unsigned char>& vch)
{
if (vch.size() > nMaxNumSize)
throw scriptnum_error("CScriptNum(const std::vector<unsigned char>&) : overflow");
m_value = set_vch(vch);
}
inline bool operator==(const int64_t& rhs) const { return m_value == rhs; }
inline bool operator!=(const int64_t& rhs) const { return m_value != rhs; }
inline bool operator<=(const int64_t& rhs) const { return m_value <= rhs; }
inline bool operator< (const int64_t& rhs) const { return m_value < rhs; }
inline bool operator>=(const int64_t& rhs) const { return m_value >= rhs; }
inline bool operator> (const int64_t& rhs) const { return m_value > rhs; }
inline bool operator==(const CScriptNum& rhs) const { return operator==(rhs.m_value); }
inline bool operator!=(const CScriptNum& rhs) const { return operator!=(rhs.m_value); }
inline bool operator<=(const CScriptNum& rhs) const { return operator<=(rhs.m_value); }
inline bool operator< (const CScriptNum& rhs) const { return operator< (rhs.m_value); }
inline bool operator>=(const CScriptNum& rhs) const { return operator>=(rhs.m_value); }
inline bool operator> (const CScriptNum& rhs) const { return operator> (rhs.m_value); }
inline CScriptNum operator+( const int64_t& rhs) const { return CScriptNum(m_value + rhs);}
inline CScriptNum operator-( const int64_t& rhs) const { return CScriptNum(m_value - rhs);}
inline CScriptNum operator+( const CScriptNum& rhs) const { return operator+(rhs.m_value); }
inline CScriptNum operator-( const CScriptNum& rhs) const { return operator-(rhs.m_value); }
inline CScriptNum& operator+=( const CScriptNum& rhs) { return operator+=(rhs.m_value); }
inline CScriptNum& operator-=( const CScriptNum& rhs) { return operator-=(rhs.m_value); }
inline CScriptNum operator-() const
{
assert(m_value != std::numeric_limits<int64_t>::min());
return CScriptNum(-m_value);
}
inline CScriptNum& operator=( const int64_t& rhs)
{
m_value = rhs;
return *this;
}
inline CScriptNum& operator+=( const int64_t& rhs)
{
assert(rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) ||
(rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs));
m_value += rhs;
return *this;
}
inline CScriptNum& operator-=( const int64_t& rhs)
{
assert(rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) ||
(rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs));
m_value -= rhs;
return *this;
}
int getint() const
{
if (m_value > std::numeric_limits<int>::max())
return std::numeric_limits<int>::max();
else if (m_value < std::numeric_limits<int>::min())
return std::numeric_limits<int>::min();
return m_value;
}
std::vector<unsigned char> getvch() const
{
return serialize(m_value);
}
static std::vector<unsigned char> serialize(const int64_t& value)
{
if(value == 0)
return std::vector<unsigned char>();
std::vector<unsigned char> result;
const bool neg = value < 0;
uint64_t absvalue = neg ? -value : value;
while(absvalue)
{
result.push_back(absvalue & 0xff);
absvalue >>= 8;
}
// - If the most significant byte is >= 0x80 and the value is positive, push a
// new zero-byte to make the significant byte < 0x80 again.
// - If the most significant byte is >= 0x80 and the value is negative, push a
// new 0x80 byte that will be popped off when converting to an integral.
// - If the most significant byte is < 0x80 and the value is negative, add
// 0x80 to it, since it will be subtracted and interpreted as a negative when
// converting to an integral.
if (result.back() & 0x80)
result.push_back(neg ? 0x80 : 0);
else if (neg)
result.back() |= 0x80;
return result;
}
static const size_t nMaxNumSize = 4;
private:
static int64_t set_vch(const std::vector<unsigned char>& vch)
{
if (vch.empty())
return 0;
int64_t result = 0;
for (size_t i = 0; i != vch.size(); ++i)
result |= static_cast<int64_t>(vch[i]) << 8*i;
// If the input vector's most significant byte is 0x80, remove it from
// the result's msb and return a negative.
if (vch.back() & 0x80)
return -(result & ~(0x80 << (8 * (vch.size() - 1))));
return result;
}
int64_t m_value;
};
/** Signature hash types/flags */
enum
{
@ -225,7 +373,7 @@ const char* GetOpName(opcodetype opcode);
inline std::string ValueString(const std::vector<unsigned char>& vch)
{
if (vch.size() <= 4)
return strprintf("%d", CBigNum(vch).getint());
return strprintf("%d", CScriptNum(vch).getint());
else
return HexStr(vch);
}
@ -261,26 +409,10 @@ protected:
}
else
{
CBigNum bn(n);
*this << bn.getvch();
*this << CScriptNum::serialize(n);
}
return *this;
}
CScript& push_uint64(uint64_t n)
{
if (n >= 1 && n <= 16)
{
push_back(n + (OP_1 - 1));
}
else
{
CBigNum bn(n);
*this << bn.getvch();
}
return *this;
}
public:
CScript() { }
CScript(const CScript& b) : std::vector<unsigned char>(b.begin(), b.end()) { }
@ -303,35 +435,15 @@ public:
}
//explicit CScript(char b) is not portable. Use 'signed char' or 'unsigned char'.
explicit CScript(signed char b) { operator<<(b); }
explicit CScript(short b) { operator<<(b); }
explicit CScript(int b) { operator<<(b); }
explicit CScript(long b) { operator<<(b); }
explicit CScript(long long b) { operator<<(b); }
explicit CScript(unsigned char b) { operator<<(b); }
explicit CScript(unsigned int b) { operator<<(b); }
explicit CScript(unsigned short b) { operator<<(b); }
explicit CScript(unsigned long b) { operator<<(b); }
explicit CScript(unsigned long long b) { operator<<(b); }
CScript(int64_t b) { operator<<(b); }
explicit CScript(opcodetype b) { operator<<(b); }
explicit CScript(const uint256& b) { operator<<(b); }
explicit CScript(const CBigNum& b) { operator<<(b); }
explicit CScript(const CScriptNum& b) { operator<<(b); }
explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
//CScript& operator<<(char b) is not portable. Use 'signed char' or 'unsigned char'.
CScript& operator<<(signed char b) { return push_int64(b); }
CScript& operator<<(short b) { return push_int64(b); }
CScript& operator<<(int b) { return push_int64(b); }
CScript& operator<<(long b) { return push_int64(b); }
CScript& operator<<(long long b) { return push_int64(b); }
CScript& operator<<(unsigned char b) { return push_uint64(b); }
CScript& operator<<(unsigned int b) { return push_uint64(b); }
CScript& operator<<(unsigned short b) { return push_uint64(b); }
CScript& operator<<(unsigned long b) { return push_uint64(b); }
CScript& operator<<(unsigned long long b) { return push_uint64(b); }
CScript& operator<<(int64_t b) { return push_int64(b); }
CScript& operator<<(opcodetype opcode)
{
@ -363,7 +475,7 @@ public:
return *this;
}
CScript& operator<<(const CBigNum& b)
CScript& operator<<(const CScriptNum& b)
{
*this << b.getvch();
return *this;

View file

@ -62,6 +62,7 @@ test_dogecoin_SOURCES = \
transaction_tests.cpp \
uint256_tests.cpp \
util_tests.cpp \
scriptnum_tests.cpp \
sighash_tests.cpp \
$(JSON_TEST_FILES) $(RAW_TEST_FILES)

View file

@ -257,7 +257,10 @@
["1","0xba", "0xba == OP_NOP10 + 1"],
["2147483648", "1ADD 1", "We cannot do math on 5-byte integers"],
["2147483648", "NEGATE 1", "We cannot do math on 5-byte integers"],
["-2147483648", "1ADD 1", "Because we use a sign bit, -2147483648 is also 5 bytes"],
["2147483647", "1ADD 1SUB 1", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
["2147483648", "1SUB 1", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
["1", "1 ENDIF", "ENDIF without IF"],
["1", "IF 1", "IF without ENDIF"],

View file

@ -97,6 +97,9 @@
["8388608", "SIZE 4 EQUAL"],
["2147483647", "SIZE 4 EQUAL"],
["2147483648", "SIZE 5 EQUAL"],
["549755813887", "SIZE 5 EQUAL"],
["549755813888", "SIZE 6 EQUAL"],
["9223372036854775807", "SIZE 8 EQUAL"],
["-1", "SIZE 1 EQUAL"],
["-127", "SIZE 1 EQUAL"],
["-128", "SIZE 2 EQUAL"],
@ -106,6 +109,9 @@
["-8388608", "SIZE 4 EQUAL"],
["-2147483647", "SIZE 4 EQUAL"],
["-2147483648", "SIZE 5 EQUAL"],
["-549755813887", "SIZE 5 EQUAL"],
["-549755813888", "SIZE 6 EQUAL"],
["-9223372036854775807", "SIZE 8 EQUAL"],
["'abcdefghijklmnopqrstuvwxyz'", "SIZE 26 EQUAL"],
@ -306,6 +312,9 @@
["8388608", "0x04 0x00008000 EQUAL"],
["2147483647", "0x04 0xFFFFFF7F EQUAL"],
["2147483648", "0x05 0x0000008000 EQUAL"],
["549755813887", "0x05 0xFFFFFFFF7F EQUAL"],
["549755813888", "0x06 0xFFFFFFFF7F EQUAL"],
["9223372036854775807", "0x08 0xFFFFFFFFFFFFFF7F EQUAL"],
["-1", "0x01 0x81 EQUAL", "Numbers are little-endian with the MSB being a sign bit"],
["-127", "0x01 0xFF EQUAL"],
["-128", "0x02 0x8080 EQUAL"],
@ -315,6 +324,10 @@
["-8388608", "0x04 0x00008080 EQUAL"],
["-2147483647", "0x04 0xFFFFFFFF EQUAL"],
["-2147483648", "0x05 0x0000008080 EQUAL"],
["-4294967295", "0x05 0xFFFFFFFF80 EQUAL"],
["-549755813887", "0x05 0xFFFFFFFFFF EQUAL"],
["-549755813888", "0x06 0x000000008080 EQUAL"],
["-9223372036854775807", "0x08 0xFFFFFFFFFFFFFFFF EQUAL"],
["2147483647", "1ADD 2147483648 EQUAL", "We can do math on 4-byte integers, and compare 5-byte ones"],
["2147483647", "1ADD 1"],

View file

@ -65,7 +65,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
// Test RPC calls for various wallet statistics
Value r;
LOCK(pwalletMain->cs_wallet);
LOCK2(cs_main, pwalletMain->cs_wallet);
BOOST_CHECK_NO_THROW(CallRPC("listunspent"));
BOOST_CHECK_THROW(CallRPC("listunspent string"), runtime_error);

View file

@ -50,6 +50,7 @@ BOOST_AUTO_TEST_SUITE(script_P2SH_tests)
BOOST_AUTO_TEST_CASE(sign)
{
LOCK(cs_main);
// Pay-to-script-hash looks like this:
// scriptSig: <sig> <sig...> <serialized_script>
// scriptPubKey: HASH160 <hash> EQUAL
@ -147,6 +148,7 @@ BOOST_AUTO_TEST_CASE(norecurse)
BOOST_AUTO_TEST_CASE(set)
{
LOCK(cs_main);
// Test the CScript::Set* methods
CBasicKeyStore keystore;
CKey key[4];
@ -250,6 +252,7 @@ BOOST_AUTO_TEST_CASE(switchover)
BOOST_AUTO_TEST_CASE(AreInputsStandard)
{
LOCK(cs_main);
CCoinsView coinsDummy;
CCoinsViewCache coins(coinsDummy);
CBasicKeyStore keystore;

View file

@ -0,0 +1,196 @@
// Copyright (c) 2012-2014 The Bitcoin Core developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "bignum.h"
#include "script.h"
#include <boost/test/unit_test.hpp>
#include <limits.h>
#include <stdint.h>
BOOST_AUTO_TEST_SUITE(scriptnum_tests)
static const int64_t values[] = \
{ 0, 1, CHAR_MIN, CHAR_MAX, UCHAR_MAX, SHRT_MIN, USHRT_MAX, INT_MIN, INT_MAX, UINT_MAX, LONG_MIN, LONG_MAX };
static const int64_t offsets[] = { 1, 0x79, 0x80, 0x81, 0xFF, 0x7FFF, 0x8000, 0xFFFF, 0x10000};
static bool verify(const CBigNum& bignum, const CScriptNum& scriptnum)
{
return bignum.getvch() == scriptnum.getvch() && bignum.getint() == scriptnum.getint();
}
static void CheckCreateVch(const int64_t& num)
{
CBigNum bignum(num);
CScriptNum scriptnum(num);
BOOST_CHECK(verify(bignum, scriptnum));
CBigNum bignum2(bignum.getvch());
CScriptNum scriptnum2(scriptnum.getvch());
BOOST_CHECK(verify(bignum2, scriptnum2));
CBigNum bignum3(scriptnum2.getvch());
CScriptNum scriptnum3(bignum2.getvch());
BOOST_CHECK(verify(bignum3, scriptnum3));
}
static void CheckCreateInt(const int64_t& num)
{
CBigNum bignum(num);
CScriptNum scriptnum(num);
BOOST_CHECK(verify(bignum, scriptnum));
BOOST_CHECK(verify(bignum.getint(), CScriptNum(scriptnum.getint())));
BOOST_CHECK(verify(scriptnum.getint(), CScriptNum(bignum.getint())));
BOOST_CHECK(verify(CBigNum(scriptnum.getint()).getint(), CScriptNum(CScriptNum(bignum.getint()).getint())));
}
static void CheckAdd(const int64_t& num1, const int64_t& num2)
{
const CBigNum bignum1(num1);
const CBigNum bignum2(num2);
const CScriptNum scriptnum1(num1);
const CScriptNum scriptnum2(num2);
CBigNum bignum3(num1);
CBigNum bignum4(num1);
CScriptNum scriptnum3(num1);
CScriptNum scriptnum4(num1);
// int64_t overflow is undefined.
bool invalid = (((num2 > 0) && (num1 > (std::numeric_limits<int64_t>::max() - num2))) ||
((num2 < 0) && (num1 < (std::numeric_limits<int64_t>::min() - num2))));
if (!invalid)
{
BOOST_CHECK(verify(bignum1 + bignum2, scriptnum1 + scriptnum2));
BOOST_CHECK(verify(bignum1 + bignum2, scriptnum1 + num2));
BOOST_CHECK(verify(bignum1 + bignum2, scriptnum2 + num1));
}
}
static void CheckNegate(const int64_t& num)
{
const CBigNum bignum(num);
const CScriptNum scriptnum(num);
// -INT64_MIN is undefined
if (num != std::numeric_limits<int64_t>::min())
BOOST_CHECK(verify(-bignum, -scriptnum));
}
static void CheckSubtract(const int64_t& num1, const int64_t& num2)
{
const CBigNum bignum1(num1);
const CBigNum bignum2(num2);
const CScriptNum scriptnum1(num1);
const CScriptNum scriptnum2(num2);
bool invalid = false;
// int64_t overflow is undefined.
invalid = ((num2 > 0 && num1 < std::numeric_limits<int64_t>::min() + num2) ||
(num2 < 0 && num1 > std::numeric_limits<int64_t>::max() + num2));
if (!invalid)
{
BOOST_CHECK(verify(bignum1 - bignum2, scriptnum1 - scriptnum2));
BOOST_CHECK(verify(bignum1 - bignum2, scriptnum1 - num2));
}
invalid = ((num1 > 0 && num2 < std::numeric_limits<int64_t>::min() + num1) ||
(num1 < 0 && num2 > std::numeric_limits<int64_t>::max() + num1));
if (!invalid)
{
BOOST_CHECK(verify(bignum2 - bignum1, scriptnum2 - scriptnum1));
BOOST_CHECK(verify(bignum2 - bignum1, scriptnum2 - num1));
}
}
static void CheckCompare(const int64_t& num1, const int64_t& num2)
{
const CBigNum bignum1(num1);
const CBigNum bignum2(num2);
const CScriptNum scriptnum1(num1);
const CScriptNum scriptnum2(num2);
BOOST_CHECK((bignum1 == bignum1) == (scriptnum1 == scriptnum1));
BOOST_CHECK((bignum1 != bignum1) == (scriptnum1 != scriptnum1));
BOOST_CHECK((bignum1 < bignum1) == (scriptnum1 < scriptnum1));
BOOST_CHECK((bignum1 > bignum1) == (scriptnum1 > scriptnum1));
BOOST_CHECK((bignum1 >= bignum1) == (scriptnum1 >= scriptnum1));
BOOST_CHECK((bignum1 <= bignum1) == (scriptnum1 <= scriptnum1));
BOOST_CHECK((bignum1 == bignum1) == (scriptnum1 == num1));
BOOST_CHECK((bignum1 != bignum1) == (scriptnum1 != num1));
BOOST_CHECK((bignum1 < bignum1) == (scriptnum1 < num1));
BOOST_CHECK((bignum1 > bignum1) == (scriptnum1 > num1));
BOOST_CHECK((bignum1 >= bignum1) == (scriptnum1 >= num1));
BOOST_CHECK((bignum1 <= bignum1) == (scriptnum1 <= num1));
BOOST_CHECK((bignum1 == bignum2) == (scriptnum1 == scriptnum2));
BOOST_CHECK((bignum1 != bignum2) == (scriptnum1 != scriptnum2));
BOOST_CHECK((bignum1 < bignum2) == (scriptnum1 < scriptnum2));
BOOST_CHECK((bignum1 > bignum2) == (scriptnum1 > scriptnum2));
BOOST_CHECK((bignum1 >= bignum2) == (scriptnum1 >= scriptnum2));
BOOST_CHECK((bignum1 <= bignum2) == (scriptnum1 <= scriptnum2));
BOOST_CHECK((bignum1 == bignum2) == (scriptnum1 == num2));
BOOST_CHECK((bignum1 != bignum2) == (scriptnum1 != num2));
BOOST_CHECK((bignum1 < bignum2) == (scriptnum1 < num2));
BOOST_CHECK((bignum1 > bignum2) == (scriptnum1 > num2));
BOOST_CHECK((bignum1 >= bignum2) == (scriptnum1 >= num2));
BOOST_CHECK((bignum1 <= bignum2) == (scriptnum1 <= num2));
}
static void RunCreate(const int64_t& num)
{
CheckCreateInt(num);
CScriptNum scriptnum(num);
if (scriptnum.getvch().size() <= CScriptNum::nMaxNumSize)
CheckCreateVch(num);
else
{
BOOST_CHECK_THROW (CheckCreateVch(num), scriptnum_error);
}
}
static void RunOperators(const int64_t& num1, const int64_t& num2)
{
CheckAdd(num1, num2);
CheckSubtract(num1, num2);
CheckNegate(num1);
CheckCompare(num1, num2);
}
BOOST_AUTO_TEST_CASE(creation)
{
for(size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i)
{
for(size_t j = 0; j < sizeof(offsets) / sizeof(offsets[0]); ++j)
{
RunCreate(values[i]);
RunCreate(values[i] + offsets[j]);
RunCreate(values[i] - offsets[j]);
}
}
}
BOOST_AUTO_TEST_CASE(operators)
{
for(size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i)
{
for(size_t j = 0; j < sizeof(offsets) / sizeof(offsets[0]); ++j)
{
RunOperators(values[i], values[i]);
RunOperators(values[i], -values[i]);
RunOperators(values[i], values[j]);
RunOperators(values[i], -values[j]);
RunOperators(values[i] + values[j], values[j]);
RunOperators(values[i] + values[j], -values[j]);
RunOperators(values[i] - values[j], values[j]);
RunOperators(values[i] - values[j], -values[j]);
RunOperators(values[i] + values[j], values[i] + values[j]);
RunOperators(values[i] + values[j], values[i] - values[j]);
RunOperators(values[i] - values[j], values[i] + values[j]);
RunOperators(values[i] - values[j], values[i] - values[j]);
}
}
}
BOOST_AUTO_TEST_SUITE_END()

View file

@ -254,6 +254,7 @@ BOOST_AUTO_TEST_CASE(test_Get)
BOOST_AUTO_TEST_CASE(test_IsStandard)
{
LOCK(cs_main);
CBasicKeyStore keystore;
CCoinsView coinsDummy;
CCoinsViewCache coins(coinsDummy);

View file

@ -148,7 +148,7 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) {
}
pcursor->Next();
} catch (std::exception &e) {
return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
return error("%s : Deserialize or I/O error - %s", __func__, e.what());
}
}
delete pcursor;
@ -226,7 +226,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts()
break; // if shutdown requested or finished loading block index
}
} catch (std::exception &e) {
return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
return error("%s : Deserialize or I/O error - %s", __func__, e.what());
}
}
delete pcursor;

View file

@ -473,6 +473,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet)
if (fFromLoadWallet)
{
mapWallet[hash] = wtxIn;
mapWallet[hash].BindWallet(this);
AddToSpends(hash);
}
else
@ -608,7 +609,7 @@ bool CWallet::AddToWalletIfInvolvingMe(const uint256 &hash, const CTransaction&
void CWallet::SyncTransaction(const uint256 &hash, const CTransaction& tx, const CBlock* pblock)
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
if (!AddToWalletIfInvolvingMe(hash, tx, pblock, true))
return; // Not one of ours
@ -946,7 +947,7 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
CBlockIndex* pindex = pindexStart;
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
// no need to read and scan block, if block was created before
// our wallet birthday (as adjusted for block time variability)
@ -981,7 +982,7 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
void CWallet::ReacceptWalletTransactions()
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
{
const uint256& wtxid = item.first;
@ -1076,7 +1077,7 @@ int64_t CWallet::GetBalance() const
{
int64_t nTotal = 0;
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
@ -1092,7 +1093,7 @@ int64_t CWallet::GetUnconfirmedBalance() const
{
int64_t nTotal = 0;
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
@ -1107,7 +1108,7 @@ int64_t CWallet::GetImmatureBalance() const
{
int64_t nTotal = 0;
{
LOCK(cs_wallet);
LOCK2(cs_main, cs_wallet);
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;

View file

@ -352,9 +352,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
CWalletTx wtx;
ssValue >> wtx;
CValidationState state;
if (CheckTransaction(wtx, state) && (wtx.GetHash() == hash) && state.IsValid())
wtx.BindWallet(pwallet);
else
if (!(CheckTransaction(wtx, state) && (wtx.GetHash() == hash) && state.IsValid()))
return false;
if (wtx.nOrderPos == -1)