aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md26
-rw-r--r--REVIEWERS3
-rwxr-xr-xci/test/00_setup_env_native_qt5.sh2
-rw-r--r--configure.ac2
-rwxr-xr-xcontrib/devtools/gen-manpages.py20
-rwxr-xr-xcontrib/macdeploy/macdeployqtplus79
-rw-r--r--depends/packages/boost.mk4
-rw-r--r--doc/bips.md5
-rw-r--r--doc/dependencies.md2
-rw-r--r--src/addrdb.cpp9
-rw-r--r--src/addrman.cpp2
-rw-r--r--src/addrman.h6
-rw-r--r--src/bech32.cpp5
-rw-r--r--src/bench/examples.cpp2
-rw-r--r--src/bitcoin-cli.cpp5
-rw-r--r--src/bitcoin-tx.cpp5
-rw-r--r--src/bitcoin-util.cpp5
-rw-r--r--src/bitcoin-wallet.cpp5
-rw-r--r--src/bitcoind.cpp7
-rw-r--r--src/clientversion.cpp33
-rw-r--r--src/clientversion.h5
-rw-r--r--src/init.cpp19
-rw-r--r--src/init.h3
-rw-r--r--src/net.cpp2
-rw-r--r--src/qt/bitcoinstrings.cpp5
-rw-r--r--src/qt/locale/bitcoin_en.ts21
-rw-r--r--src/qt/locale/bitcoin_en.xlf632
-rw-r--r--src/test/fs_tests.cpp4
-rw-r--r--src/test/fuzz/addrman.cpp2
-rw-r--r--src/test/fuzz/util.cpp2
-rw-r--r--src/test/serialize_tests.cpp12
-rw-r--r--src/util/system.cpp12
-rw-r--r--src/util/system.h2
-rw-r--r--src/wallet/wallet.cpp4
-rw-r--r--src/wallet/walletdb.cpp2
-rw-r--r--src/wallet/walletdb.h1
-rw-r--r--test/README.md2
-rwxr-xr-xtest/functional/feature_addrman.py17
-rwxr-xr-xtest/functional/feature_backwards_compatibility.py283
-rwxr-xr-xtest/functional/feature_dirsymlinks.py24
-rwxr-xr-xtest/functional/test_framework/test_framework.py11
-rwxr-xr-xtest/get_previous_releases.py20
-rwxr-xr-xtest/lint/lint-format-strings.py4
-rw-r--r--test/sanitizer_suppressions/tsan5
-rw-r--r--test/sanitizer_suppressions/ubsan4
45 files changed, 644 insertions, 681 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 59f662ad34..254e610393 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,8 +12,8 @@ revolves around a meritocracy where contributors earn trust from the developer
community over time. Nevertheless, some hierarchy is necessary for practical
purposes. As such, there are repository "maintainers" who are responsible for
merging pull requests, as well as a "lead maintainer" who is responsible for the
-release cycle as well as overall merging, moderation and appointment of
-maintainers.
+[release cycle](/doc/release-process.md) as well as overall merging, moderation
+and appointment of maintainers.
Getting Started
---------------
@@ -189,9 +189,14 @@ in the body of the pull request to indicate tasks are pending.
At this stage, one should expect comments and review from other contributors. You
can add more commits to your pull request by committing them locally and pushing
-to your fork until you have satisfied all feedback.
+to your fork.
-Note: Code review is a burdensome but important part of the development process, and as such, certain types of pull requests are rejected. In general, if the **improvements** do not warrant the **review effort** required, the PR has a high chance of being rejected. It is up to the PR author to convince the reviewers that the changes warrant the review effort, and if reviewers are "Concept NACK'ing" the PR, the author may need to present arguments and/or do research backing their suggested changes.
+You are expected to reply to any review comments before your pull request is
+merged. You may update the code or reject the feedback if you do not agree with
+it, but you should express so in a reply. If there is outstanding feedback and
+you are not actively working on it, your pull request may be closed.
+
+Please refer to the [peer review](#peer-review) section below for more details.
### Squashing Commits
@@ -322,6 +327,14 @@ maintainers take into account the peer review when determining if there is
consensus to merge a pull request (remember that discussions may have been
spread out over GitHub, mailing list and IRC discussions).
+Code review is a burdensome but important part of the development process, and
+as such, certain types of pull requests are rejected. In general, if the
+**improvements** do not warrant the **review effort** required, the PR has a
+high chance of being rejected. It is up to the PR author to convince the
+reviewers that the changes warrant the review effort, and if reviewers are
+"Concept NACK'ing" the PR, the author may need to present arguments and/or do
+research backing their suggested changes.
+
#### Conceptual Review
A review can be a conceptual review, where the reviewer leaves a comment
@@ -422,11 +435,6 @@ https://github.com/bitcoin/bitcoin/pull/16189).
Also see the [backport.py script](
https://github.com/bitcoin-core/bitcoin-maintainer-tools#backport).
-Release Policy
---------------
-
-The project leader is the release manager for each Bitcoin Core release.
-
Copyright
---------
diff --git a/REVIEWERS b/REVIEWERS
index e5dd3c9b91..a4b05f86c0 100644
--- a/REVIEWERS
+++ b/REVIEWERS
@@ -18,12 +18,11 @@
# Maintainers
+# @achow101
# @fanquake
# @hebasto
-# @jonasschnelli
# @laanwj
# @marcofalke
-# @meshcollider
# @sipa
# Docs
diff --git a/ci/test/00_setup_env_native_qt5.sh b/ci/test/00_setup_env_native_qt5.sh
index 568384d662..f8b366e77f 100755
--- a/ci/test/00_setup_env_native_qt5.sh
+++ b/ci/test/00_setup_env_native_qt5.sh
@@ -14,6 +14,6 @@ export TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude fe
export RUN_UNIT_TESTS_SEQUENTIAL="true"
export RUN_UNIT_TESTS="false"
export GOAL="install"
-export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.2 v0.16.3 v0.17.2 v0.18.1 v0.19.1 v0.20.1"
+export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.2 v0.16.3 v0.17.2 v0.18.1 v0.19.1 v0.20.1 v0.21.0 v22.0"
export BITCOIN_CONFIG="--enable-zmq --with-libs=no --with-gui=qt5 --enable-reduce-exports \
--enable-debug --disable-fuzz-binary CFLAGS=\"-g0 -O2 -funsigned-char\" CXXFLAGS=\"-g0 -O2 -funsigned-char\" CC=gcc-8 CXX=g++-8"
diff --git a/configure.ac b/configure.ac
index 222fa94946..ae21dd9a7c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -100,7 +100,7 @@ dnl sets RPATH for any directories in the dynamic linker search path.
dnl See more: https://wiki.debian.org/RpathIssue
LT_PREREQ([1.5.2])
dnl Libtool init checks.
-LT_INIT([pic-only])
+LT_INIT([pic-only win32-dll])
dnl Check/return PATH for base programs.
AC_PATH_TOOL([AR], [ar])
diff --git a/contrib/devtools/gen-manpages.py b/contrib/devtools/gen-manpages.py
index 05f613da38..26612cc444 100755
--- a/contrib/devtools/gen-manpages.py
+++ b/contrib/devtools/gen-manpages.py
@@ -32,7 +32,6 @@ mandir = os.getenv('MANDIR', os.path.join(topdir, 'doc/man'))
# Verify that all the required binaries are usable, and extract copyright
# message in a first pass.
-copyright = None
versions = []
for relpath in BINARIES:
abspath = os.path.join(builddir, relpath)
@@ -42,18 +41,17 @@ for relpath in BINARIES:
print(f'{abspath} not found or not an executable', file=sys.stderr)
sys.exit(1)
# take first line (which must contain version)
- verstr = r.stdout.split('\n')[0]
+ verstr = r.stdout.splitlines()[0]
# last word of line is the actual version e.g. v22.99.0-5c6b3d5b3508
verstr = verstr.split()[-1]
assert verstr.startswith('v')
+ # remaining lines are copyright
+ copyright = r.stdout.split('\n')[1:]
+ assert copyright[0].startswith('Copyright (C)')
- # Only bitcoin-qt prints the copyright message on --version, so store it specifically.
- if relpath == 'src/qt/bitcoin-qt':
- copyright = r.stdout.split('\n')[1:]
+ versions.append((abspath, verstr, copyright))
- versions.append((abspath, verstr))
-
-if any(verstr.endswith('-dirty') for (_, verstr) in versions):
+if any(verstr.endswith('-dirty') for (_, verstr, _) in versions):
print("WARNING: Binaries were built from a dirty tree.")
print('man pages generated from dirty binaries should NOT be committed.')
print('To properly generate man pages, please commit your changes (or discard them), rebuild, then run this script again.')
@@ -61,13 +59,13 @@ if any(verstr.endswith('-dirty') for (_, verstr) in versions):
with tempfile.NamedTemporaryFile('w', suffix='.h2m') as footer:
# Create copyright footer, and write it to a temporary include file.
- assert copyright
+ # Copyright is the same for all binaries, so just use the first.
footer.write('[COPYRIGHT]\n')
- footer.write('\n'.join(copyright).strip())
+ footer.write('\n'.join(versions[0][2]).strip())
footer.flush()
# Call the binaries through help2man to produce a manual page for each of them.
- for (abspath, verstr) in versions:
+ for (abspath, verstr, _) in versions:
outname = os.path.join(mandir, os.path.basename(abspath) + '.1')
print(f'Generating {outname}…')
subprocess.run([help2man, '-N', '--version-string=' + verstr, '--include=' + footer.name, '-o', outname, abspath], check=True)
diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus
index 3b76108034..0455a137f1 100755
--- a/contrib/macdeploy/macdeployqtplus
+++ b/contrib/macdeploy/macdeployqtplus
@@ -16,7 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
-import sys, re, os, shutil, stat, os.path
+import sys, re, os, platform, shutil, stat, subprocess, os.path
from argparse import ArgumentParser
from ds_store import DSStore
from mac_alias import Alias
@@ -244,49 +244,47 @@ def copyFramework(framework: FrameworkInfo, path: str, verbose: int) -> Optional
fromPath = framework.sourceFilePath
toDir = os.path.join(path, framework.destinationDirectory)
toPath = os.path.join(toDir, framework.binaryName)
-
- if not os.path.exists(fromPath):
- raise RuntimeError(f"No file at {fromPath}")
-
- if os.path.exists(toPath):
- return None # Already there
-
- if not os.path.exists(toDir):
- os.makedirs(toDir)
-
- shutil.copy2(fromPath, toPath)
- if verbose:
- print("Copied:", fromPath)
- print(" to:", toPath)
+
+ if framework.isDylib():
+ if not os.path.exists(fromPath):
+ raise RuntimeError(f"No file at {fromPath}")
+
+ if os.path.exists(toPath):
+ return None # Already there
+
+ if not os.path.exists(toDir):
+ os.makedirs(toDir)
+
+ shutil.copy2(fromPath, toPath)
+ if verbose:
+ print("Copied:", fromPath)
+ print(" to:", toPath)
+ else:
+ to_dir = os.path.join(path, "Contents", "Frameworks", framework.frameworkName)
+ if os.path.exists(to_dir):
+ return None # Already there
+
+ from_dir = framework.frameworkPath
+ if not os.path.exists(from_dir):
+ raise RuntimeError(f"No directory at {from_dir}")
+
+ shutil.copytree(from_dir, to_dir, symlinks=True)
+ if verbose:
+ print("Copied:", from_dir)
+ print(" to:", to_dir)
+
+ headers_link = os.path.join(to_dir, "Headers")
+ if os.path.exists(headers_link):
+ os.unlink(headers_link)
+
+ headers_dir = os.path.join(to_dir, framework.binaryDirectory, "Headers")
+ if os.path.exists(headers_dir):
+ shutil.rmtree(headers_dir)
permissions = os.stat(toPath)
if not permissions.st_mode & stat.S_IWRITE:
os.chmod(toPath, permissions.st_mode | stat.S_IWRITE)
- if not framework.isDylib(): # Copy resources for real frameworks
-
- linkfrom = os.path.join(path, "Contents","Frameworks", framework.frameworkName, "Versions", "Current")
- linkto = framework.version
- if not os.path.exists(linkfrom):
- os.symlink(linkto, linkfrom)
- print("Linked:", linkfrom, "->", linkto)
- fromResourcesDir = framework.sourceResourcesDirectory
- if os.path.exists(fromResourcesDir):
- toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
- shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
- if verbose:
- print("Copied resources:", fromResourcesDir)
- print(" to:", toResourcesDir)
- fromContentsDir = framework.sourceVersionContentsDirectory
- if not os.path.exists(fromContentsDir):
- fromContentsDir = framework.sourceContentsDirectory
- if os.path.exists(fromContentsDir):
- toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory)
- shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
- if verbose:
- print("Copied Contents:", fromContentsDir)
- print(" to:", toContentsDir)
-
return toPath
def deployFrameworks(frameworks: List[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo:
@@ -543,6 +541,9 @@ ds.close()
# ------------------------------------------------
+if platform.system() == "Darwin":
+ subprocess.check_call(f"codesign --deep --force --sign - {target}", shell=True)
+
if config.dmg is not None:
print("+ Preparing .dmg disk image +")
diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk
index 11fed2ea13..563848c398 100644
--- a/depends/packages/boost.mk
+++ b/depends/packages/boost.mk
@@ -1,8 +1,8 @@
package=boost
-$(package)_version=1.71.0
+$(package)_version=1.77.0
$(package)_download_path=https://boostorg.jfrog.io/artifactory/main/release/$($(package)_version)/source/
$(package)_file_name=boost_$(subst .,_,$($(package)_version)).tar.bz2
-$(package)_sha256_hash=d73a8da01e8bf8c7eda40b4c84915071a8c8a0df4a6734537ddde4a8580524ee
+$(package)_sha256_hash=fc9f85fc030e233142908241af7a846e60630aa7388de9a5fafb1f3a26840854
define $(package)_stage_cmds
mkdir -p $($(package)_staging_prefix_dir)/include && \
diff --git a/doc/bips.md b/doc/bips.md
index 27adcedd31..0f3f61daf1 100644
--- a/doc/bips.md
+++ b/doc/bips.md
@@ -1,4 +1,4 @@
-BIPs that are implemented by Bitcoin Core (up-to-date up to **v22.0**):
+BIPs that are implemented by Bitcoin Core (up-to-date up to **v23.0**):
* [`BIP 9`](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki): The changes allowing multiple soft-forks to be deployed in parallel have been implemented since **v0.12.1** ([PR #7575](https://github.com/bitcoin/bitcoin/pull/7575))
* [`BIP 11`](https://github.com/bitcoin/bips/blob/master/bip-0011.mediawiki): Multisig outputs are standard since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)).
@@ -42,7 +42,8 @@ BIPs that are implemented by Bitcoin Core (up-to-date up to **v22.0**):
* [`BIP 147`](https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki): NULLDUMMY softfork as of **v0.13.1** ([PR 8636](https://github.com/bitcoin/bitcoin/pull/8636) and [PR 8937](https://github.com/bitcoin/bitcoin/pull/8937)), *buried* since **v0.19.0** ([PR #16060](https://github.com/bitcoin/bitcoin/pull/16060)).
* [`BIP 152`](https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki): Compact block transfer and related optimizations are used as of **v0.13.0** ([PR 8068](https://github.com/bitcoin/bitcoin/pull/8068)).
* [`BIP 155`](https://github.com/bitcoin/bips/blob/master/bip-0155.mediawiki): The 'addrv2' and 'sendaddrv2' messages which enable relay of Tor V3 addresses (and other networks) are supported as of **v0.21.0** ([PR 19954](https://github.com/bitcoin/bitcoin/pull/19954)).
-* [`BIP 158`](https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki): Compact Block Filters for Light Clients can be indexed as of **v0.19.0** ([PR #14121](https://github.com/bitcoin/bitcoin/pull/14121)).
+* [`BIP 157`](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki)
+ [`158`](https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki): Compact Block Filters for Light Clients can be indexed as of **v0.19.0** ([PR #14121](https://github.com/bitcoin/bitcoin/pull/14121)) and served to peers on the P2P network as of **v0.21.0** ([PR #16442](https://github.com/bitcoin/bitcoin/pull/16442)).
* [`BIP 159`](https://github.com/bitcoin/bips/blob/master/bip-0159.mediawiki): The `NODE_NETWORK_LIMITED` service bit is signalled as of **v0.16.0** ([PR 11740](https://github.com/bitcoin/bitcoin/pull/11740)), and such nodes are connected to as of **v0.17.0** ([PR 10387](https://github.com/bitcoin/bitcoin/pull/10387)).
* [`BIP 173`](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki): Bech32 addresses for native Segregated Witness outputs are supported as of **v0.16.0** ([PR 11167](https://github.com/bitcoin/bitcoin/pull/11167)). Bech32 addresses are generated by default as of **v0.20.0** ([PR 16884](https://github.com/bitcoin/bitcoin/pull/16884)).
* [`BIP 174`](https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki): RPCs to operate on Partially Signed Bitcoin Transactions (PSBT) are present as of **v0.17.0** ([PR 13557](https://github.com/bitcoin/bitcoin/pull/13557)).
diff --git a/doc/dependencies.md b/doc/dependencies.md
index 63315cdcc2..99ff26f457 100644
--- a/doc/dependencies.md
+++ b/doc/dependencies.md
@@ -6,7 +6,7 @@ These are the dependencies currently used by Bitcoin Core. You can find instruct
| Dependency | Version used | Minimum required | CVEs | Shared | [Bundled Qt library](https://doc.qt.io/qt-5/configure-options.html#third-party-libraries) |
| --- | --- | --- | --- | --- | --- |
| Berkeley DB | [4.8.30](https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html) | 4.8.x | No | | |
-| Boost | [1.71.0](https://www.boost.org/users/download/) | [1.64.0](https://github.com/bitcoin/bitcoin/pull/22320) | No | | |
+| Boost | [1.77.0](https://www.boost.org/users/download/) | [1.64.0](https://github.com/bitcoin/bitcoin/pull/22320) | No | | |
| Clang<sup>[ \* ](#note1)</sup> | | [7.0](https://releases.llvm.org/download.html) (C++17 & std::filesystem support) | | | |
| Fontconfig | [2.12.6](https://www.freedesktop.org/software/fontconfig/release/) | | No | Yes | |
| FreeType | [2.11.0](https://download.savannah.gnu.org/releases/freetype) | | No | | [Yes](https://github.com/bitcoin/bitcoin/blob/master/depends/packages/qt.mk) (Android only) |
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 4f22e688db..0fa8f3c3da 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -197,6 +197,15 @@ std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const A
addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
LogPrintf("Creating peers.dat because the file was not found (%s)\n", fs::quoted(fs::PathToString(path_addr)));
DumpPeerAddresses(args, *addrman);
+ } catch (const InvalidAddrManVersionError&) {
+ if (!RenameOver(path_addr, (fs::path)path_addr + ".bak")) {
+ addrman = nullptr;
+ return strprintf(_("Failed to rename invalid peers.dat file. Please move or delete it and try again."));
+ }
+ // Addrman can be in an inconsistent state after failure, reset it
+ addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
+ LogPrintf("Creating new peers.dat because the file version was not compatible (%s). Original backed up to peers.dat.bak\n", fs::quoted(fs::PathToString(path_addr)));
+ DumpPeerAddresses(args, *addrman);
} catch (const std::exception& e) {
addrman = nullptr;
return strprintf(_("Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start."),
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 3a845b5b6e..f91a979934 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -248,7 +248,7 @@ void AddrManImpl::Unserialize(Stream& s_)
s >> compat;
const uint8_t lowest_compatible = compat - INCOMPATIBILITY_BASE;
if (lowest_compatible > FILE_FORMAT) {
- throw std::ios_base::failure(strprintf(
+ throw InvalidAddrManVersionError(strprintf(
"Unsupported format of addrman database: %u. It is compatible with formats >=%u, "
"but the maximum supported by this version of %s is %u.",
uint8_t{format}, uint8_t{lowest_compatible}, PACKAGE_NAME, uint8_t{FILE_FORMAT}));
diff --git a/src/addrman.h b/src/addrman.h
index 0646ef368d..472282833b 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -17,6 +17,12 @@
#include <utility>
#include <vector>
+class InvalidAddrManVersionError : public std::ios_base::failure
+{
+public:
+ InvalidAddrManVersionError(std::string msg) : std::ios_base::failure(msg) { }
+};
+
class AddrManImpl;
/** Default for -checkaddrman */
diff --git a/src/bech32.cpp b/src/bech32.cpp
index 3cda1dfff5..dce9b2e4cc 100644
--- a/src/bech32.cpp
+++ b/src/bech32.cpp
@@ -284,10 +284,11 @@ inline unsigned char LowerCase(unsigned char c)
}
/** Return indices of invalid characters in a Bech32 string. */
-bool CheckCharacters(const std::string& str, std::vector<int>& errors) {
+bool CheckCharacters(const std::string& str, std::vector<int>& errors)
+{
bool lower = false, upper = false;
for (size_t i = 0; i < str.size(); ++i) {
- unsigned char c = str[i];
+ unsigned char c{(unsigned char)(str[i])};
if (c >= 'a' && c <= 'z') {
if (upper) {
errors.push_back(i);
diff --git a/src/bench/examples.cpp b/src/bench/examples.cpp
index dcd615b9da..72a9922e94 100644
--- a/src/bench/examples.cpp
+++ b/src/bench/examples.cpp
@@ -13,7 +13,7 @@ static void Trig(benchmark::Bench& bench)
{
double d = 0.01;
bench.run([&] {
- sum += sin(d);
+ sum = sum + sin(d);
d += 0.000001;
});
}
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 874e38752a..5523fff3b2 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -133,7 +133,10 @@ static int AppInitRPC(int argc, char* argv[])
}
if (argc < 2 || HelpRequested(gArgs) || gArgs.IsArgSet("-version")) {
std::string strUsage = PACKAGE_NAME " RPC client version " + FormatFullVersion() + "\n";
- if (!gArgs.IsArgSet("-version")) {
+
+ if (gArgs.IsArgSet("-version")) {
+ strUsage += FormatParagraph(LicenseInfo());
+ } else {
strUsage += "\n"
"Usage: bitcoin-cli [options] <command> [params] Send command to " PACKAGE_NAME "\n"
"or: bitcoin-cli [options] -named <command> [name=value]... Send command to " PACKAGE_NAME " (with named arguments)\n"
diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
index ec07114d6e..b297081cab 100644
--- a/src/bitcoin-tx.cpp
+++ b/src/bitcoin-tx.cpp
@@ -102,7 +102,10 @@ static int AppInitRawTx(int argc, char* argv[])
if (argc < 2 || HelpRequested(gArgs) || gArgs.IsArgSet("-version")) {
// First part of help message is specific to this utility
std::string strUsage = PACKAGE_NAME " bitcoin-tx utility version " + FormatFullVersion() + "\n";
- if (!gArgs.IsArgSet("-version")) {
+
+ if (gArgs.IsArgSet("-version")) {
+ strUsage += FormatParagraph(LicenseInfo());
+ } else {
strUsage += "\n"
"Usage: bitcoin-tx [options] <hex-tx> [commands] Update hex-encoded bitcoin transaction\n"
"or: bitcoin-tx [options] -create [commands] Create hex-encoded bitcoin transaction\n"
diff --git a/src/bitcoin-util.cpp b/src/bitcoin-util.cpp
index 973f4f2883..b457e0b354 100644
--- a/src/bitcoin-util.cpp
+++ b/src/bitcoin-util.cpp
@@ -53,7 +53,10 @@ static int AppInitUtil(ArgsManager& args, int argc, char* argv[])
if (HelpRequested(args) || args.IsArgSet("-version")) {
// First part of help message is specific to this utility
std::string strUsage = PACKAGE_NAME " bitcoin-util utility version " + FormatFullVersion() + "\n";
- if (!args.IsArgSet("-version")) {
+
+ if (args.IsArgSet("-version")) {
+ strUsage += FormatParagraph(LicenseInfo());
+ } else {
strUsage += "\n"
"Usage: bitcoin-util [options] [commands] Do stuff\n";
strUsage += "\n" + args.GetHelpMessage();
diff --git a/src/bitcoin-wallet.cpp b/src/bitcoin-wallet.cpp
index ff5485e2da..2f3dd45267 100644
--- a/src/bitcoin-wallet.cpp
+++ b/src/bitcoin-wallet.cpp
@@ -59,7 +59,10 @@ static bool WalletAppInit(ArgsManager& args, int argc, char* argv[])
}
if (argc < 2 || HelpRequested(args) || args.IsArgSet("-version")) {
std::string strUsage = strprintf("%s bitcoin-wallet version", PACKAGE_NAME) + " " + FormatFullVersion() + "\n";
- if (!args.IsArgSet("-version")) {
+
+ if (args.IsArgSet("-version")) {
+ strUsage += FormatParagraph(LicenseInfo());
+ } else {
strUsage += "\n"
"bitcoin-wallet is an offline tool for creating and interacting with " PACKAGE_NAME " wallet files.\n"
"By default bitcoin-wallet will act on wallets in the default mainnet wallet directory in the datadir.\n"
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
index 6432e8849d..9843382682 100644
--- a/src/bitcoind.cpp
+++ b/src/bitcoind.cpp
@@ -126,9 +126,10 @@ static bool AppInit(NodeContext& node, int argc, char* argv[])
if (HelpRequested(args) || args.IsArgSet("-version")) {
std::string strUsage = PACKAGE_NAME " version " + FormatFullVersion() + "\n";
- if (!args.IsArgSet("-version")) {
- strUsage += FormatParagraph(LicenseInfo()) + "\n"
- "\nUsage: bitcoind [options] Start " PACKAGE_NAME "\n"
+ if (args.IsArgSet("-version")) {
+ strUsage += FormatParagraph(LicenseInfo());
+ } else {
+ strUsage += "\nUsage: bitcoind [options] Start " PACKAGE_NAME "\n"
"\n";
strUsage += args.GetHelpMessage();
}
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index 9b65952b02..192e9c52bc 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -3,9 +3,13 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <clientversion.h>
+#include <util/translation.h>
#include <tinyformat.h>
+#include <sstream>
+#include <string>
+#include <vector>
/**
* Name of client reported in the 'version' message. Report the same name
@@ -72,3 +76,32 @@ std::string FormatSubVersion(const std::string& name, int nClientVersion, const
ss << "/";
return ss.str();
}
+
+std::string CopyrightHolders(const std::string& strPrefix)
+{
+ const auto copyright_devs = strprintf(_(COPYRIGHT_HOLDERS).translated, COPYRIGHT_HOLDERS_SUBSTITUTION);
+ std::string strCopyrightHolders = strPrefix + copyright_devs;
+
+ // Make sure Bitcoin Core copyright is not removed by accident
+ if (copyright_devs.find("Bitcoin Core") == std::string::npos) {
+ strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Core developers";
+ }
+ return strCopyrightHolders;
+}
+
+std::string LicenseInfo()
+{
+ const std::string URL_SOURCE_CODE = "<https://github.com/bitcoin/bitcoin>";
+
+ return CopyrightHolders(strprintf(_("Copyright (C) %i-%i").translated, 2009, COPYRIGHT_YEAR) + " ") + "\n" +
+ "\n" +
+ strprintf(_("Please contribute if you find %s useful. "
+ "Visit %s for further information about the software.").translated, PACKAGE_NAME, "<" PACKAGE_URL ">") +
+ "\n" +
+ strprintf(_("The source code is available from %s.").translated, URL_SOURCE_CODE) +
+ "\n" +
+ "\n" +
+ _("This is experimental software.").translated + "\n" +
+ strprintf(_("Distributed under the MIT software license, see the accompanying file %s or %s").translated, "COPYING", "<https://opensource.org/licenses/MIT>") +
+ "\n";
+}
diff --git a/src/clientversion.h b/src/clientversion.h
index a39d96292d..d2efd7dcab 100644
--- a/src/clientversion.h
+++ b/src/clientversion.h
@@ -41,6 +41,11 @@ extern const std::string CLIENT_NAME;
std::string FormatFullVersion();
std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments);
+std::string CopyrightHolders(const std::string& strPrefix);
+
+/** Returns licensing information (for -version) */
+std::string LicenseInfo();
+
#endif // WINDRES_PREPROC
#endif // BITCOIN_CLIENTVERSION_H
diff --git a/src/init.cpp b/src/init.cpp
index 64ed868333..02ea30e28e 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -594,25 +594,6 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddHiddenArgs(hidden_args);
}
-std::string LicenseInfo()
-{
- const std::string URL_SOURCE_CODE = "<https://github.com/bitcoin/bitcoin>";
-
- return CopyrightHolders(strprintf(_("Copyright (C) %i-%i").translated, 2009, COPYRIGHT_YEAR) + " ") + "\n" +
- "\n" +
- strprintf(_("Please contribute if you find %s useful. "
- "Visit %s for further information about the software.").translated,
- PACKAGE_NAME, "<" PACKAGE_URL ">") +
- "\n" +
- strprintf(_("The source code is available from %s.").translated,
- URL_SOURCE_CODE) +
- "\n" +
- "\n" +
- _("This is experimental software.").translated + "\n" +
- strprintf(_("Distributed under the MIT software license, see the accompanying file %s or %s").translated, "COPYING", "<https://opensource.org/licenses/MIT>") +
- "\n";
-}
-
static bool fHaveGenesis = false;
static Mutex g_genesis_wait_mutex;
static std::condition_variable g_genesis_wait_cv;
diff --git a/src/init.h b/src/init.h
index 1292cc1a3a..ddd439f619 100644
--- a/src/init.h
+++ b/src/init.h
@@ -70,7 +70,4 @@ bool AppInitMain(node::NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip
*/
void SetupServerArgs(ArgsManager& argsman);
-/** Returns licensing information (for -version) */
-std::string LicenseInfo();
-
#endif // BITCOIN_INIT_H
diff --git a/src/net.cpp b/src/net.cpp
index d5763ee68b..63e25a71bb 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -2620,7 +2620,7 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
if (connOptions.m_use_addrman_outgoing && !connOptions.m_specified_outgoing.empty()) {
if (m_client_interface) {
m_client_interface->ThreadSafeMessageBox(
- _("Cannot provide specific connections and have addrman find outgoing connections at the same."),
+ _("Cannot provide specific connections and have addrman find outgoing connections at the same time."),
"", CClientUIInterface::MSG_ERROR);
}
return false;
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index 18d2c5a3a3..ba804d6955 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -23,7 +23,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Cannot obtain a lock on data directory %s. %s is probably already running."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Cannot provide specific connections and have addrman find outgoing "
-"connections at the same."),
+"connections at the same time."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Cannot upgrade a non HD split wallet from version %i to version %i without "
"upgrading to support pre-split keypool. Please use version %i or no version "
@@ -32,6 +32,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Distributed under the MIT software license, see the accompanying file %s or "
"%s"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Error loading %s: External signer wallet being loaded without external "
+"signer support compiled"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Error reading %s! All keys read correctly, but transaction data or address "
"book entries might be missing or incorrect."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index 5e515099dd..35d8201877 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -5075,12 +5075,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Cannot provide specific connections and have addrman find outgoing connections at the same.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+5"/>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished"></translation>
</message>
@@ -5090,7 +5085,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
<translation type="unfinished"></translation>
</message>
@@ -5310,7 +5305,17 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+59"/>
+ <location line="-69"/>
+ <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+118"/>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.xlf b/src/qt/locale/bitcoin_en.xlf
index 5b08e984fc..30ee5e4de6 100644
--- a/src/qt/locale/bitcoin_en.xlf
+++ b/src/qt/locale/bitcoin_en.xlf
@@ -4279,636 +4279,640 @@ Go to File &gt; Open Wallet to load a wallet.
<context-group purpose="location"><context context-type="linenumber">22</context></context-group>
</trans-unit>
<trans-unit id="_msg942">
- <source xml:space="preserve">Cannot provide specific connections and have addrman find outgoing connections at the same.</source>
- <context-group purpose="location"><context context-type="linenumber">24</context></context-group>
- </trans-unit>
- <trans-unit id="_msg943">
<source xml:space="preserve">Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<context-group purpose="location"><context context-type="linenumber">27</context></context-group>
</trans-unit>
- <trans-unit id="_msg944">
+ <trans-unit id="_msg943">
<source xml:space="preserve">Distributed under the MIT software license, see the accompanying file %s or %s</source>
<context-group purpose="location"><context context-type="linenumber">31</context></context-group>
</trans-unit>
- <trans-unit id="_msg945">
+ <trans-unit id="_msg944">
<source xml:space="preserve">Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg946">
+ <trans-unit id="_msg945">
<source xml:space="preserve">Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <context-group purpose="location"><context context-type="linenumber">37</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">40</context></context-group>
</trans-unit>
- <trans-unit id="_msg947">
+ <trans-unit id="_msg946">
<source xml:space="preserve">Error: Dumpfile format record is incorrect. Got &quot;%s&quot;, expected &quot;format&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">40</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">43</context></context-group>
</trans-unit>
- <trans-unit id="_msg948">
+ <trans-unit id="_msg947">
<source xml:space="preserve">Error: Dumpfile identifier record is incorrect. Got &quot;%s&quot;, expected &quot;%s&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">42</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">45</context></context-group>
</trans-unit>
- <trans-unit id="_msg949">
+ <trans-unit id="_msg948">
<source xml:space="preserve">Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <context-group purpose="location"><context context-type="linenumber">44</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg950">
+ <trans-unit id="_msg949">
<source xml:space="preserve">Error: Legacy wallets only support the &quot;legacy&quot;, &quot;p2sh-segwit&quot;, and &quot;bech32&quot; address types</source>
- <context-group purpose="location"><context context-type="linenumber">47</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg951">
+ <trans-unit id="_msg950">
<source xml:space="preserve">Error: Listening for incoming connections failed (listen returned error %s)</source>
- <context-group purpose="location"><context context-type="linenumber">50</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg952">
+ <trans-unit id="_msg951">
<source xml:space="preserve">Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable -fallbackfee.</source>
- <context-group purpose="location"><context context-type="linenumber">52</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">55</context></context-group>
</trans-unit>
- <trans-unit id="_msg953">
+ <trans-unit id="_msg952">
<source xml:space="preserve">File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <context-group purpose="location"><context context-type="linenumber">55</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg954">
+ <trans-unit id="_msg953">
<source xml:space="preserve">Invalid amount for -maxtxfee=&lt;amount&gt;: &apos;%s&apos; (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <context-group purpose="location"><context context-type="linenumber">58</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">61</context></context-group>
</trans-unit>
- <trans-unit id="_msg955">
+ <trans-unit id="_msg954">
<source xml:space="preserve">Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <context-group purpose="location"><context context-type="linenumber">61</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
- <trans-unit id="_msg956">
+ <trans-unit id="_msg955">
<source xml:space="preserve">More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
- <context-group purpose="location"><context context-type="linenumber">65</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">68</context></context-group>
</trans-unit>
- <trans-unit id="_msg957">
+ <trans-unit id="_msg956">
<source xml:space="preserve">No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <context-group purpose="location"><context context-type="linenumber">68</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">71</context></context-group>
</trans-unit>
- <trans-unit id="_msg958">
+ <trans-unit id="_msg957">
<source xml:space="preserve">No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <context-group purpose="location"><context context-type="linenumber">71</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg959">
+ <trans-unit id="_msg958">
<source xml:space="preserve">No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <context-group purpose="location"><context context-type="linenumber">73</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg960">
+ <trans-unit id="_msg959">
<source xml:space="preserve">Please check that your computer&apos;s date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <context-group purpose="location"><context context-type="linenumber">76</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg961">
+ <trans-unit id="_msg960">
<source xml:space="preserve">Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <context-group purpose="location"><context context-type="linenumber">79</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">82</context></context-group>
</trans-unit>
- <trans-unit id="_msg962">
+ <trans-unit id="_msg961">
<source xml:space="preserve">Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <context-group purpose="location"><context context-type="linenumber">82</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
- <trans-unit id="_msg963">
+ <trans-unit id="_msg962">
<source xml:space="preserve">Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <context-group purpose="location"><context context-type="linenumber">84</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">87</context></context-group>
</trans-unit>
- <trans-unit id="_msg964">
+ <trans-unit id="_msg963">
<source xml:space="preserve">SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <context-group purpose="location"><context context-type="linenumber">87</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg965">
+ <trans-unit id="_msg964">
<source xml:space="preserve">The block database contains a block which appears to be from the future. This may be due to your computer&apos;s date and time being set incorrectly. Only rebuild the block database if you are sure that your computer&apos;s date and time are correct</source>
- <context-group purpose="location"><context context-type="linenumber">93</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg966">
+ <trans-unit id="_msg965">
<source xml:space="preserve">The block index db contains a legacy &apos;txindex&apos;. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <context-group purpose="location"><context context-type="linenumber">98</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">101</context></context-group>
</trans-unit>
- <trans-unit id="_msg967">
+ <trans-unit id="_msg966">
<source xml:space="preserve">The transaction amount is too small to send after the fee has been deducted</source>
- <context-group purpose="location"><context context-type="linenumber">102</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">105</context></context-group>
</trans-unit>
- <trans-unit id="_msg968">
+ <trans-unit id="_msg967">
<source xml:space="preserve">This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
- <context-group purpose="location"><context context-type="linenumber">104</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">107</context></context-group>
</trans-unit>
- <trans-unit id="_msg969">
+ <trans-unit id="_msg968">
<source xml:space="preserve">This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">111</context></context-group>
</trans-unit>
- <trans-unit id="_msg970">
+ <trans-unit id="_msg969">
<source xml:space="preserve">This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <context-group purpose="location"><context context-type="linenumber">111</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg971">
+ <trans-unit id="_msg970">
<source xml:space="preserve">This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <context-group purpose="location"><context context-type="linenumber">114</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">117</context></context-group>
</trans-unit>
- <trans-unit id="_msg972">
+ <trans-unit id="_msg971">
<source xml:space="preserve">This is the transaction fee you may pay when fee estimates are not available.</source>
- <context-group purpose="location"><context context-type="linenumber">117</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg973">
+ <trans-unit id="_msg972">
<source xml:space="preserve">Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <context-group purpose="location"><context context-type="linenumber">119</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg974">
+ <trans-unit id="_msg973">
<source xml:space="preserve">Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
- <context-group purpose="location"><context context-type="linenumber">122</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg975">
+ <trans-unit id="_msg974">
<source xml:space="preserve">Unknown wallet file format &quot;%s&quot; provided. Please provide one of &quot;bdb&quot; or &quot;sqlite&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">125</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg976">
+ <trans-unit id="_msg975">
<source xml:space="preserve">Warning: Dumpfile wallet format &quot;%s&quot; does not match command line specified format &quot;%s&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">128</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
</trans-unit>
- <trans-unit id="_msg977">
+ <trans-unit id="_msg976">
<source xml:space="preserve">Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg978">
+ <trans-unit id="_msg977">
<source xml:space="preserve">Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <context-group purpose="location"><context context-type="linenumber">133</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">136</context></context-group>
</trans-unit>
- <trans-unit id="_msg979">
+ <trans-unit id="_msg978">
<source xml:space="preserve">Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <context-group purpose="location"><context context-type="linenumber">136</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg980">
+ <trans-unit id="_msg979">
<source xml:space="preserve">You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <context-group purpose="location"><context context-type="linenumber">139</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">142</context></context-group>
</trans-unit>
- <trans-unit id="_msg981">
+ <trans-unit id="_msg980">
<source xml:space="preserve">%s is set very high!</source>
- <context-group purpose="location"><context context-type="linenumber">142</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
- <trans-unit id="_msg982">
+ <trans-unit id="_msg981">
<source xml:space="preserve">-maxmempool must be at least %d MB</source>
- <context-group purpose="location"><context context-type="linenumber">143</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg983">
+ <trans-unit id="_msg982">
<source xml:space="preserve">A fatal internal error occurred, see debug.log for details</source>
- <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg984">
+ <trans-unit id="_msg983">
<source xml:space="preserve">Cannot resolve -%s address: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg985">
+ <trans-unit id="_msg984">
<source xml:space="preserve">Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">149</context></context-group>
</trans-unit>
- <trans-unit id="_msg986">
+ <trans-unit id="_msg985">
<source xml:space="preserve">Cannot set -peerblockfilters without -blockfilterindex.</source>
- <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg987">
+ <trans-unit id="_msg986">
<source xml:space="preserve">Cannot write to data directory &apos;%s&apos;; check permissions.</source>
- <context-group purpose="location"><context context-type="linenumber">148</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">151</context></context-group>
</trans-unit>
- <trans-unit id="_msg988">
+ <trans-unit id="_msg987">
<source xml:space="preserve">The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <context-group purpose="location"><context context-type="linenumber">90</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">93</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg988">
+ <source xml:space="preserve">Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
+ <context-group purpose="location"><context context-type="linenumber">24</context></context-group>
</trans-unit>
<trans-unit id="_msg989">
- <source xml:space="preserve">Config setting for %s only applied on %s network when in [%s] section.</source>
- <context-group purpose="location"><context context-type="linenumber">149</context></context-group>
+ <source xml:space="preserve">Error loading %s: External signer wallet being loaded without external signer support compiled</source>
+ <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
</trans-unit>
<trans-unit id="_msg990">
- <source xml:space="preserve">Copyright (C) %i-%i</source>
- <context-group purpose="location"><context context-type="linenumber">150</context></context-group>
+ <source xml:space="preserve">Config setting for %s only applied on %s network when in [%s] section.</source>
+ <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
</trans-unit>
<trans-unit id="_msg991">
- <source xml:space="preserve">Corrupted block database detected</source>
- <context-group purpose="location"><context context-type="linenumber">151</context></context-group>
+ <source xml:space="preserve">Copyright (C) %i-%i</source>
+ <context-group purpose="location"><context context-type="linenumber">153</context></context-group>
</trans-unit>
<trans-unit id="_msg992">
- <source xml:space="preserve">Could not find asmap file %s</source>
- <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
+ <source xml:space="preserve">Corrupted block database detected</source>
+ <context-group purpose="location"><context context-type="linenumber">154</context></context-group>
</trans-unit>
<trans-unit id="_msg993">
- <source xml:space="preserve">Could not parse asmap file %s</source>
- <context-group purpose="location"><context context-type="linenumber">153</context></context-group>
+ <source xml:space="preserve">Could not find asmap file %s</source>
+ <context-group purpose="location"><context context-type="linenumber">155</context></context-group>
</trans-unit>
<trans-unit id="_msg994">
- <source xml:space="preserve">Disk space is too low!</source>
- <context-group purpose="location"><context context-type="linenumber">154</context></context-group>
+ <source xml:space="preserve">Could not parse asmap file %s</source>
+ <context-group purpose="location"><context context-type="linenumber">156</context></context-group>
</trans-unit>
<trans-unit id="_msg995">
- <source xml:space="preserve">Do you want to rebuild the block database now?</source>
- <context-group purpose="location"><context context-type="linenumber">155</context></context-group>
+ <source xml:space="preserve">Disk space is too low!</source>
+ <context-group purpose="location"><context context-type="linenumber">157</context></context-group>
</trans-unit>
<trans-unit id="_msg996">
- <source xml:space="preserve">Done loading</source>
- <context-group purpose="location"><context context-type="linenumber">156</context></context-group>
+ <source xml:space="preserve">Do you want to rebuild the block database now?</source>
+ <context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
<trans-unit id="_msg997">
- <source xml:space="preserve">Dump file %s does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">157</context></context-group>
+ <source xml:space="preserve">Done loading</source>
+ <context-group purpose="location"><context context-type="linenumber">159</context></context-group>
</trans-unit>
<trans-unit id="_msg998">
- <source xml:space="preserve">Error creating %s</source>
- <context-group purpose="location"><context context-type="linenumber">158</context></context-group>
+ <source xml:space="preserve">Dump file %s does not exist.</source>
+ <context-group purpose="location"><context context-type="linenumber">160</context></context-group>
</trans-unit>
<trans-unit id="_msg999">
- <source xml:space="preserve">Error initializing block database</source>
- <context-group purpose="location"><context context-type="linenumber">159</context></context-group>
+ <source xml:space="preserve">Error creating %s</source>
+ <context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
<trans-unit id="_msg1000">
- <source xml:space="preserve">Error initializing wallet database environment %s!</source>
- <context-group purpose="location"><context context-type="linenumber">160</context></context-group>
+ <source xml:space="preserve">Error initializing block database</source>
+ <context-group purpose="location"><context context-type="linenumber">162</context></context-group>
</trans-unit>
<trans-unit id="_msg1001">
- <source xml:space="preserve">Error loading %s</source>
- <context-group purpose="location"><context context-type="linenumber">161</context></context-group>
+ <source xml:space="preserve">Error initializing wallet database environment %s!</source>
+ <context-group purpose="location"><context context-type="linenumber">163</context></context-group>
</trans-unit>
<trans-unit id="_msg1002">
- <source xml:space="preserve">Error loading %s: Private keys can only be disabled during creation</source>
- <context-group purpose="location"><context context-type="linenumber">162</context></context-group>
+ <source xml:space="preserve">Error loading %s</source>
+ <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
<trans-unit id="_msg1003">
- <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
- <context-group purpose="location"><context context-type="linenumber">163</context></context-group>
+ <source xml:space="preserve">Error loading %s: Private keys can only be disabled during creation</source>
+ <context-group purpose="location"><context context-type="linenumber">165</context></context-group>
</trans-unit>
<trans-unit id="_msg1004">
- <source xml:space="preserve">Error loading %s: Wallet requires newer version of %s</source>
- <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
+ <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
+ <context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
<trans-unit id="_msg1005">
- <source xml:space="preserve">Error loading block database</source>
- <context-group purpose="location"><context context-type="linenumber">165</context></context-group>
+ <source xml:space="preserve">Error loading %s: Wallet requires newer version of %s</source>
+ <context-group purpose="location"><context context-type="linenumber">167</context></context-group>
</trans-unit>
<trans-unit id="_msg1006">
- <source xml:space="preserve">Error opening block database</source>
- <context-group purpose="location"><context context-type="linenumber">166</context></context-group>
+ <source xml:space="preserve">Error loading block database</source>
+ <context-group purpose="location"><context context-type="linenumber">168</context></context-group>
</trans-unit>
<trans-unit id="_msg1007">
- <source xml:space="preserve">Error reading from database, shutting down.</source>
- <context-group purpose="location"><context context-type="linenumber">167</context></context-group>
+ <source xml:space="preserve">Error opening block database</source>
+ <context-group purpose="location"><context context-type="linenumber">169</context></context-group>
</trans-unit>
<trans-unit id="_msg1008">
- <source xml:space="preserve">Error reading next record from wallet database</source>
- <context-group purpose="location"><context context-type="linenumber">168</context></context-group>
+ <source xml:space="preserve">Error reading from database, shutting down.</source>
+ <context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
<trans-unit id="_msg1009">
- <source xml:space="preserve">Error upgrading chainstate database</source>
- <context-group purpose="location"><context context-type="linenumber">169</context></context-group>
+ <source xml:space="preserve">Error reading next record from wallet database</source>
+ <context-group purpose="location"><context context-type="linenumber">171</context></context-group>
</trans-unit>
<trans-unit id="_msg1010">
- <source xml:space="preserve">Error: Couldn&apos;t create cursor into database</source>
- <context-group purpose="location"><context context-type="linenumber">170</context></context-group>
+ <source xml:space="preserve">Error upgrading chainstate database</source>
+ <context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
<trans-unit id="_msg1011">
- <source xml:space="preserve">Error: Disk space is low for %s</source>
- <context-group purpose="location"><context context-type="linenumber">171</context></context-group>
+ <source xml:space="preserve">Error: Couldn&apos;t create cursor into database</source>
+ <context-group purpose="location"><context context-type="linenumber">173</context></context-group>
</trans-unit>
<trans-unit id="_msg1012">
- <source xml:space="preserve">Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <context-group purpose="location"><context context-type="linenumber">172</context></context-group>
+ <source xml:space="preserve">Error: Disk space is low for %s</source>
+ <context-group purpose="location"><context context-type="linenumber">174</context></context-group>
</trans-unit>
<trans-unit id="_msg1013">
- <source xml:space="preserve">Error: Got key that was not hex: %s</source>
- <context-group purpose="location"><context context-type="linenumber">173</context></context-group>
+ <source xml:space="preserve">Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <context-group purpose="location"><context context-type="linenumber">175</context></context-group>
</trans-unit>
<trans-unit id="_msg1014">
- <source xml:space="preserve">Error: Got value that was not hex: %s</source>
- <context-group purpose="location"><context context-type="linenumber">174</context></context-group>
+ <source xml:space="preserve">Error: Got key that was not hex: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
<trans-unit id="_msg1015">
- <source xml:space="preserve">Error: Keypool ran out, please call keypoolrefill first</source>
- <context-group purpose="location"><context context-type="linenumber">175</context></context-group>
+ <source xml:space="preserve">Error: Got value that was not hex: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">177</context></context-group>
</trans-unit>
<trans-unit id="_msg1016">
- <source xml:space="preserve">Error: Missing checksum</source>
- <context-group purpose="location"><context context-type="linenumber">176</context></context-group>
+ <source xml:space="preserve">Error: Keypool ran out, please call keypoolrefill first</source>
+ <context-group purpose="location"><context context-type="linenumber">178</context></context-group>
</trans-unit>
<trans-unit id="_msg1017">
- <source xml:space="preserve">Error: No %s addresses available.</source>
- <context-group purpose="location"><context context-type="linenumber">177</context></context-group>
+ <source xml:space="preserve">Error: Missing checksum</source>
+ <context-group purpose="location"><context context-type="linenumber">179</context></context-group>
</trans-unit>
<trans-unit id="_msg1018">
- <source xml:space="preserve">Error: Unable to parse version %u as a uint32_t</source>
- <context-group purpose="location"><context context-type="linenumber">178</context></context-group>
+ <source xml:space="preserve">Error: No %s addresses available.</source>
+ <context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
<trans-unit id="_msg1019">
- <source xml:space="preserve">Error: Unable to write record to new wallet</source>
- <context-group purpose="location"><context context-type="linenumber">179</context></context-group>
+ <source xml:space="preserve">Error: Unable to parse version %u as a uint32_t</source>
+ <context-group purpose="location"><context context-type="linenumber">181</context></context-group>
</trans-unit>
<trans-unit id="_msg1020">
- <source xml:space="preserve">Failed to listen on any port. Use -listen=0 if you want this.</source>
- <context-group purpose="location"><context context-type="linenumber">180</context></context-group>
+ <source xml:space="preserve">Error: Unable to write record to new wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">182</context></context-group>
</trans-unit>
<trans-unit id="_msg1021">
- <source xml:space="preserve">Failed to rescan the wallet during initialization</source>
- <context-group purpose="location"><context context-type="linenumber">181</context></context-group>
+ <source xml:space="preserve">Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
<trans-unit id="_msg1022">
- <source xml:space="preserve">Failed to verify database</source>
- <context-group purpose="location"><context context-type="linenumber">182</context></context-group>
+ <source xml:space="preserve">Failed to rescan the wallet during initialization</source>
+ <context-group purpose="location"><context context-type="linenumber">184</context></context-group>
</trans-unit>
<trans-unit id="_msg1023">
- <source xml:space="preserve">Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <context-group purpose="location"><context context-type="linenumber">183</context></context-group>
+ <source xml:space="preserve">Failed to verify database</source>
+ <context-group purpose="location"><context context-type="linenumber">185</context></context-group>
</trans-unit>
<trans-unit id="_msg1024">
- <source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
- <context-group purpose="location"><context context-type="linenumber">184</context></context-group>
+ <source xml:space="preserve">Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <context-group purpose="location"><context context-type="linenumber">186</context></context-group>
</trans-unit>
<trans-unit id="_msg1025">
- <source xml:space="preserve">Importing…</source>
- <context-group purpose="location"><context context-type="linenumber">185</context></context-group>
+ <source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
+ <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
<trans-unit id="_msg1026">
- <source xml:space="preserve">Incorrect or no genesis block found. Wrong datadir for network?</source>
- <context-group purpose="location"><context context-type="linenumber">186</context></context-group>
+ <source xml:space="preserve">Importing…</source>
+ <context-group purpose="location"><context context-type="linenumber">188</context></context-group>
</trans-unit>
<trans-unit id="_msg1027">
- <source xml:space="preserve">Initialization sanity check failed. %s is shutting down.</source>
- <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
+ <source xml:space="preserve">Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <context-group purpose="location"><context context-type="linenumber">189</context></context-group>
</trans-unit>
<trans-unit id="_msg1028">
- <source xml:space="preserve">Input not found or already spent</source>
- <context-group purpose="location"><context context-type="linenumber">188</context></context-group>
+ <source xml:space="preserve">Initialization sanity check failed. %s is shutting down.</source>
+ <context-group purpose="location"><context context-type="linenumber">190</context></context-group>
</trans-unit>
<trans-unit id="_msg1029">
- <source xml:space="preserve">Insufficient funds</source>
- <context-group purpose="location"><context context-type="linenumber">189</context></context-group>
+ <source xml:space="preserve">Input not found or already spent</source>
+ <context-group purpose="location"><context context-type="linenumber">191</context></context-group>
</trans-unit>
<trans-unit id="_msg1030">
- <source xml:space="preserve">Invalid -i2psam address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">190</context></context-group>
+ <source xml:space="preserve">Insufficient funds</source>
+ <context-group purpose="location"><context context-type="linenumber">192</context></context-group>
</trans-unit>
<trans-unit id="_msg1031">
- <source xml:space="preserve">Invalid -onion address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">191</context></context-group>
+ <source xml:space="preserve">Invalid -i2psam address or hostname: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">193</context></context-group>
</trans-unit>
<trans-unit id="_msg1032">
- <source xml:space="preserve">Invalid -proxy address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">192</context></context-group>
+ <source xml:space="preserve">Invalid -onion address or hostname: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
</trans-unit>
<trans-unit id="_msg1033">
- <source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">193</context></context-group>
+ <source xml:space="preserve">Invalid -proxy address or hostname: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
</trans-unit>
<trans-unit id="_msg1034">
- <source xml:space="preserve">Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
+ <source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">196</context></context-group>
</trans-unit>
<trans-unit id="_msg1035">
- <source xml:space="preserve">Invalid amount for -discardfee=&lt;amount&gt;: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
+ <source xml:space="preserve">Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
<trans-unit id="_msg1036">
- <source xml:space="preserve">Invalid amount for -fallbackfee=&lt;amount&gt;: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">196</context></context-group>
+ <source xml:space="preserve">Invalid amount for -discardfee=&lt;amount&gt;: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">198</context></context-group>
</trans-unit>
<trans-unit id="_msg1037">
- <source xml:space="preserve">Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
- <context-group purpose="location"><context context-type="linenumber">197</context></context-group>
+ <source xml:space="preserve">Invalid amount for -fallbackfee=&lt;amount&gt;: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">199</context></context-group>
</trans-unit>
<trans-unit id="_msg1038">
- <source xml:space="preserve">Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">198</context></context-group>
+ <source xml:space="preserve">Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
+ <context-group purpose="location"><context context-type="linenumber">200</context></context-group>
</trans-unit>
<trans-unit id="_msg1039">
- <source xml:space="preserve">Loading P2P addresses…</source>
- <context-group purpose="location"><context context-type="linenumber">199</context></context-group>
+ <source xml:space="preserve">Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
<trans-unit id="_msg1040">
- <source xml:space="preserve">Loading banlist…</source>
- <context-group purpose="location"><context context-type="linenumber">200</context></context-group>
+ <source xml:space="preserve">Loading P2P addresses…</source>
+ <context-group purpose="location"><context context-type="linenumber">202</context></context-group>
</trans-unit>
<trans-unit id="_msg1041">
- <source xml:space="preserve">Loading block index…</source>
- <context-group purpose="location"><context context-type="linenumber">201</context></context-group>
+ <source xml:space="preserve">Loading banlist…</source>
+ <context-group purpose="location"><context context-type="linenumber">203</context></context-group>
</trans-unit>
<trans-unit id="_msg1042">
- <source xml:space="preserve">Loading wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">202</context></context-group>
+ <source xml:space="preserve">Loading block index…</source>
+ <context-group purpose="location"><context context-type="linenumber">204</context></context-group>
</trans-unit>
<trans-unit id="_msg1043">
- <source xml:space="preserve">Missing amount</source>
- <context-group purpose="location"><context context-type="linenumber">203</context></context-group>
+ <source xml:space="preserve">Loading wallet…</source>
+ <context-group purpose="location"><context context-type="linenumber">205</context></context-group>
</trans-unit>
<trans-unit id="_msg1044">
- <source xml:space="preserve">Missing solving data for estimating transaction size</source>
- <context-group purpose="location"><context context-type="linenumber">204</context></context-group>
+ <source xml:space="preserve">Missing amount</source>
+ <context-group purpose="location"><context context-type="linenumber">206</context></context-group>
</trans-unit>
<trans-unit id="_msg1045">
- <source xml:space="preserve">Need to specify a port with -whitebind: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">205</context></context-group>
+ <source xml:space="preserve">Missing solving data for estimating transaction size</source>
+ <context-group purpose="location"><context context-type="linenumber">207</context></context-group>
</trans-unit>
<trans-unit id="_msg1046">
- <source xml:space="preserve">No addresses available</source>
- <context-group purpose="location"><context context-type="linenumber">206</context></context-group>
+ <source xml:space="preserve">Need to specify a port with -whitebind: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
<trans-unit id="_msg1047">
- <source xml:space="preserve">No proxy server specified. Use -proxy=&lt;ip&gt; or -proxy=&lt;ip:port&gt;.</source>
- <context-group purpose="location"><context context-type="linenumber">207</context></context-group>
+ <source xml:space="preserve">No addresses available</source>
+ <context-group purpose="location"><context context-type="linenumber">209</context></context-group>
</trans-unit>
<trans-unit id="_msg1048">
- <source xml:space="preserve">Not enough file descriptors available.</source>
- <context-group purpose="location"><context context-type="linenumber">208</context></context-group>
+ <source xml:space="preserve">No proxy server specified. Use -proxy=&lt;ip&gt; or -proxy=&lt;ip:port&gt;.</source>
+ <context-group purpose="location"><context context-type="linenumber">210</context></context-group>
</trans-unit>
<trans-unit id="_msg1049">
- <source xml:space="preserve">Prune cannot be configured with a negative value.</source>
- <context-group purpose="location"><context context-type="linenumber">209</context></context-group>
+ <source xml:space="preserve">Not enough file descriptors available.</source>
+ <context-group purpose="location"><context context-type="linenumber">211</context></context-group>
</trans-unit>
<trans-unit id="_msg1050">
- <source xml:space="preserve">Prune mode is incompatible with -coinstatsindex.</source>
- <context-group purpose="location"><context context-type="linenumber">210</context></context-group>
+ <source xml:space="preserve">Prune cannot be configured with a negative value.</source>
+ <context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
<trans-unit id="_msg1051">
- <source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
- <context-group purpose="location"><context context-type="linenumber">211</context></context-group>
+ <source xml:space="preserve">Prune mode is incompatible with -coinstatsindex.</source>
+ <context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
<trans-unit id="_msg1052">
- <source xml:space="preserve">Pruning blockstore…</source>
- <context-group purpose="location"><context context-type="linenumber">212</context></context-group>
+ <source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
+ <context-group purpose="location"><context context-type="linenumber">214</context></context-group>
</trans-unit>
<trans-unit id="_msg1053">
- <source xml:space="preserve">Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <context-group purpose="location"><context context-type="linenumber">213</context></context-group>
+ <source xml:space="preserve">Pruning blockstore…</source>
+ <context-group purpose="location"><context context-type="linenumber">215</context></context-group>
</trans-unit>
<trans-unit id="_msg1054">
- <source xml:space="preserve">Replaying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">214</context></context-group>
+ <source xml:space="preserve">Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <context-group purpose="location"><context context-type="linenumber">216</context></context-group>
</trans-unit>
<trans-unit id="_msg1055">
- <source xml:space="preserve">Rescanning…</source>
- <context-group purpose="location"><context context-type="linenumber">215</context></context-group>
+ <source xml:space="preserve">Replaying blocks…</source>
+ <context-group purpose="location"><context context-type="linenumber">217</context></context-group>
</trans-unit>
<trans-unit id="_msg1056">
- <source xml:space="preserve">SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <context-group purpose="location"><context context-type="linenumber">216</context></context-group>
+ <source xml:space="preserve">Rescanning…</source>
+ <context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
<trans-unit id="_msg1057">
- <source xml:space="preserve">SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <context-group purpose="location"><context context-type="linenumber">217</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">219</context></context-group>
</trans-unit>
<trans-unit id="_msg1058">
- <source xml:space="preserve">SQLiteDatabase: Failed to read database verification error: %s</source>
- <context-group purpose="location"><context context-type="linenumber">218</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">220</context></context-group>
</trans-unit>
<trans-unit id="_msg1059">
- <source xml:space="preserve">SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <context-group purpose="location"><context context-type="linenumber">219</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Failed to read database verification error: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">221</context></context-group>
</trans-unit>
<trans-unit id="_msg1060">
- <source xml:space="preserve">Section [%s] is not recognized.</source>
- <context-group purpose="location"><context context-type="linenumber">220</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
<trans-unit id="_msg1061">
- <source xml:space="preserve">Signing transaction failed</source>
- <context-group purpose="location"><context context-type="linenumber">221</context></context-group>
+ <source xml:space="preserve">Section [%s] is not recognized.</source>
+ <context-group purpose="location"><context context-type="linenumber">223</context></context-group>
</trans-unit>
<trans-unit id="_msg1062">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; does not exist</source>
- <context-group purpose="location"><context context-type="linenumber">222</context></context-group>
+ <source xml:space="preserve">Signing transaction failed</source>
+ <context-group purpose="location"><context context-type="linenumber">224</context></context-group>
</trans-unit>
<trans-unit id="_msg1063">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is a relative path</source>
- <context-group purpose="location"><context context-type="linenumber">223</context></context-group>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; does not exist</source>
+ <context-group purpose="location"><context context-type="linenumber">225</context></context-group>
</trans-unit>
<trans-unit id="_msg1064">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is not a directory</source>
- <context-group purpose="location"><context context-type="linenumber">224</context></context-group>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is a relative path</source>
+ <context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
<trans-unit id="_msg1065">
- <source xml:space="preserve">Specified blocks directory &quot;%s&quot; does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">225</context></context-group>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is not a directory</source>
+ <context-group purpose="location"><context context-type="linenumber">227</context></context-group>
</trans-unit>
<trans-unit id="_msg1066">
- <source xml:space="preserve">Starting network threads…</source>
- <context-group purpose="location"><context context-type="linenumber">226</context></context-group>
+ <source xml:space="preserve">Specified blocks directory &quot;%s&quot; does not exist.</source>
+ <context-group purpose="location"><context context-type="linenumber">228</context></context-group>
</trans-unit>
<trans-unit id="_msg1067">
- <source xml:space="preserve">The source code is available from %s.</source>
- <context-group purpose="location"><context context-type="linenumber">227</context></context-group>
+ <source xml:space="preserve">Starting network threads…</source>
+ <context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
<trans-unit id="_msg1068">
- <source xml:space="preserve">The specified config file %s does not exist</source>
- <context-group purpose="location"><context context-type="linenumber">228</context></context-group>
+ <source xml:space="preserve">The source code is available from %s.</source>
+ <context-group purpose="location"><context context-type="linenumber">230</context></context-group>
</trans-unit>
<trans-unit id="_msg1069">
- <source xml:space="preserve">The transaction amount is too small to pay the fee</source>
- <context-group purpose="location"><context context-type="linenumber">229</context></context-group>
+ <source xml:space="preserve">The specified config file %s does not exist</source>
+ <context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
<trans-unit id="_msg1070">
- <source xml:space="preserve">The wallet will avoid paying less than the minimum relay fee.</source>
- <context-group purpose="location"><context context-type="linenumber">230</context></context-group>
+ <source xml:space="preserve">The transaction amount is too small to pay the fee</source>
+ <context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
<trans-unit id="_msg1071">
- <source xml:space="preserve">This is experimental software.</source>
- <context-group purpose="location"><context context-type="linenumber">231</context></context-group>
+ <source xml:space="preserve">The wallet will avoid paying less than the minimum relay fee.</source>
+ <context-group purpose="location"><context context-type="linenumber">233</context></context-group>
</trans-unit>
<trans-unit id="_msg1072">
- <source xml:space="preserve">This is the minimum transaction fee you pay on every transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">232</context></context-group>
+ <source xml:space="preserve">This is experimental software.</source>
+ <context-group purpose="location"><context context-type="linenumber">234</context></context-group>
</trans-unit>
<trans-unit id="_msg1073">
- <source xml:space="preserve">This is the transaction fee you will pay if you send a transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">233</context></context-group>
+ <source xml:space="preserve">This is the minimum transaction fee you pay on every transaction.</source>
+ <context-group purpose="location"><context context-type="linenumber">235</context></context-group>
</trans-unit>
<trans-unit id="_msg1074">
- <source xml:space="preserve">Transaction amount too small</source>
- <context-group purpose="location"><context context-type="linenumber">234</context></context-group>
+ <source xml:space="preserve">This is the transaction fee you will pay if you send a transaction.</source>
+ <context-group purpose="location"><context context-type="linenumber">236</context></context-group>
</trans-unit>
<trans-unit id="_msg1075">
- <source xml:space="preserve">Transaction amounts must not be negative</source>
- <context-group purpose="location"><context context-type="linenumber">235</context></context-group>
+ <source xml:space="preserve">Transaction amount too small</source>
+ <context-group purpose="location"><context context-type="linenumber">237</context></context-group>
</trans-unit>
<trans-unit id="_msg1076">
- <source xml:space="preserve">Transaction change output index out of range</source>
- <context-group purpose="location"><context context-type="linenumber">236</context></context-group>
+ <source xml:space="preserve">Transaction amounts must not be negative</source>
+ <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
<trans-unit id="_msg1077">
- <source xml:space="preserve">Transaction has too long of a mempool chain</source>
- <context-group purpose="location"><context context-type="linenumber">237</context></context-group>
+ <source xml:space="preserve">Transaction change output index out of range</source>
+ <context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
<trans-unit id="_msg1078">
- <source xml:space="preserve">Transaction must have at least one recipient</source>
- <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
+ <source xml:space="preserve">Transaction has too long of a mempool chain</source>
+ <context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
<trans-unit id="_msg1079">
- <source xml:space="preserve">Transaction needs a change address, but we can&apos;t generate it.</source>
- <context-group purpose="location"><context context-type="linenumber">239</context></context-group>
+ <source xml:space="preserve">Transaction must have at least one recipient</source>
+ <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
<trans-unit id="_msg1080">
- <source xml:space="preserve">Transaction too large</source>
- <context-group purpose="location"><context context-type="linenumber">240</context></context-group>
+ <source xml:space="preserve">Transaction needs a change address, but we can&apos;t generate it.</source>
+ <context-group purpose="location"><context context-type="linenumber">242</context></context-group>
</trans-unit>
<trans-unit id="_msg1081">
- <source xml:space="preserve">Unable to bind to %s on this computer (bind returned error %s)</source>
- <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
+ <source xml:space="preserve">Transaction too large</source>
+ <context-group purpose="location"><context context-type="linenumber">243</context></context-group>
</trans-unit>
<trans-unit id="_msg1082">
- <source xml:space="preserve">Unable to bind to %s on this computer. %s is probably already running.</source>
- <context-group purpose="location"><context context-type="linenumber">242</context></context-group>
+ <source xml:space="preserve">Unable to bind to %s on this computer (bind returned error %s)</source>
+ <context-group purpose="location"><context context-type="linenumber">244</context></context-group>
</trans-unit>
<trans-unit id="_msg1083">
- <source xml:space="preserve">Unable to create the PID file &apos;%s&apos;: %s</source>
- <context-group purpose="location"><context context-type="linenumber">243</context></context-group>
+ <source xml:space="preserve">Unable to bind to %s on this computer. %s is probably already running.</source>
+ <context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
<trans-unit id="_msg1084">
- <source xml:space="preserve">Unable to generate initial keys</source>
- <context-group purpose="location"><context context-type="linenumber">244</context></context-group>
+ <source xml:space="preserve">Unable to create the PID file &apos;%s&apos;: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">246</context></context-group>
</trans-unit>
<trans-unit id="_msg1085">
- <source xml:space="preserve">Unable to generate keys</source>
- <context-group purpose="location"><context context-type="linenumber">245</context></context-group>
+ <source xml:space="preserve">Unable to generate initial keys</source>
+ <context-group purpose="location"><context context-type="linenumber">247</context></context-group>
</trans-unit>
<trans-unit id="_msg1086">
- <source xml:space="preserve">Unable to open %s for writing</source>
- <context-group purpose="location"><context context-type="linenumber">246</context></context-group>
+ <source xml:space="preserve">Unable to generate keys</source>
+ <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
<trans-unit id="_msg1087">
- <source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">247</context></context-group>
+ <source xml:space="preserve">Unable to open %s for writing</source>
+ <context-group purpose="location"><context context-type="linenumber">249</context></context-group>
</trans-unit>
<trans-unit id="_msg1088">
- <source xml:space="preserve">Unable to start HTTP server. See debug log for details.</source>
- <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
+ <source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
<trans-unit id="_msg1089">
- <source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
- <context-group purpose="location"><context context-type="linenumber">249</context></context-group>
+ <source xml:space="preserve">Unable to start HTTP server. See debug log for details.</source>
+ <context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
<trans-unit id="_msg1090">
- <source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
+ <source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
+ <context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
<trans-unit id="_msg1091">
- <source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">251</context></context-group>
+ <source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">253</context></context-group>
</trans-unit>
<trans-unit id="_msg1092">
- <source xml:space="preserve">Unknown network specified in -onlynet: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">252</context></context-group>
+ <source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
<trans-unit id="_msg1093">
- <source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
- <context-group purpose="location"><context context-type="linenumber">253</context></context-group>
+ <source xml:space="preserve">Unknown network specified in -onlynet: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">255</context></context-group>
</trans-unit>
<trans-unit id="_msg1094">
- <source xml:space="preserve">Unsupported logging category %s=%s.</source>
- <context-group purpose="location"><context context-type="linenumber">254</context></context-group>
+ <source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
+ <context-group purpose="location"><context context-type="linenumber">256</context></context-group>
</trans-unit>
<trans-unit id="_msg1095">
- <source xml:space="preserve">Upgrading UTXO database</source>
- <context-group purpose="location"><context context-type="linenumber">255</context></context-group>
+ <source xml:space="preserve">Unsupported logging category %s=%s.</source>
+ <context-group purpose="location"><context context-type="linenumber">257</context></context-group>
</trans-unit>
<trans-unit id="_msg1096">
- <source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
- <context-group purpose="location"><context context-type="linenumber">256</context></context-group>
+ <source xml:space="preserve">Upgrading UTXO database</source>
+ <context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
<trans-unit id="_msg1097">
- <source xml:space="preserve">Verifying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">257</context></context-group>
+ <source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
+ <context-group purpose="location"><context context-type="linenumber">259</context></context-group>
</trans-unit>
<trans-unit id="_msg1098">
- <source xml:space="preserve">Verifying wallet(s)…</source>
- <context-group purpose="location"><context context-type="linenumber">258</context></context-group>
+ <source xml:space="preserve">Verifying blocks…</source>
+ <context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
<trans-unit id="_msg1099">
+ <source xml:space="preserve">Verifying wallet(s)…</source>
+ <context-group purpose="location"><context context-type="linenumber">261</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1100">
<source xml:space="preserve">Wallet needed to be rewritten: restart %s to complete</source>
- <context-group purpose="location"><context context-type="linenumber">259</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">262</context></context-group>
</trans-unit>
</group>
</body></file>
diff --git a/src/test/fs_tests.cpp b/src/test/fs_tests.cpp
index 313064b294..5875f0218f 100644
--- a/src/test/fs_tests.cpp
+++ b/src/test/fs_tests.cpp
@@ -152,7 +152,7 @@ BOOST_AUTO_TEST_CASE(rename)
fs::remove(path2);
}
-#ifndef WIN32
+#ifndef __MINGW64__ // no symlinks on mingw
BOOST_AUTO_TEST_CASE(create_directories)
{
// Test fs::create_directories workaround.
@@ -174,6 +174,6 @@ BOOST_AUTO_TEST_CASE(create_directories)
fs::remove(symlink);
fs::remove(dir);
}
-#endif // WIN32
+#endif // __MINGW64__
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp
index 3699abb597..ba917dec2a 100644
--- a/src/test/fuzz/addrman.cpp
+++ b/src/test/fuzz/addrman.cpp
@@ -137,7 +137,7 @@ public:
* - vvNew entries refer to the same addresses
* - vvTried entries refer to the same addresses
*/
- bool operator==(const AddrManDeterministic& other)
+ bool operator==(const AddrManDeterministic& other) const
{
LOCK2(m_impl->cs, other.m_impl->cs);
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp
index 2514636d6e..f0c1b0d147 100644
--- a/src/test/fuzz/util.cpp
+++ b/src/test/fuzz/util.cpp
@@ -566,7 +566,7 @@ ssize_t FuzzedFileProvider::write(void* cookie, const char* buf, size_t size)
SetFuzzedErrNo(fuzzed_file->m_fuzzed_data_provider);
const ssize_t n = fuzzed_file->m_fuzzed_data_provider.ConsumeIntegralInRange<ssize_t>(0, size);
if (AdditionOverflow(fuzzed_file->m_offset, (int64_t)n)) {
- return fuzzed_file->m_fuzzed_data_provider.ConsumeBool() ? 0 : -1;
+ return 0;
}
fuzzed_file->m_offset += n;
return n;
diff --git a/src/test/serialize_tests.cpp b/src/test/serialize_tests.cpp
index 2441847f99..8c7c650cb1 100644
--- a/src/test/serialize_tests.cpp
+++ b/src/test/serialize_tests.cpp
@@ -38,13 +38,13 @@ public:
READWRITE(obj.txval);
}
- bool operator==(const CSerializeMethodsTestSingle& rhs)
+ bool operator==(const CSerializeMethodsTestSingle& rhs) const
{
- return intval == rhs.intval && \
- boolval == rhs.boolval && \
- stringval == rhs.stringval && \
- strcmp(charstrval, rhs.charstrval) == 0 && \
- *txval == *rhs.txval;
+ return intval == rhs.intval &&
+ boolval == rhs.boolval &&
+ stringval == rhs.stringval &&
+ strcmp(charstrval, rhs.charstrval) == 0 &&
+ *txval == *rhs.txval;
}
};
diff --git a/src/util/system.cpp b/src/util/system.cpp
index 69811a751b..aa9122106b 100644
--- a/src/util/system.cpp
+++ b/src/util/system.cpp
@@ -1342,18 +1342,6 @@ int GetNumCores()
return std::thread::hardware_concurrency();
}
-std::string CopyrightHolders(const std::string& strPrefix)
-{
- const auto copyright_devs = strprintf(_(COPYRIGHT_HOLDERS).translated, COPYRIGHT_HOLDERS_SUBSTITUTION);
- std::string strCopyrightHolders = strPrefix + copyright_devs;
-
- // Make sure Bitcoin Core copyright is not removed by accident
- if (copyright_devs.find("Bitcoin Core") == std::string::npos) {
- strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Core developers";
- }
- return strCopyrightHolders;
-}
-
// Obtain the application startup time (used for uptime calculation)
int64_t GetStartupTime()
{
diff --git a/src/util/system.h b/src/util/system.h
index a72ba3f3ed..f193c8ac0b 100644
--- a/src/util/system.h
+++ b/src/util/system.h
@@ -512,8 +512,6 @@ std::string HelpMessageOpt(const std::string& option, const std::string& message
*/
int GetNumCores();
-std::string CopyrightHolders(const std::string& strPrefix);
-
/**
* On platforms that support it, tell the kernel the calling thread is
* CPU-intensive and non-interactive. See SCHED_BATCH in sched(7) for details.
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index 6549a2146b..6cf9f9ce74 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -2693,6 +2693,10 @@ std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::stri
error = strprintf(_("Error loading %s: Wallet requires newer version of %s"), walletFile, PACKAGE_NAME);
return nullptr;
}
+ else if (nLoadWalletRet == DBErrors::EXTERNAL_SIGNER_SUPPORT_REQUIRED) {
+ error = strprintf(_("Error loading %s: External signer wallet being loaded without external signer support compiled"), walletFile);
+ return nullptr;
+ }
else if (nLoadWalletRet == DBErrors::NEED_REWRITE)
{
error = strprintf(_("Wallet needed to be rewritten: restart %s to complete"), PACKAGE_NAME);
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index c11d4b562d..2d88b07146 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -788,7 +788,7 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
#ifndef ENABLE_EXTERNAL_SIGNER
if (pwallet->IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
pwallet->WalletLogPrintf("Error: External signer wallet being loaded without external signer support compiled\n");
- return DBErrors::TOO_NEW;
+ return DBErrors::EXTERNAL_SIGNER_SUPPORT_REQUIRED;
}
#endif
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index 7d38832aa5..760019e76b 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -48,6 +48,7 @@ enum class DBErrors
CORRUPT,
NONCRITICAL_ERROR,
TOO_NEW,
+ EXTERNAL_SIGNER_SUPPORT_REQUIRED,
LOAD_FAIL,
NEED_REWRITE,
NEED_RESCAN
diff --git a/test/README.md b/test/README.md
index c9e15c4968..8fffde888d 100644
--- a/test/README.md
+++ b/test/README.md
@@ -98,7 +98,7 @@ test/functional/test_runner.py --extended
In order to run backwards compatibility tests, download the previous node binaries:
```
-test/get_previous_releases.py -b v0.20.1 v0.19.1 v0.18.1 v0.17.2 v0.16.3 v0.15.2
+test/get_previous_releases.py -b v22.0 v0.21.0 v0.20.1 v0.19.1 v0.18.1 v0.17.2 v0.16.3 v0.15.2
```
By default, up to 4 tests will be run in parallel by test_runner. To specify
diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py
index 14a4f8abb7..0fdefaa9c3 100755
--- a/test/functional/feature_addrman.py
+++ b/test/functional/feature_addrman.py
@@ -68,17 +68,16 @@ class AddrmanTest(BitcoinTestFramework):
self.start_node(0, extra_args=["-checkaddrman=1"])
assert_equal(self.nodes[0].getnodeaddresses(), [])
- self.log.info("Check that addrman from future cannot be read")
+ self.log.info("Check that addrman from future is overwritten with new addrman")
self.stop_node(0)
write_addrman(peers_dat, lowest_compatible=111)
- self.nodes[0].assert_start_raises_init_error(
- expected_msg=init_error(
- "Unsupported format of addrman database: 1. It is compatible with "
- "formats >=111, but the maximum supported by this version of "
- f"{self.config['environment']['PACKAGE_NAME']} is 4.: (.+)"
- ),
- match=ErrorMatch.FULL_REGEX,
- )
+ assert_equal(os.path.exists(peers_dat + ".bak"), False)
+ with self.nodes[0].assert_debug_log([
+ f'Creating new peers.dat because the file version was not compatible ("{peers_dat}"). Original backed up to peers.dat.bak',
+ ]):
+ self.start_node(0)
+ assert_equal(self.nodes[0].getnodeaddresses(), [])
+ assert_equal(os.path.exists(peers_dat + ".bak"), True)
self.log.info("Check that corrupt addrman cannot be read (EOF)")
self.stop_node(0)
diff --git a/test/functional/feature_backwards_compatibility.py b/test/functional/feature_backwards_compatibility.py
index 476a6a0c14..a7fb3184a6 100755
--- a/test/functional/feature_backwards_compatibility.py
+++ b/test/functional/feature_backwards_compatibility.py
@@ -34,15 +34,18 @@ from test_framework.util import (
class BackwardsCompatibilityTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
- self.num_nodes = 6
+ self.num_nodes = 9
# Add new version after each release:
self.extra_args = [
- ["-addresstype=bech32"], # Pre-release: use to mine blocks
- ["-nowallet", "-walletrbf=1", "-addresstype=bech32"], # Pre-release: use to receive coins, swap wallets, etc
- ["-nowallet", "-walletrbf=1", "-addresstype=bech32"], # v0.19.1
- ["-nowallet", "-walletrbf=1", "-addresstype=bech32"], # v0.18.1
- ["-nowallet", "-walletrbf=1", "-addresstype=bech32"], # v0.17.2
- ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-wallet=wallet.dat"], # v0.16.3
+ ["-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # Pre-release: use to mine blocks. noban for immediate tx relay
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # Pre-release: use to receive coins, swap wallets, etc
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # v22.0
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # v0.21.0
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # v0.20.1
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=noban@127.0.0.1"], # v0.19.1
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=127.0.0.1"], # v0.18.1
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=127.0.0.1"], # v0.17.2
+ ["-nowallet", "-walletrbf=1", "-addresstype=bech32", "-whitelist=127.0.0.1", "-wallet=wallet.dat"], # v0.16.3
]
self.wallet_names = [self.default_wallet_name]
@@ -54,6 +57,9 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
self.add_nodes(self.num_nodes, extra_args=self.extra_args, versions=[
None,
None,
+ 220000,
+ 210000,
+ 200100,
190100,
180100,
170200,
@@ -63,19 +69,27 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
self.start_nodes()
self.import_deterministic_coinbase_privkeys()
- def run_test(self):
- self.generatetoaddress(self.nodes[0], COINBASE_MATURITY + 1, self.nodes[0].getnewaddress())
-
- # Sanity check the test framework:
- res = self.nodes[self.num_nodes - 1].getblockchaininfo()
- assert_equal(res['blocks'], COINBASE_MATURITY + 1)
+ def nodes_wallet_dir(self, node):
+ if node.version < 170000:
+ return os.path.join(node.datadir, "regtest")
+ return os.path.join(node.datadir, "regtest/wallets")
- node_master = self.nodes[self.num_nodes - 5]
+ def run_test(self):
+ node_miner = self.nodes[0]
+ node_master = self.nodes[1]
node_v19 = self.nodes[self.num_nodes - 4]
node_v18 = self.nodes[self.num_nodes - 3]
node_v17 = self.nodes[self.num_nodes - 2]
node_v16 = self.nodes[self.num_nodes - 1]
+ legacy_nodes = self.nodes[2:]
+
+ self.generatetoaddress(node_miner, COINBASE_MATURITY + 1, node_miner.getnewaddress())
+
+ # Sanity check the test framework:
+ res = node_v16.getblockchaininfo()
+ assert_equal(res['blocks'], COINBASE_MATURITY + 1)
+
self.log.info("Test wallet backwards compatibility...")
# Create a number of wallets and open them in older versions:
@@ -88,21 +102,21 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
assert info['keypoolsize'] > 0
# Create a confirmed transaction, receiving coins
address = wallet.getnewaddress()
- self.nodes[0].sendtoaddress(address, 10)
+ node_miner.sendtoaddress(address, 10)
self.sync_mempools()
- self.generate(self.nodes[0], 1)
+ self.generate(node_miner, 1)
# Create a conflicting transaction using RBF
- return_address = self.nodes[0].getnewaddress()
- tx1_id = self.nodes[1].sendtoaddress(return_address, 1)
- tx2_id = self.nodes[1].bumpfee(tx1_id)["txid"]
+ return_address = node_miner.getnewaddress()
+ tx1_id = node_master.sendtoaddress(return_address, 1)
+ tx2_id = node_master.bumpfee(tx1_id)["txid"]
# Confirm the transaction
self.sync_mempools()
- self.generate(self.nodes[0], 1)
+ self.generate(node_miner, 1)
# Create another conflicting transaction using RBF
- tx3_id = self.nodes[1].sendtoaddress(return_address, 1)
- tx4_id = self.nodes[1].bumpfee(tx3_id)["txid"]
+ tx3_id = node_master.sendtoaddress(return_address, 1)
+ tx4_id = node_master.bumpfee(tx3_id)["txid"]
# Abandon transaction, but don't confirm
- self.nodes[1].abandontransaction(tx3_id)
+ node_master.abandontransaction(tx3_id)
# w1_v19: regular wallet, created with v0.19
node_v19.rpc.createwallet(wallet_name="w1_v19")
@@ -113,6 +127,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
# Use addmultisigaddress (see #18075)
address_18075 = wallet.rpc.addmultisigaddress(1, ["0296b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52", "037211a824f55b505228e4c3d5194c1fcfaa15a456abdf37f9b9d97a4040afc073"], "", "legacy")["address"]
assert wallet.getaddressinfo(address_18075)["solvable"]
+ node_v19.unloadwallet("w1_v19")
# w1_v18: regular wallet, created with v0.18
node_v18.rpc.createwallet(wallet_name="w1_v18")
@@ -130,20 +145,6 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
assert info['private_keys_enabled'] == False
assert info['keypoolsize'] == 0
- # w2_v19: wallet with private keys disabled, created with v0.19
- node_v19.rpc.createwallet(wallet_name="w2_v19", disable_private_keys=True)
- wallet = node_v19.get_wallet_rpc("w2_v19")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
-
- # w2_v18: wallet with private keys disabled, created with v0.18
- node_v18.rpc.createwallet(wallet_name="w2_v18", disable_private_keys=True)
- wallet = node_v18.get_wallet_rpc("w2_v18")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
-
# w3: blank wallet, created on master: update this
# test when default blank wallets can no longer be opened by older versions.
node_master.createwallet(wallet_name="w3", blank=True)
@@ -152,170 +153,72 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
assert info['private_keys_enabled']
assert info['keypoolsize'] == 0
- # w3_v19: blank wallet, created with v0.19
- node_v19.rpc.createwallet(wallet_name="w3_v19", blank=True)
- wallet = node_v19.get_wallet_rpc("w3_v19")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] == 0
-
- # w3_v18: blank wallet, created with v0.18
- node_v18.rpc.createwallet(wallet_name="w3_v18", blank=True)
- wallet = node_v18.get_wallet_rpc("w3_v18")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] == 0
-
- # Copy the wallets to older nodes:
+ # Unload wallets and copy to older nodes:
node_master_wallets_dir = os.path.join(node_master.datadir, "regtest/wallets")
node_v19_wallets_dir = os.path.join(node_v19.datadir, "regtest/wallets")
- node_v18_wallets_dir = os.path.join(node_v18.datadir, "regtest/wallets")
node_v17_wallets_dir = os.path.join(node_v17.datadir, "regtest/wallets")
node_v16_wallets_dir = os.path.join(node_v16.datadir, "regtest")
node_master.unloadwallet("w1")
node_master.unloadwallet("w2")
- node_v19.unloadwallet("w1_v19")
- node_v19.unloadwallet("w2_v19")
- node_v18.unloadwallet("w1_v18")
- node_v18.unloadwallet("w2_v18")
-
- # Copy wallets to v0.16
- for wallet in os.listdir(node_master_wallets_dir):
- shutil.copytree(
- os.path.join(node_master_wallets_dir, wallet),
- os.path.join(node_v16_wallets_dir, wallet)
- )
+ node_master.unloadwallet("w3")
- # Copy wallets to v0.17
- for wallet in os.listdir(node_master_wallets_dir):
- shutil.copytree(
- os.path.join(node_master_wallets_dir, wallet),
- os.path.join(node_v17_wallets_dir, wallet)
- )
- for wallet in os.listdir(node_v18_wallets_dir):
- shutil.copytree(
- os.path.join(node_v18_wallets_dir, wallet),
- os.path.join(node_v17_wallets_dir, wallet)
- )
-
- # Copy wallets to v0.18
- for wallet in os.listdir(node_master_wallets_dir):
- shutil.copytree(
- os.path.join(node_master_wallets_dir, wallet),
- os.path.join(node_v18_wallets_dir, wallet)
- )
-
- # Copy wallets to v0.19
- for wallet in os.listdir(node_master_wallets_dir):
- shutil.copytree(
- os.path.join(node_master_wallets_dir, wallet),
- os.path.join(node_v19_wallets_dir, wallet)
- )
+ for node in legacy_nodes:
+ # Copy wallets to previous version
+ for wallet in os.listdir(node_master_wallets_dir):
+ shutil.copytree(
+ os.path.join(node_master_wallets_dir, wallet),
+ os.path.join(self.nodes_wallet_dir(node), wallet)
+ )
if not self.options.descriptors:
# Descriptor wallets break compatibility, only run this test for legacy wallet
- # Open the wallets in v0.19
- node_v19.loadwallet("w1")
- wallet = node_v19.get_wallet_rpc("w1")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] > 0
- txs = wallet.listtransactions()
- assert_equal(len(txs), 5)
- assert_equal(txs[1]["txid"], tx1_id)
- assert_equal(txs[2]["walletconflicts"], [tx1_id])
- assert_equal(txs[1]["replaced_by_txid"], tx2_id)
- assert not(txs[1]["abandoned"])
- assert_equal(txs[1]["confirmations"], -1)
- assert_equal(txs[2]["blockindex"], 1)
- assert txs[3]["abandoned"]
- assert_equal(txs[4]["walletconflicts"], [tx3_id])
- assert_equal(txs[3]["replaced_by_txid"], tx4_id)
- assert not(hasattr(txs[3], "blockindex"))
-
- node_v19.loadwallet("w2")
- wallet = node_v19.get_wallet_rpc("w2")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
-
- node_v19.loadwallet("w3")
- wallet = node_v19.get_wallet_rpc("w3")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] == 0
-
- # Open the wallets in v0.18
- node_v18.loadwallet("w1")
- wallet = node_v18.get_wallet_rpc("w1")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] > 0
- txs = wallet.listtransactions()
- assert_equal(len(txs), 5)
- assert_equal(txs[1]["txid"], tx1_id)
- assert_equal(txs[2]["walletconflicts"], [tx1_id])
- assert_equal(txs[1]["replaced_by_txid"], tx2_id)
- assert not(txs[1]["abandoned"])
- assert_equal(txs[1]["confirmations"], -1)
- assert_equal(txs[2]["blockindex"], 1)
- assert txs[3]["abandoned"]
- assert_equal(txs[4]["walletconflicts"], [tx3_id])
- assert_equal(txs[3]["replaced_by_txid"], tx4_id)
- assert not(hasattr(txs[3], "blockindex"))
-
- node_v18.loadwallet("w2")
- wallet = node_v18.get_wallet_rpc("w2")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
-
- node_v18.loadwallet("w3")
- wallet = node_v18.get_wallet_rpc("w3")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] == 0
-
- node_v17.loadwallet("w1")
- wallet = node_v17.get_wallet_rpc("w1")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] > 0
-
- node_v17.loadwallet("w2")
- wallet = node_v17.get_wallet_rpc("w2")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
+ # Load modern wallet with older nodes
+ for node in legacy_nodes:
+ for wallet_name in ["w1", "w2", "w3"]:
+ if node.version < 170000:
+ # loadwallet was introduced in v0.17.0
+ continue
+ if node.version < 180000 and wallet_name == "w3":
+ # Blank wallets were introduced in v0.18.0. We test the loading error below.
+ continue
+ node.loadwallet(wallet_name)
+ wallet = node.get_wallet_rpc(wallet_name)
+ info = wallet.getwalletinfo()
+ if wallet_name == "w1":
+ assert info['private_keys_enabled'] == True
+ assert info['keypoolsize'] > 0
+ txs = wallet.listtransactions()
+ assert_equal(len(txs), 5)
+ assert_equal(txs[1]["txid"], tx1_id)
+ assert_equal(txs[2]["walletconflicts"], [tx1_id])
+ assert_equal(txs[1]["replaced_by_txid"], tx2_id)
+ assert not(txs[1]["abandoned"])
+ assert_equal(txs[1]["confirmations"], -1)
+ assert_equal(txs[2]["blockindex"], 1)
+ assert txs[3]["abandoned"]
+ assert_equal(txs[4]["walletconflicts"], [tx3_id])
+ assert_equal(txs[3]["replaced_by_txid"], tx4_id)
+ assert not(hasattr(txs[3], "blockindex"))
+ elif wallet_name == "w2":
+ assert(info['private_keys_enabled'] == False)
+ assert info['keypoolsize'] == 0
+ else:
+ assert(info['private_keys_enabled'] == True)
+ assert info['keypoolsize'] == 0
else:
- # Descriptor wallets appear to be corrupted wallets to old software
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v19.loadwallet, "w1")
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v19.loadwallet, "w2")
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v19.loadwallet, "w3")
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v18.loadwallet, "w1")
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v18.loadwallet, "w2")
- assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node_v18.loadwallet, "w3")
-
- # Open the wallets in v0.17
- node_v17.loadwallet("w1_v18")
- wallet = node_v17.get_wallet_rpc("w1_v18")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled']
- assert info['keypoolsize'] > 0
-
- node_v17.loadwallet("w2_v18")
- wallet = node_v17.get_wallet_rpc("w2_v18")
- info = wallet.getwalletinfo()
- assert info['private_keys_enabled'] == False
- assert info['keypoolsize'] == 0
+ for node in legacy_nodes:
+ # Descriptor wallets appear to be corrupted wallets to old software
+ # and loadwallet is introduced in v0.17.0
+ if node.version >= 170000 and node.version < 210000:
+ for wallet_name in ["w1", "w2", "w3"]:
+ assert_raises_rpc_error(-4, "Wallet file verification failed: wallet.dat corrupt, salvage failed", node.loadwallet, wallet_name)
# RPC loadwallet failure causes bitcoind to exit, in addition to the RPC
# call failure, so the following test won't work:
- # assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3_v18')
+ # assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3')
# Instead, we stop node and try to launch it with the wallet:
- self.stop_node(4)
- node_v17.assert_start_raises_init_error(["-wallet=w3_v18"], "Error: Error loading w3_v18: Wallet requires newer version of Bitcoin Core")
+ self.stop_node(node_v17.index)
if self.options.descriptors:
# Descriptor wallets appear to be corrupted wallets to old software
node_v17.assert_start_raises_init_error(["-wallet=w1"], "Error: wallet.dat corrupt, salvage failed")
@@ -323,23 +226,23 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
node_v17.assert_start_raises_init_error(["-wallet=w3"], "Error: wallet.dat corrupt, salvage failed")
else:
node_v17.assert_start_raises_init_error(["-wallet=w3"], "Error: Error loading w3: Wallet requires newer version of Bitcoin Core")
- self.start_node(4)
+ self.start_node(node_v17.index)
if not self.options.descriptors:
# Descriptor wallets break compatibility, only run this test for legacy wallets
# Open most recent wallet in v0.16 (no loadwallet RPC)
- self.restart_node(5, extra_args=["-wallet=w2"])
+ self.restart_node(node_v16.index, extra_args=["-wallet=w2"])
wallet = node_v16.get_wallet_rpc("w2")
info = wallet.getwalletinfo()
assert info['keypoolsize'] == 1
# Create upgrade wallet in v0.16
- self.restart_node(-1, extra_args=["-wallet=u1_v16"])
+ self.restart_node(node_v16.index, extra_args=["-wallet=u1_v16"])
wallet = node_v16.get_wallet_rpc("u1_v16")
v16_addr = wallet.getnewaddress('', "bech32")
v16_info = wallet.validateaddress(v16_addr)
v16_pubkey = v16_info['pubkey']
- self.stop_node(-1)
+ self.stop_node(node_v16.index)
self.log.info("Test wallet upgrade path...")
# u1: regular wallet, created with v0.17
@@ -371,7 +274,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
os.path.join(node_master_wallets_dir, "u1_v16"),
os.path.join(node_v16_wallets_dir, "wallets/u1_v16")
)
- self.start_node(-1, extra_args=["-wallet=u1_v16"])
+ self.start_node(node_v16.index, extra_args=["-wallet=u1_v16"])
wallet = node_v16.get_wallet_rpc("u1_v16")
info = wallet.validateaddress(v16_addr)
assert_equal(info, v16_info)
diff --git a/test/functional/feature_dirsymlinks.py b/test/functional/feature_dirsymlinks.py
index 85c8e27600..288754c04c 100755
--- a/test/functional/feature_dirsymlinks.py
+++ b/test/functional/feature_dirsymlinks.py
@@ -6,9 +6,8 @@
"""
import os
-import sys
-from test_framework.test_framework import BitcoinTestFramework, SkipTest
+from test_framework.test_framework import BitcoinTestFramework
def rename_and_link(*, from_name, to_name):
@@ -16,24 +15,27 @@ def rename_and_link(*, from_name, to_name):
os.symlink(to_name, from_name)
assert os.path.islink(from_name) and os.path.isdir(from_name)
-class SymlinkTest(BitcoinTestFramework):
- def skip_test_if_missing_module(self):
- if sys.platform == 'win32':
- raise SkipTest("Symlinks test skipped on Windows")
+class SymlinkTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
def run_test(self):
+ dir_new_blocks = self.nodes[0].chain_path / "new_blocks"
+ dir_new_chainstate = self.nodes[0].chain_path / "new_chainstate"
self.stop_node(0)
- rename_and_link(from_name=os.path.join(self.nodes[0].datadir, self.chain, "blocks"),
- to_name=os.path.join(self.nodes[0].datadir, self.chain, "newblocks"))
- rename_and_link(from_name=os.path.join(self.nodes[0].datadir, self.chain, "chainstate"),
- to_name=os.path.join(self.nodes[0].datadir, self.chain, "newchainstate"))
+ rename_and_link(
+ from_name=self.nodes[0].chain_path / "blocks",
+ to_name=dir_new_blocks,
+ )
+ rename_and_link(
+ from_name=self.nodes[0].chain_path / "chainstate",
+ to_name=dir_new_chainstate,
+ )
self.start_node(0)
-if __name__ == '__main__':
+if __name__ == "__main__":
SymlinkTest().main()
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
index 8f75255caf..ecdc3bf424 100755
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -447,11 +447,15 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
def get_bin_from_version(version, bin_name, bin_default):
if not version:
return bin_default
+ if version > 219999:
+ # Starting at client version 220000 the first two digits represent
+ # the major version, e.g. v22.0 instead of v0.22.0.
+ version *= 100
return os.path.join(
self.options.previous_releases_path,
re.sub(
- r'\.0$',
- '', # remove trailing .0 for point releases
+ r'\.0$' if version <= 219999 else r'(\.0){1,2}$',
+ '', # Remove trailing dot for point releases, after 22.0 also remove double trailing dot.
'v{}.{}.{}.{}'.format(
(version % 100000000) // 1000000,
(version % 1000000) // 10000,
@@ -473,7 +477,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
versions = [None] * num_nodes
if self.is_syscall_sandbox_compiled() and not self.disable_syscall_sandbox:
for i in range(len(extra_args)):
- if versions[i] is None or versions[i] >= 219900:
+ # The -sandbox argument is not present in the v22.0 release.
+ if versions[i] is None or versions[i] >= 229900:
extra_args[i] = extra_args[i] + ["-sandbox=log-and-abort"]
if binary is None:
binary = [get_bin_from_version(v, 'bitcoind', self.options.bitcoind) for v in versions]
diff --git a/test/get_previous_releases.py b/test/get_previous_releases.py
index 177aa74191..e0d48f8047 100755
--- a/test/get_previous_releases.py
+++ b/test/get_previous_releases.py
@@ -23,32 +23,27 @@ import hashlib
SHA256_SUMS = {
"d40f18b4e43c6e6370ef7db9131f584fbb137276ec2e3dba67a4b267f81cb644": "bitcoin-0.15.2-aarch64-linux-gnu.tar.gz",
"54fb877a148a6ad189a1e1ab1ff8b11181e58ff2aaf430da55b3fd46ae549a6b": "bitcoin-0.15.2-arm-linux-gnueabihf.tar.gz",
- "2b843506c3f1af0eeca5854a920264f9a829f02d0d50328005950ddcbe88874d": "bitcoin-0.15.2-i686-pc-linux-gnu.tar.gz",
"87e9340ff3d382d543b2b69112376077f0c8b4f7450d372e83b68f5a1e22b2df": "bitcoin-0.15.2-osx64.tar.gz",
"566be44190fd76daa01f13d428939dadfb8e3daacefc8fa17f433cad28f73bd5": "bitcoin-0.15.2-x86_64-linux-gnu.tar.gz",
#
"0768c6c15caffbaca6524824c9563b42c24f70633c681c2744649158aa3fd484": "bitcoin-0.16.3-aarch64-linux-gnu.tar.gz",
"fb2818069854a6ad20ea03b28b55dbd35d8b1f7d453e90b83eace5d0098a2a87": "bitcoin-0.16.3-arm-linux-gnueabihf.tar.gz",
- "75a537844313b0a84bdb61ffcdc5c4ce19a738f7ddf71007cd2edf664efd7c37": "bitcoin-0.16.3-i686-pc-linux-gnu.tar.gz",
"78c3bff3b619a19aed575961ea43cc9e142959218835cf51aede7f0b764fc25d": "bitcoin-0.16.3-osx64.tar.gz",
"5d422a9d544742bc0df12427383f9c2517433ce7b58cf672b9a9b17c2ef51e4f": "bitcoin-0.16.3-x86_64-linux-gnu.tar.gz",
#
"5a6b35d1a348a402f2d2d6ab5aed653a1a1f13bc63aaaf51605e3501b0733b7a": "bitcoin-0.17.2-aarch64-linux-gnu.tar.gz",
"d1913a5d19c8e8da4a67d1bd5205d03c8614dfd2e02bba2fe3087476643a729e": "bitcoin-0.17.2-arm-linux-gnueabihf.tar.gz",
- "d295fc93f39bbf0fd937b730a93184899a2eb6c3a6d53f3d857cbe77ef89b98c": "bitcoin-0.17.2-i686-pc-linux-gnu.tar.gz",
"a783ba20706dbfd5b47fbedf42165fce70fbbc7d78003305d964f6b3da14887f": "bitcoin-0.17.2-osx64.tar.gz",
"943f9362b9f11130177839116f48f809d83478b4c28591d486ee9a7e35179da6": "bitcoin-0.17.2-x86_64-linux-gnu.tar.gz",
#
"88f343af72803b851c7da13874cc5525026b0b55e63e1b5e1298390c4688adc6": "bitcoin-0.18.1-aarch64-linux-gnu.tar.gz",
"cc7d483e4b20c5dabd4dcaf304965214cf4934bcc029ca99cbc9af00d3771a1f": "bitcoin-0.18.1-arm-linux-gnueabihf.tar.gz",
- "989e847b3e95fc9fedc0b109cae1b4fa43348f2f712e187a118461876af9bd16": "bitcoin-0.18.1-i686-pc-linux-gnu.tar.gz",
"b7bbcee7a7540f711b171d6981f939ca8482005fde22689bc016596d80548bb1": "bitcoin-0.18.1-osx64.tar.gz",
"425ee5ec631ae8da71ebc1c3f5c0269c627cf459379b9b030f047107a28e3ef8": "bitcoin-0.18.1-riscv64-linux-gnu.tar.gz",
"600d1db5e751fa85903e935a01a74f5cc57e1e7473c15fd3e17ed21e202cfe5a": "bitcoin-0.18.1-x86_64-linux-gnu.tar.gz",
#
"3a80431717842672df682bdb619e66523b59541483297772a7969413be3502ff": "bitcoin-0.19.1-aarch64-linux-gnu.tar.gz",
"657f28213823d240dd3324d14829702f9ad6f0710f8bdd1c379cb3c447197f48": "bitcoin-0.19.1-arm-linux-gnueabihf.tar.gz",
- "10d1e53208aa7603022f4acc084a046299ab4ccf25fe01e81b3fb6f856772589": "bitcoin-0.19.1-i686-pc-linux-gnu.tar.gz",
"1ae1b87de26487075cd2fd22e0d4ead87d969bd55c44f2f1d873ecdc6147ebb3": "bitcoin-0.19.1-osx64.tar.gz",
"aa7a9563b48aa79252c8e7b6a41c07a5441bd9f14c5e4562cc72720ea6cb0ee5": "bitcoin-0.19.1-riscv64-linux-gnu.tar.gz",
"5fcac9416e486d4960e1a946145566350ca670f9aaba99de6542080851122e4c": "bitcoin-0.19.1-x86_64-linux-gnu.tar.gz",
@@ -56,9 +51,22 @@ SHA256_SUMS = {
"60c93e3462c303eb080be7cf623f1a7684b37fd47a018ad3848bc23e13c84e1c": "bitcoin-0.20.1-aarch64-linux-gnu.tar.gz",
"55b577e0fb306fb429d4be6c9316607753e8543e5946b542d75d876a2f08654c": "bitcoin-0.20.1-arm-linux-gnueabihf.tar.gz",
"b9024dde373ea7dad707363e07ec7e265383204127539ae0c234bff3a61da0d1": "bitcoin-0.20.1-osx64.tar.gz",
- "c378d4e21109f09e8829f3591e015c66632dff2925a60b64d259be05a334c30b": "bitcoin-0.20.1-osx.dmg",
"fa71cb52ee5e0459cbf5248cdec72df27995840c796f58b304607a1ed4c165af": "bitcoin-0.20.1-riscv64-linux-gnu.tar.gz",
"376194f06596ecfa40331167c39bc70c355f960280bd2a645fdbf18f66527397": "bitcoin-0.20.1-x86_64-linux-gnu.tar.gz",
+
+ "43416854330914992bbba2d0e9adf2a6fff4130be9af8ae2ef1186e743d9a3fe": "bitcoin-0.21.0-aarch64-linux-gnu.tar.gz",
+ "f028af308eda45a3c4c90f9332f96b075bf21e3495c945ebce48597151808176": "bitcoin-0.21.0-arm-linux-gnueabihf.tar.gz",
+ "695fb624fa6423f5da4f443b60763dd1d77488bfe5ef63760904a7b54e91298d": "bitcoin-0.21.0-osx64.tar.gz",
+ "f8b2adfeae021a672effbc7bd40d5c48d6b94e53b2dd660f787340bf1a52e4e9": "bitcoin-0.21.0-riscv64-linux-gnu.tar.gz",
+ "da7766775e3f9c98d7a9145429f2be8297c2672fe5b118fd3dc2411fb48e0032": "bitcoin-0.21.0-x86_64-linux-gnu.tar.gz",
+
+ "ac718fed08570a81b3587587872ad85a25173afa5f9fbbd0c03ba4d1714cfa3e": "bitcoin-22.0-aarch64-linux-gnu.tar.gz",
+ "b8713c6c5f03f5258b54e9f436e2ed6d85449aa24c2c9972f91963d413e86311": "bitcoin-22.0-arm-linux-gnueabihf.tar.gz",
+ "2744d199c3343b2d94faffdfb2c94d75a630ba27301a70e47b0ad30a7e0155e9": "bitcoin-22.0-osx64.tar.gz",
+ "2cca5f99007d060aca9d8c7cbd035dfe2f040dd8200b210ce32cdf858479f70d": "bitcoin-22.0-powerpc64-linux-gnu.tar.gz",
+ "91b1e012975c5a363b5b5fcc81b5b7495e86ff703ec8262d4b9afcfec633c30d": "bitcoin-22.0-powerpc64le-linux-gnu.tar.gz",
+ "9cc3a62c469fe57e11485fdd32c916f10ce7a2899299855a2e479256ff49ff3c": "bitcoin-22.0-riscv64-linux-gnu.tar.gz",
+ "59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16": "bitcoin-22.0-x86_64-linux-gnu.tar.gz",
}
diff --git a/test/lint/lint-format-strings.py b/test/lint/lint-format-strings.py
index 2870432bff..b814446125 100755
--- a/test/lint/lint-format-strings.py
+++ b/test/lint/lint-format-strings.py
@@ -16,14 +16,12 @@ FALSE_POSITIVES = [
("src/dbwrapper.cpp", "vsnprintf(p, limit - p, format, backup_ap)"),
("src/index/base.cpp", "FatalError(const char* fmt, const Args&... args)"),
("src/netbase.cpp", "LogConnectFailure(bool manual_connection, const char* fmt, const Args&... args)"),
- ("src/util/system.cpp", "strprintf(_(COPYRIGHT_HOLDERS).translated, COPYRIGHT_HOLDERS_SUBSTITUTION)"),
+ ("src/clientversion.cpp", "strprintf(_(COPYRIGHT_HOLDERS).translated, COPYRIGHT_HOLDERS_SUBSTITUTION)"),
("src/validationinterface.cpp", "LogPrint(BCLog::VALIDATION, fmt \"\\n\", __VA_ARGS__)"),
("src/wallet/wallet.h", "WalletLogPrintf(std::string fmt, Params... parameters)"),
("src/wallet/wallet.h", "LogPrintf((\"%s \" + fmt).c_str(), GetDisplayName(), parameters...)"),
("src/wallet/scriptpubkeyman.h", "WalletLogPrintf(std::string fmt, Params... parameters)"),
("src/wallet/scriptpubkeyman.h", "LogPrintf((\"%s \" + fmt).c_str(), m_storage.GetDisplayName(), parameters...)"),
- ("src/logging.h", "LogPrintf(const char* fmt, const Args&... args)"),
- ("src/wallet/scriptpubkeyman.h", "WalletLogPrintf(const std::string& fmt, const Params&... parameters)"),
]
diff --git a/test/sanitizer_suppressions/tsan b/test/sanitizer_suppressions/tsan
index 26f3fdc7af..3acf575d07 100644
--- a/test/sanitizer_suppressions/tsan
+++ b/test/sanitizer_suppressions/tsan
@@ -26,9 +26,6 @@ deadlock:src/qt/test/*
deadlock:libdb
race:libzmq
-# Race in headers only Boost Test
-race:std::__1::ios_base::flags
-
# Intermittent issues
# -------------------
#
@@ -42,4 +39,4 @@ race:CZMQAbstractPublishNotifier::SendZmqMessage
race:epoll_ctl
# https://github.com/bitcoin/bitcoin/issues/23366
-race:std::__1::ios_base::width
+race:std::__1::ios_base::*
diff --git a/test/sanitizer_suppressions/ubsan b/test/sanitizer_suppressions/ubsan
index bdaee5d191..b06dd253be 100644
--- a/test/sanitizer_suppressions/ubsan
+++ b/test/sanitizer_suppressions/ubsan
@@ -51,15 +51,11 @@ unsigned-integer-overflow:crypto/
unsigned-integer-overflow:hash.cpp
unsigned-integer-overflow:policy/fees.cpp
unsigned-integer-overflow:prevector.h
-unsigned-integer-overflow:pubkey.h
unsigned-integer-overflow:script/interpreter.cpp
unsigned-integer-overflow:txmempool.cpp
-unsigned-integer-overflow:util/strencodings.cpp
-implicit-integer-sign-change:bech32.cpp
implicit-integer-sign-change:compat/stdin.cpp
implicit-integer-sign-change:compressor.h
implicit-integer-sign-change:crypto/
-implicit-integer-sign-change:key.cpp
implicit-integer-sign-change:policy/fees.cpp
implicit-integer-sign-change:prevector.h
implicit-integer-sign-change:script/bitcoinconsensus.cpp